Googleフォームを使ったシステム。
AさんがフォームAから申請をして、その審査結果をBさんがフォームBから入力する。
それぞれGASはフォームの回答用スプレッドシートにバインド型で実装。
フォームAの回答用スプレッドシートが、どちらかと言えばマスタで、申請時に管理番号を発行してキーにしている。
フォームBの審査結果をフォームAの回答用スプレッドシートにセットする関数を、はじめは、フォームBの回答用スプレッドシートに書いていたんだけど、なんか違う気がして、フォームA側に実装して、ライブラリで公開しておき、フォームB側は、フォームA側の(ライブラリ)関数を呼ぶように変更した。
フォームA側にTPを作って実行すると上手く行ったので、フォームB側に実装して実行するとエラーになる。
あれ?
あちこちにログを吐くようにして、実行してみてやっと原因がわかった。
フォームBから実行すると、フォームBの回答用スプレッドシートを参照している。
ボクの想定では、フォームAの回答用スプレッドシートを参照するはずだった。
見つからないわけだ。
スプレッドシートオブジェクトを拾うのに、『SpreadsheetApp.getActiveSpreadsheet()』を使っていたせいで、動いているフォームB側のコンテクストになっていたからのよう。
『SpreadsheetApp.openById(シートのID)』に変えるとすんなり動いた。
確かに考えてみれば、動いているフォームB側がアクティブなスプレッドシートだよね。
自分だけで動くコードなら、getActiveSpreadsheet()でもopenById()でも変わらないけど、他から動かすことを考えるなら注意しないといけない。
--
No comments:
Post a Comment