Help us understand the problem. What is going on with this article?

Googleフォームのプルダウンにスプレッドシートの内容を反映させる

More than 1 year has passed since last update.

備忘録としてメモします。

はじめに

Googleフォームのプルダウン内にスプレッドシートの内容を反映させたい要望があったので対応しました。
(手打ちでスプレッドシートの内容をGoogleフォームに入力するのって面倒ですよね、、、)

やったこと

スプレッドシート側で値の変更をして保存した場合、
今回作成したスクリプト(スプレッドシートの特定の列の内容をGoogleフォームのプルダウンに反映させる)が
実行される。

手順

①スプレッドシート側に適当にデータを入力する
②Googleフォーム側に適当に項目を追加する
③スクリプトを作成する
④実行する
⑤スプレッドシート側の値が変更されたら自動でスクリプトが実行されるように設定する

①スプレッドシート側に適当にデータを入力する

以下のように適当にデータを入力します。

DJs.png

②Googleフォーム側に適当に項目を追加する

以下のように適当に項目を追加しました。

DJアンケート.png

③スクリプトを作成する

①で作成したスプレッドシートを開き以下の手順でスクリプトエディタを開きます。
ツール>スクリプト エディタ
そして、
以下のコードをコピペして下さい。
(※スプレッドシートとGoogleフォームのIDは、自分のものに変更して下さい)

function overwriteDjList() {

  /**
  // スプレッドシートの情報を取得する
  // 
  **/

  //スプレッドシートのID →「https://docs.google.com/spreadsheets/d/△△△/edit#gid=0」の△△△を↓に記述
  var sheets = SpreadsheetApp.openById('△△△').getSheets();

  // シート1の情報を取得
  //(デフォルトのスプレッドシートの場合、シート1という名称になっています)
  var sheet = sheets[0];

  // スプレッドシートのA1のセルが「DJ」の場合
  if("DJ" == sheet.getRange("A1").getValue()){

    // A行の2行目からコンテンツをもつ最後の行までの値を配列で取得する
    var colA = sheet.getRange(2, 1, sheet.getLastRow() - 1).getValues();
  }

  /**
  // Googleフォームのプルダウン内の値を上書きする
  // 
  **/

  // GoogleフォームのIDを設定 →「https://docs.google.com/forms/d/〇〇〇/edit」の〇〇〇を↓に記述
  var form = FormApp.openById('〇〇〇');

  // 質問項目がプルダウンのもののみ取得
  var items = form.getItems(FormApp.ItemType.LIST);

  items.forEach(function(item){
    // 質問項目が「好きなDJを選択して下さい」を含むものに対して、スプレッドシートの内容を反映する
    if(item.getTitle().match(/好きなDJを選択して下さい.*$/)){
      var listItemQuestion = item.asListItem();
      var choices = [];

      colA.forEach(function(name){
        if(name != ""){
          choices.push(listItemQuestion.createChoice(name));
        }
      });

      // プルダウンの選択肢を上書きする
      listItemQuestion.setChoices(choices);
    }
  });

}

↓こんな感じ

コード.png

④実行する

実行.png

実行ボタンを押すと、
許可を求められる画面が出てくるかと思いますが、許可して下さい。

うまく実行できたら、
Googleフォーム画面を確認してみましょう。
下記のように、プルダウン内にスプレッドシートの内容が反映されていれば成功です。

DJsss.png

⑤スプレッドシート側の値が変更されたら自動でスクリプトが実行されるように設定する

スクリプトを作成したファイルを開きます。
以下のボタンを押してトリガーの設定を行います。

トリガー.png

その後以下のようにしてトリガーの設定を行って下さい。
・トリガーが設定されていません。今すぐ追加するにはここをクリックしてください。
をクリックする

・以下の通りに設定を行う
実行:
 "overwriteDjList"
イベント:
 "スプレッドシートから"
 "値の変更"

・保存

以上で、スプレッドシート側で値の変更をして保存した場合、
今回作成したスクリプト(スプレッドシートの特定の列の内容をGoogleフォームのプルダウンに反映させる)が実行されます。

おわり

ちなみに、僕はSteve Aokiが好きです。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away