GAS スプレッドシートの内容をもとにGoogleフォームのリストボックスの内容をダイナミックに更新する。
やりたいこと
GAS スプレッドシートの内容をもとにGoogleフォームのリストボックスの内容をダイナミックに更新したい、という要望がありましたので方法について検討してみました。
やろうとしたけど出来なかった
フォームのonOpenトリガーを使って、開いたときに自動更新すればいいんじゃない。
と、簡単に考えたのですが出来ないみたいです。
理由はonOpenは回答時には実行されないようです。公式に記載がありました。
GAS 公式ドキュメント
https://developers.google.com/apps-script/guides/triggers/#onopene
結論
結果として私がたどりついた方法は、
フォームを更新するスクリプトを分ベースのタイマーで回すというものです。
(ちょっとダサい方法なので、他にベターな方法があれば教えていただけますとうれしいです。)
手順
1.スタンドアローンスクリプトを作成する
スタンドアローンスクリプトを作成します。フォームに紐づくスクリプトは時間ベーストリガーに対応していません。
2.コード書く
const formId = "フォームのid"
const stId = "シートのid"
function formUpdate(){
var form = FormApp.openById(formId)
//リストボックスタイプのフォームアイテムを取得する。
var items = form.getItems(FormApp.ItemType.LIST);
//対象のスプレッドシート開く
var st = SpreadsheetApp.openById(stId).getSheetByName("シート名");
var maxrow = st.getLastRow();
//①リストアイテムに追加したい列のデータを取得する。
var data = st.getRange(1, 10 , maxrow , 1).getValues();
//①で取得したデータは2次元配列なのでそのままリストアイテムに代入できないので1次元配列にする。
var listitems = [];
for (i = 0 ; i < data.length ; i ++ ){
listitems.push(data[i][0]);
}
//リストアイテムに追加する。
//リストボックスタイプのフォームアイテムがフォーム内に複数ある場合は、
//items[0]のインデックス番号を適切に変更してください。
items[0].asListItem().setChoiceValues(listitems);
}
3.トリガーを作成する
1分間隔でトリガーを設定します。
「現在のプロジェクトのトリガー」→ 「トリガーを追加」→「分ベースのタイマー」
4.おわり
参考にしました
Google Apps Script試行錯誤Blog
https://www.pre-practice.net/2019/09/google-formonopen.html
Google Apps Script試行錯誤Blog
https://www.pre-practice.net/2019/09/google-formonopen.html
Author And Source
この問題について(GAS スプレッドシートの内容をもとにGoogleフォームのリストボックスの内容をダイナミックに更新する。), 我々は、より多くの情報をここで見つけました https://qiita.com/jooji/items/ff8efc59be9de79823a7著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .