2018-09-16
FormとSpreadsheetを連携させようとしたとき、一番最初にハマったエラー。
以下の画像のように、FormAppとSpreadsheetAppの処理を同時に行おうとしたときにエラーが発生した。ちなみに FormApp.create()
で新規フォームの作成、SpreadsheetApp.create()
で新規スプレッドシートの作成をしようとしている。
myFunction()
を実行すると「承認が必要です」というメッセージが出て、プロジェクトに権限を与えるよう促される。
権限を与えた後、関数が実行されると「create を呼び出す権限がありません」というエラーメッセージが表示される。
ファイル → プロジェクトのプロパティ → スコープ
から、作業中のプロジェクトに与えられた権限が確認できる。よくよく確認してみると、スプレッドシートの権限が与えられていない。
フォームの実行権限 → 取得成功
スプレッドシートの実行権限 → 取得失敗
2つの実行権限が必要なのに、1つしか取得できていない模様。
FormとSpreadsheet以外の組み合わせでも、複数の権限を同時に与えようとしたときに動作が不安定になる印象。この状態になると、いくらコードを書き換えても権限を求めるポップアップが再出現しないので、ひたすらエラーに悩み続けることになる。つらかった。
スプレッドシートの実行権限をゲットする。
そのためにプロジェクト内に新しくスクリプトファイルを作成し、新しいファイルでスプレッドシートの処理だけ実行してみる。
メニュー → 新規作成 → スクリプトファイル
で新規スクリプトファイル作成。
新しく spreadsheet.gs
を作成した。名前はなんでも可。
そこに関数 createSpreadsheet()
を定義し、スプレッドシートの処理だけを書く。ちなみに関数名をデフォルトの myFunction()
のままにしておくと、コード.gs
にも定義されている myFunction()
と名前がバッティングして予期せぬ動作が起こるので気をつけたい。
狙い通り「承認が必要です」というポップアップが!
なんだか物々しい警告が表示されるが、他人が書いたコードを動かすわけではないので大丈夫。「安全ではないページに移動」をクリックして承認を進める。
承認したあと再び ファイル → プロジェクトのプロパティ → スコープ
からプロジェクトの権限を確認してみると、そこには spreadsheets の文字が。
紆余曲折あったが、これで最初のコードがエラーなく動く。
Google Drive にいって実行結果を確認すると、意図した通りにフォームとスプレッドシートのファイルが新しく生成されている。
Google Apps Script は権限の扱いがややこしいので、今回のエラーは原因の特定に苦労した。でも最終的になんとかなって良かった。