スプレッドシートを更新すると、Googleフォームのプルダウンも更新されてほしいということがあったので、Google Apps Script(GAS)を使って連携させてみました。
実現したいこととやること
実現したいこと
- スプレッドシートの内容とGoogleフォームのプルダウンの内容を同期させたい
- スプレッドシートを更新したら、自動的にGoogleフォームのプルダウンの項目が更新されていてほしい
やること
- Googleフォームの作成
- スプレッドシートの作成、プルダウンの中身の準備
- GASソースの準備
- トリガーの設定
Googleフォームの作成
とりあえず新規でGoogleフォームを起こし、1番目の質問項目をプルダウンに設定します。プルダウンのタイトルや中身は特に気にする必要はありません、デフォルトでOKです。
編集画面のURLからフォームIDをコピーしておきます。
スプレッドシートの作成、プルダウンの中身の準備
新規でスプレッドシートを起こし、A列に10個くらい適当に適当な値を入れます。文字でも数字でもなんでもOK。
スプレッドシートのURLから、シートIDをコピーしておきます。
GASソースの準備(サンプルソース)
Googleフォームの編集画面からスクリプトエディタを起動、ソース入力します。form_idとsheet_idは前項、前々項でコピーしたIDを入れればOKです。
この関数を実行すればGoogleフォームのプルダウンの中身が、スプレッドシートのA列に記載したものとなります。が、これだとスプレッドシートを更新したら、フォームも更新されるとは言えません。
function change_pulldown_list(){
//フォームIDからGoogleフォームを開き、質問事項を配列へ格納する
var form_id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var form = FormApp.openById(form_id);
var items = form.getItems();
var item = items[0];
//items[0]が1番目の質問事項アイテム、items[1]が2番目の質問事項アイテムといった具合
//シートIDからスプレッドシートを開き、最終行を取得する
var sheet_id = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
var ss = SpreadsheetApp.openById(sheet_id);
var sheet = ss.getSheetByName("シート1");
var last_row = sheet.getLastRow();
//スプレッドシートの先頭行から最終行までデータを読み込み、question_list配列に入れる
//今回はA列の先頭から読み取るため、getRangeの中身は深く考えていません
var question_list = sheet.getRange(1,1,last_row,1).getValues();
//question_list配列の中身をitem(=items[0]=1番目の質問事項アイテム)に反映させる
item.asListItem().setChoiceValues(question_list);
}
トリガーの設定
泥臭いやり方ですが、作成したスクリプトに対し時間主導型のトリガーを設定することで、疑似的にスプレッドシートとGoogleフォームの同期を行うことができます。新規トリガーを1分おきで設定すれば、実質的・疑似的にほぼ自動同期できているとみなせるかと思います。
この状態でスプレッドシートのA列を更新すると、1分程度でフォームのプルダウンの中身も自動で更新されます。