LoginSignup
11
25

More than 3 years have passed since last update.

GASを用いてGoogleフォームのプルダウン内容をスプレッドシートから動的に生成する

Posted at

スプレッドシートを更新すると、Googleフォームのプルダウンも更新されてほしいということがあったので、Google Apps Script(GAS)を使って連携させてみました。

実現したいこととやること

実現したいこと

  1. スプレッドシートの内容とGoogleフォームのプルダウンの内容を同期させたい
  2. スプレッドシートを更新したら、自動的にGoogleフォームのプルダウンの項目が更新されていてほしい

やること

  1. Googleフォームの作成
  2. スプレッドシートの作成、プルダウンの中身の準備
  3. GASソースの準備
  4. トリガーの設定

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分程度でフォームのプルダウンの中身も自動で更新されます。

11
25
1

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
11
25