Google Apps Script(GAS)で、他のスプレッドシートから値を取ってこようとした際に、以下のようなエラーでかなりつまづいたので解決方法を覚え書き。
SpreadsheetApp.openById を呼び出す権限がありません。
その操作を実行するには承認が必要です。
調べてみるとSpreadsheetAppの他のメソッドでも同様のエラーが出るようで、
SpreadsheetApp.openByUrl(url);
SpreadsheetApp.create();
あたりもエラーになる様子。
原因
シンプルトリガーのonEdit(e)メソッド内で他のスプレッドシートの値を参照しようとしたのですが、どうやらシンプルトリガーで実行されるメソッドでは他のスプレッドシートを参照することはできないようです。
シンプルトリガーに関してのドキュメントはこちら。
https://developers.google.com/apps-script/guides/triggers
SimpleTriggersはonEdit(e)やonOpen(e)などの自動実行されるメソッドで、そうではないものがInstallableTriggersです。
InstallableTriggersについてのドキュメントはこちら。
https://developers.google.com/apps-script/guides/triggers/installable
そして、スクリプトからInstallableTriggersを登録した場合には、その登録したメソッド内で他のスプレッドシートを参照することができるようです。
(ここら辺の仕様がいまいち分かっていないですが、とりあえずこれでできました、という話をします。)
他のスプレッドシートの値を参照する方法
それでは本題の、他のスプレッドシートの値を参照する方法(SpreadsheetApp.openByIdを実行する方法)についてです。
まず、SpreadsheetApp.openByIdが入っているメソッド名がonEditになっている場合は、SimpleTriggersだと認識されてしまうので他の名前に変更してください。
今回は「onEditCell」とします。
function onEditCell(e){
// SpreadsheetAppを使って他のSpreadsheetを参照する処理
var ss = SpreadsheetApp.openById('SPREADSHEET_ID');
}
次に、適当なGASファイルに以下のメソッドを記述します。
function createEditTrigger() {
var ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger('onEditCell') // 先ほどのメソッド名を指定
.forSpreadsheet(ss)
.onEdit() // 変更時のトリガーに設定(目的に応じてonOpenなどに変更)
.create();
}
そして、このcreateEditTriggerメソッドを手動実行します。
メニューバーの下にある「関数を選択」の部分からcreateEditTriggerを選び、左の再生ボタンをクリック。
これでonEditCellメソッドが変更時のトリガーに設定されました。
createEditTriggerメソッドは一度だけ実行できればいいので、実行したら消してしまってOK。
この手順を行うことで、スプレッドシートのセルの値を変更した時にonEditCellメソッドが実行されるようになり、そのメソッド内のSpreadsheetApp.openByIdも正常に実行されるのを確認しました。
コメント