Google フォームを開いたときに
スプレッドシートなどからデータを読み込んで
フォームの質問項目を可変にできないか考えた時にぶつかりました。
フォームを開いたときに実行する処理は onOpen ではできなそうだとわかったので備忘録として。
(2019/09/14現在)
Simple Triggers > onOpen(e) に書いてありました
https://developers.google.com/apps-script/guides/triggers/#onopene
The onOpen(e) trigger runs automatically when a user opens a spreadsheet, document, presentation, or form that they have permission to edit. (The trigger does not run when responding to a form, only when opening the form to edit it.) onOpen(e) is most commonly used to add custom menu items to Google Sheets, Slides, Docs, or Forms.
onOpen(e)トリガーは、ユーザーが編集権限のあるスプレッドシート、ドキュメント、プレゼンテーション、またはフォームを開くと自動的に実行されます。 (フォームに応答するときはトリガーを実行せず、フォームを開いて編集するときのみ。)onOpen(e)は、Googleスプレッドシート、スライド、ドキュメント、またはフォームにカスタムメニュー項目を追加するために最も一般的に使用されます。
つまり、編集権限のあるフォームを開いたときに実行されるので、回答するフォームを開いたときには実行されないということか。
「フォームを編集するエディタ画面」に対して onOpenは実行される
「回答するフォーム画面」に対して onOpenは実行されない
補足
できないとわかったところで、じゃあどうすればいいのかを考えてみる
質問の選択肢の値変更をフォームに反映するアイデア
アイデア1
トリガーで1分おきにシートの情報を見てフォームの項目を更新し続けようか?
- これは楽だけど無駄な処理が発生し続ける
アイデア2
開いたときではなく、送信したときに更新したらどう?
- フォームのトリガーには「onOpen」のほかに「onSubmit」がある
- onSubmitは「送信」ボタンが押されたことをトリガーに発動する
- 送信する度に選択肢の中身を変えたい場合に使えそう
- 早いものがちで選択肢が減っていくとかやりたい場合
アイデア3
スプレッドシートの特定の範囲が編集されたらフォームの項目を更新する?
- スプレッドシート側にonEditのトリガーを設定しておけばできそう
アイデア4
自動化は諦めて手動でスクリプトを実行する?
- 項目を変更するのが手動ならそのときにスクリプトも手動実行する
アイデア5
すなおにフォームのエディタを開いて手動で項目の値を変更する
- コードもトリガーも設定せずに手動でやっちゃう
- 変更する頻度が少なければこれでよさそう
参考
Simple Triggers > onOpen(e)
https://developers.google.com/apps-script/guides/triggers/#onopene