noah.plus

「create を呼び出す権限がありません」Google Apps Script

2018-09-16

FormとSpreadsheetを連携させようとしたとき、一番最初にハマったエラー。

エラー「〇〇 を呼び出す権限がありません」

以下の画像のように、FormAppとSpreadsheetAppの処理を同時に行おうとしたときにエラーが発生した。ちなみに FormApp.create() で新規フォームの作成、SpreadsheetApp.create() で新規スプレッドシートの作成をしようとしている。

situation

myFunction() を実行すると「承認が必要です」というメッセージが出て、プロジェクトに権限を与えるよう促される。

permission

権限を与えた後、関数が実行されると「create を呼び出す権限がありません」というエラーメッセージが表示される。

error

ファイル → プロジェクトのプロパティ → スコープ から、作業中のプロジェクトに与えられた権限が確認できる。よくよく確認してみると、スプレッドシートの権限が与えられていない。

scope

  • フォームの実行権限 → 取得成功

  • スプレッドシートの実行権限 → 取得失敗

2つの実行権限が必要なのに、1つしか取得できていない模様。

FormとSpreadsheet以外の組み合わせでも、複数の権限を同時に与えようとしたときに動作が不安定になる印象。この状態になると、いくらコードを書き換えても権限を求めるポップアップが再出現しないので、ひたすらエラーに悩み続けることになる。つらかった。

解決策

スプレッドシートの実行権限をゲットする。

そのためにプロジェクト内に新しくスクリプトファイルを作成し、新しいファイルでスプレッドシートの処理だけ実行してみる。

メニュー → 新規作成 → スクリプトファイル で新規スクリプトファイル作成。

new-script

新しく spreadsheet.gs を作成した。名前はなんでも可。

そこに関数 createSpreadsheet() を定義し、スプレッドシートの処理だけを書く。ちなみに関数名をデフォルトの myFunction() のままにしておくと、コード.gs にも定義されている myFunction() と名前がバッティングして予期せぬ動作が起こるので気をつけたい。

spreadsheet

狙い通り「承認が必要です」というポップアップが!

permission-again

なんだか物々しい警告が表示されるが、他人が書いたコードを動かすわけではないので大丈夫。「安全ではないページに移動」をクリックして承認を進める。

permission-again2

承認したあと再び ファイル → プロジェクトのプロパティ → スコープ からプロジェクトの権限を確認してみると、そこには spreadsheets の文字が。

scope-again

紆余曲折あったが、これで最初のコードがエラーなく動く。

retry

Google Drive にいって実行結果を確認すると、意図した通りにフォームとスプレッドシートのファイルが新しく生成されている。

success

Google Apps Script は権限の扱いがややこしいので、今回のエラーは原因の特定に苦労した。でも最終的になんとかなって良かった。


noah.plus