【解決】SpreadsheetApp.openById を呼び出す権限がありません。というエラー

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も正常に実行されるのを確認しました。

コメント