GAS スプレッドシートの内容をもとにGoogleフォームのリストボックスの内容をダイナミックに更新する。


やりたいこと

GAS スプレッドシートの内容をもとにGoogleフォームのリストボックスの内容をダイナミックに更新したい、という要望がありましたので方法について検討してみました。

やろうとしたけど出来なかった

フォームのonOpenトリガーを使って、開いたときに自動更新すればいいんじゃない。
と、簡単に考えたのですが出来ないみたいです。
理由はonOpenは回答時には実行されないようです。公式に記載がありました。

GAS 公式ドキュメント
https://developers.google.com/apps-script/guides/triggers/#onopene

結論

結果として私がたどりついた方法は、
フォームを更新するスクリプトを分ベースのタイマーで回すというものです。
(ちょっとダサい方法なので、他にベターな方法があれば教えていただけますとうれしいです。)

手順

1.スタンドアローンスクリプトを作成する

スタンドアローンスクリプトを作成します。フォームに紐づくスクリプトは時間ベーストリガーに対応していません。

2.コード書く

GAS

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