【MACRO】Google Apps Script 質問スレ【DRIVE】
Google Apps Script でのプログラミング等に関する質問スレです
Excel や Access の VBA に不満のあるあなた
web アプリだけでなくクライアントアプリからも利用したいあなた
ローカルなデータベースやファイルだとバックアップに不安のあるあなた
ム板に無かったので立ててみます
Google Apps Script
ttps://developers.google.com/apps-script/
Google Drive API
ttps://developers.google.com/drive/
Getting Started with the Google Data Python Library
ttps://developers.google.com/gdata/articles/python_client_lib
■関連スレ
Google Maps API 質問箱
http://peace.2ch.net/test/read.cgi/tech/1131627583/
Microsoft SkyDrive API
http://peace.2ch.net/test/read.cgi/tech/1385604796/
【GoogleAppsScript】猿92【研究せよ!!!】
http://nozomi.2ch.net/test/read.cgi/php/1398600864/
GoogleAPIってどうよ?
http://nozomi.2ch.net/test/read.cgi/php/1018614427/
Google App Engine for Python 6アプ目
http://nozomi.2ch.net/test/read.cgi/php/1358570953/
Google App Engine for java
http://peace.2ch.net/test/read.cgi/tech/1317639323/
GoogleWebToolkit[GWT]について語ろう
http://nozomi.2ch.net/test/read.cgi/php/1147975874/ >>356
3行目は開いてるスプレッドシートに対してしか効かないとか。
試してないけど。
別に開かずとも変数sheetは取れてるだろうから、3行目は書かなくてもその後のやりたいことはできるのでは? >>361
もしくは、3行目を
SpreadsheetApp.setActiveSheet
じゃなくて
ss.setActiveSheet
ってできないかな? みなさんありがとうございました!
Var SS = SpreadsheetApp.openById("");
Var sheet = SS.getSheetByName("");
SpreadsheetApp.getActivesheet ();
でエラー出ずにやることができました GASでローカルのtxt、たとえばc:\\test.txtなんかをスプレッドシートに展開したいのだけれど
csvを展開するスクリプト(https://github.com/prog-mitsu/importCsv)
をいじくりまわしてもどうもうまくいかない
このスクリプトだと、フォームが表示されるのだけれど
フォームの表示なしで、固定のテキストファイル(たとえばc:\\test.txt)を展開することって
GASではむりなんかいな? ローカルのものをGoogleDriveにupするAPIはあるよ ローカルのものをGoogleDriveにupしたあと
それをGASで開くんだよ >>369
その、「ローカルのものをGoogleDriveにup」をフォームなどの表示なしに自動化したいのです >>370
デスクトップ版のGoogle Drive使って
自動同期でうpすれば? 半年ほど前にお世話になった者です
スプレッドシートでimportdata関数を使っていたんですが
Loading......が頻発するので、やはりGASで対処したいのです
データ取得までは出来てると思うのですが、シートに書き込む段階が全くおかしいようで・・
function fetchData(){
var response = UrlFetchApp.fetch("http://hesonogoma.com/stocks/data/japan-all-stock-prices");
var json = response.getContentText();
var kakaku = JSON.parse(json);
var range = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1, 1);
range.offset(0, 0, 6000, 26).clear();
for(var i=0; i<kakaku.length; i++) {
var event = kakaku[i];
range.offset(i+1,0).setValue(event);
}
}
正解か、参考になるサイトをご教授いただきたいのです
色んなサイトのコード切り貼りしすぎて、頭がおかしくなってきたw >>374
仕組みがよくわからないんですが、
ログにはデータ表示されるのでアクセスは出来ているはず・・・
・・もしかしてアクセス権というのは違法性の問題とかですか!?
すみません、だったら質問とりやめますが 色々やってみたら一応なんとかなりました
1年ちょいのモヤモヤが一気に解消して、いま涙目になってますウォォ
ありがとうございました! エラーのメールいっぱいくるからトリガー止めようと思っても保存押したらサーバーエラーになっちゃう "サービスで1日に使用しているコンピュータ時間が長すぎます”っていうエラー出るだけど
どういうエラーか分かりますか?
なにもいじってないのに昨晩から急に出るようになった 1日のMAXが累計1時間だっけか
処理回数が多いか、実行時間が長いんだろうな 1日止めて何も変えずトリガー元に戻しましたが、今のところ問題無し
数は減らしましたがペースは変えず Spreadsheetで行の非表示/表示はsheet.hideRow(rowIndex)/sheet.unhideRow(rowIndex)ですが、
ある行が非表示であるかどうかはどのように確認できますか? >>385
ありがとうございます。それってどのクラスから生えてますか?
一応、下のようになってみましたができませんでした。
sheet.getRange(1, 1).visible >>388
ありがとうございます。確かにそのページによるとサポートされてなさそうですね。
stackoverflowでいくつかの同様な質問を見つけましたが、できない的なことが書かれてました。
visibleの件ももう少し調べてみて、できそうになかったら諦めます。 var triggerUniqueId = ScriptApp.newTrigger("doPost2")
.timeBased()
.after(100)
.create()
.getUniqueId();
これを実行すると以下の3パターンの動作になるのだがなんとかならないかな?
・すぐにdoPost2に飛んでくる
・数秒〜数十秒後にdoPost2に飛んでくる
・どんだけ待とうがdoPost2に飛んでこない(何分か待ってれば飛んでくるのか?)
ちなみに飛んでこなかった場合は全てのトリガを削除してからやり直してる。 微妙に勘違いされそうな書き方だったので追記
doPost2に飛んできたときはその中でトリガを削除しているので
「飛んでこなかった場合は全てのトリガを削除してからやり直してる。」ということです。 100ms後にdoPost2に飛ばしたいってこと?
最終的になにがしたいかわからん
そのidでなにすんの? 目先の目的は「指定した時間後にdoPost2を実行したい」です。
100msが1秒になるにはまだ許容範囲ですが、
さすがに数十秒後やかなり待っても飛んでこないのはなにか設定がおかしいのかなと。 トリガーをつくるのではなく、Utilities.sleepじゃダメ? 大雑把に以下のような流れになるのでsleepでは無理っす。
1, PayPalからPOSTがくる
2, PayPalにHTTP 200を返す
3, PayPalにPOSTを投げる
https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNIntro/
function doPost(e) {
トリガ仕掛ける
HTTP 200を返す
}
function doPost2() {
POSTを投げる
}
いろいろ試したけど60秒とか大きな値ならそれっぽいタイミングでトリガがかかるみたい。
短すぎる設定時間はダメなのかなぁ。 トリガの指定って分単位だった気がする
内部的にcronだから
○時ちょうどにトリガー仕掛けたくて試したけど無理で、59分にしかけて00秒まで待つって実装にしたことがある
非同期処理ができないから難しいかも
秒数は一定じゃないから、1分後にトリガー設定しても最大1分59秒後になることもある
にしても面倒な仕様だなPaypal VBAのCall ステートメントは、Google Apps Scriptの場合どう記述すればいいですか? アクティブシートのカーソルがあるセル(アクティブセル)の行番号を、別のシート(setei)のB1へコピーしたいのですが、
うまく行きません。
5行目のvar copyValue〜の値をmsgBoxで出力すると、希望通りの値が出ているので、そこまでは合っていると思うのでが、
6行目で取得した行番号を、別のシートのB1に入れる所で躓いています。解決方法を教えて頂けないでしょうか?
function myFunction() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet_copyFrom = sheet.getActiveSheet();
var sheet_copyTo = sheet.getSheetByName('setei');
var copyValue = sheet_copyFrom.getActiveCell().getRow();
sheet_copyTo.getRange('B1').setValues(copyValue);
} 行番号をコピーするの?アクティブセルの値じゃなくて? sheet_copyTo.getRange('B1').setValue(copyValue); >>401-402
希望どうりのことができました。ありがとうございます!
スペルが間違っていたとは・・ 質問です。
スプレッドシートのシートを並び替えることはできますか?
セル範囲のデータならSORTでできることは知っているのですが、シートには使えませんよね。
日付がシート名になってて、それを昇順に並び替えしたいのです。
よろしくお願いします。 出来ないことはなだろうが面倒くさいし、丸投げならお断り。 IDかわりましたけど404です。
>>405
めんどくさい方法ですけど、一応自分で作ってはみました。
これよりいい方法があるのか、改めてお知恵をお貸しください。
var ss = SpreadsheetApp.openById(file.getId());
var sheets = ss.getSheets();
// シート名(yyyyMMdd形式)で昇順ソート
sheets.sort(function(a, b){
var aa = Number(a.getSheetName()) || a.getSheetName();
var bb = Number(b.getSheetName()) || b.getSheetName();
if (aa < bb) return -1;
if (aa > bb) return 1;
return 0;
});
// 別スプレッドシートにコピー
for (var n in sheets)
{
var sheet = sheets[n];
var sheetName = sheet.getSheetName();
sheet.copyTo(sortedSs).setName(sheetName);
}
同じスプレッドシートでの並べ替えを諦めて、別スプレッドシートにソート済みをコピーしたってだけのものです。 1.シート数を取得
2.全シート名を配列へ
3.配列をソート array.sort()
4.シートを移動 >>407
4. シートを移動
これができなくて悩んでたんですが
SpreadsheetオブジェクトにinsertSheetメソッドやmoveActiveSheetメソッドがありますね。
何とか実装できそうです。
ありがとうございました。 getValuesで取得した二次配列の、あるインデックス番号Ary[n][n]から、セル番号を取得するにはどうすれば良いでしょうか?
又、それはAPIを使わず、javaの配列処理の中で完結できるものなのでしょうか? gasなのかわからないですが、間違いならすみません。
フォームで@郵便番号を入れたら住所の一部を表記させたいのですが、できるのでしょうか?
A特定の数字をいれたら、外部からその数字に該当するデータを引っ張れるでしょうか?(社員コードいれなら社員名がでるイメージです)
誠にすみませんが、可能ならばご教授
おねがいします。
gasはさわったことないので、できそうならば、やってみたいとおもいます。 >>413
1.できます
2.できます
3.ajax >>414
おしえてくださいばっかりでもうしわけありませんが、本当に素人でして。
コードやら参考のURLでもありましたらおねがいします。 /**
* @return ライブラリ名
*/
とやっているのに返り値のメソッド補完が効きません…
何か間違っているでしょうか… >>418
コメント付けると補完が効くようになると聞きました 外部サイトで申し訳ないのですが、GASについて下記のサイトのチュートリアルを試していたのですが
ttps://tonari-it.com/gas-web-appli-spreadsheet-append/
真似をしてみても、エラー出てしまいます。
getActiveSheet を呼び出す権限がありません(行 2、ファイル「test2」、プロジェクト「HTMLページ表示」)
自分のコードが間違えたのかと、コードをコピペしたり、スクリプト認証を再度許可を出すために
現在とは別にファイルを作り直したりしたのですが、同じエラーが出てしまいます。
このエラーを回避するにはどうすれば良いでしょうか? すみません自己解決しました。
原因はスクリプトにプロジェクトのトリガーを設定していなかったことが原因だった様です。
公開済みのHTMLなのでアクセスすれば良いだけでなのに、なんでや!と思っていたのですが、
googleのwebアプリの場合、公開時にアサインされるHTMLへのリンクは、実はHTMLへのリンクではなく、
リンク > Ajax > .gs > html という流れらしく(たぶん)
3番目の.gsにトリガーが設定されてないとダメという感じの様です。なので.gsのトリガー設定した所動きました。
[設定したトリガー]
実行:doGet
イベント:スプレッドシートから・起動時に設定
このトリガー自体適当に設定したので、spreadsheetに紐付いた(コンテナバウンド)webアプリがこのトリガーで本当に良いのか?
.gsがスタンドアローンだったらどうするのか?などは自分の知識ではまだ不明です。
割と有名(みんなが引っかかる)ワナらしく、「GAS 実行する権限がありません」でググると色々出てきます。 すみませんが質問させてください。
現在、google appsのみで簡易ウェブアプリの制作を試みています。
構成は
htmlservice+gas+spredseet(DB)
です。
各種申請をweb化するのですが、アクセスしたユーザーのgmailアドレスもDBに格納します。
session.getactiveuser().getemailを利用するため、スクリプトの実行者は「アプリケーションアクセスしているユーザー」にしています。
そうすると、spreadsheetも全員に公開する必要がありますが、spreadsheetの中身は個人情報を少し含むため見られたくありません。
なにかいい方法はありますでしょうか、、、fusiontablesなどであればできるのでしょうか? ユーザーごとの情報はユーザープロパティに入れるべきでは? >>429
ご助言ありがとうございます。
propaties serviceについて調べた見ましたが、ユーザープロパティとして保存した場合、他のユーザーからは一切アクセスできないものと思いました。
一部のユーザー(システム管理を行う数名)に対しては、データの参照ができるようにしたいと思ったおります(申請されたデータを承認するようなワークフローアプリを検討しているため。後出して申し訳ありません) サイズが十分小さければスクリプトプロパティかな。
たしか500KBくらいまで。
あるいは、スプレッドシートにスクリプトを付属させるんじゃなく、
独立プロジェクトにして、openByIdとかopenByUrlとかは? >>431
ご助言ありがとうございます。
プロパティについては、思いの外データの種類が増えそうなため難しそうです。
スクリプトをスタンドアロンにして、openbyidがいいですかね、万一idがバレてしまった時のことが不安ですが、そういったことは起こらないと思っていい感じでしょうか。 for (var i = 1; i <= ss.getLastRow() ; i++){
ss.getRange(x,y).setFormula('=IMPORTHTML("https://www.yahoo.co.jp","table"1+i,');
}
for分の中で関数の最後の部分を1ずつ足していきたいのですが、セルに出力された際は「i」の部分は数字としては見てくれません。
1つずつ足していく方法はありますでしょうか。 >>433
ありがとうございます。
ライブラリ化するということでしょうか。
getEmailする部分を別アプリ(アプリにアクセスしているユーザー実行)にして、spreadsheet操作をするアプリはオーナーとして実行する感じでしょうか。
調べてみます。 >>432
>そういったことは起こらないと思っていい感じでしょうか
マーフィーの法則というのがあってだな
そういう起こって欲しくないことは起こるんだ 自己解決しました。
ss.getRange(x,y).setFormula('=IMPORTHTML("yahoo.co.jp","table",1+'+i+')'); googleドライブにアップしたエクセルxlsを自動でspreadsheetに変換するコードはありますか すべてのシートで文字の一括置換をしたいのだけど、セル毎に処理するしかないのかな? >>440
検索してなんとなくできそうなのでやってみます
ありがとうございました GAS単体でajaxのようなwebページをクローリングすることは可能ですか?
やっぱり外部を通さないと無理でしょうか スプレッドシートの制御をAndroidから行う方法をご教示頂けませんでしょうか。
内容としては複数列のソートを行いたいのです。
現状は列指定でソートをかけているのですが、列数が多く余分な時間がかかります。
PCからは実行できているのですが、同様の事がAndroid上から行えたらと思います。
実行用のトリガーがAndroidで使用できずに困っております。
現状トリガーは図形に対してスクリプト実行させていますが、タップしてもAndroidでは削除しか出てきません。 function onOpen()とmenuEntries.push使えば? https://script.google.com/dashboard/quota
↑にあるトリガーの合計実行時間や、URLFetch の呼び出し、URLFetch のデータの受信が
現在どのくらい使用されている分かるページは無いですか?
https://console.developers.google.com
GoogleドライブAPIなら↑でわかるのにそれ以外載って無くて… サーバー側でjqueryって使えますか?
WebスクレイピングのHTMLパーサとしてjqueryを使いたいのですが… >>447
npmでjQueryをinstall
webpackでbundle
node-google-apps-scriptでアップロード
って感じでいけないかな?
試してないのでできるか分からないけど Googleドライブにあるスプレッドシートを
JSONファイルを返すウェブアプリケーションとして使ってるんだが
JSONデータがブラウザにキャッシュされなくて困っている
cache-control:no-cache
pragma:no-cache
expires:Mon, 01 Jan 1990 00:00:00 GMT
というhttpヘッダを返してきてキャッシュさせてくれないんだが、
このヘッダを書き換える方法は無いか?
一ヵ月に1度、2度くらいしか更新されないデータだが、毎日頻繁に参照されるもので
データが1.4MBデカい為、変更されたときだけ読み込むようにヘッダを書き換えたい >>447
こないだ同じような用途でjsdomとjquery使ったわ。
たしかこんなかんじ
var JSDOM = require('jsdom').JSDOM;
JSDOM.fromUrl('https://example.com/').then(function(dom) {
var window = dom.window;
var jQuery = $ = require('jquery')(window);
// ここから$('ul#hoge > li.huga')とか普通に使えるはず
}); GASって「const 定数名 = 1;」 みたいな記述できない?
varしか無理? constはランタイムエラー
letは通る
だったような記憶 addMenuでスプレッドシートに追加する独自メニューを条件によって選択不可にすることはできますか?
通常のメニューと同じようにグレーアウトして選択できないようにしたいです。 1日1回、UrlFetchでページネイションされた数十ページを取得したいのですが
負荷軽減のため数秒は間隔を明けて取得したいです
settimeoutでエラーがでるのは、GASでは使えないということなのでしょうか?
出来ないとしたら代替方法の検索のヒントなどを教えていただきたいです GASってひょっとしてfor(let data of datas)みたいな構文は通らないのか? for each(let data in datas)は通った
GASまじか・・・