LoginSignup
1
2

More than 3 years have passed since last update.

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

Posted at

やりたいこと

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分間隔でトリガーを設定します。

「現在のプロジェクトのトリガー」→ 「トリガーを追加」→「分ベースのタイマー」
image.png

image.png

image.png

4.おわり

参考にしました

Google Apps Script試行錯誤Blog
https://www.pre-practice.net/2019/09/google-formonopen.html

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2