【コピペOK】Googleフォームのプルダウンをスプレッドシートの値で自動更新する方法を徹底解説

自動化事例

「Googleフォームで作成したアンケートや申請書、選択肢の更新が面倒…」
「担当者リストや商品マスタを更新するたびに、フォームも手作業で修正していて手間がかかる…」
このようなお悩みはありませんか?

Googleフォームのプルダウン(ドロップダウンリスト)は便利な機能ですが、選択肢の追加や削除が発生するたびに手動でメンテナンスするのは手間がかかり、更新漏れや入力ミスといったヒューマンエラーの原因にもなりがちです。

この記事では、Googleスプレッドシートのリストを、Googleフォームのプルダウン選択肢に自動で反映させる方法を、専門知識がない方でもコピペで実践できるよう、画像を交えて解説します。

少しだけ専門的なツール「Google Apps Script(GAS)」を使いますが、プログラミング経験は不要です。この記事の手順通りに進めるだけで、面倒な手作業から解放され、常に最新の状態でフォームを運用できるようになります。

今回実現することのイメージ

この記事で設定を行うと、以下のようにスプレッドシートの「部署リスト」を更新するだけで、Googleフォームのプルダウン選択肢が自動的に更新されるようになります。

完成イメージ

これにより、リストのメンテナンスはスプレッドシート側に集約され、フォームの更新作業は一切不要になります。

設定に必要なもの

  • Googleフォーム: アンケートや申請書として使用するもの。
  • Googleスプレッドシート: プルダウンの選択肢リストを管理するもの。

どちらもGoogleアカウントがあれば無料で利用できます。

STEP1: Googleフォームとスプレッドシートを準備する

まずは、自動連携させたいGoogleフォームと、選択肢のリストを管理しているGoogleスプレッドシートをお手元にご準備ください。

1. 連携するGoogleフォーム

今回は例として、「経費申請フォーム」にある「申請部署」というプルダウン項目を自動更新の対象とします。

フォームの選択肢編集画面

2. 選択肢リスト用のスプレッドシート

プルダウンに表示させたい選択肢のリストを管理しているスプレッドシートを準備します。
今回は例として、「部署マスタ」というファイル名のスプレッドシートを使用します。

ポイント:

  • A1セルに見出し(例: 部署名)、A2セル以降にプルダウンに表示したい選択肢が入力されている想定で解説を進めます。
  • ここで使用するのは、フォームの回答を記録するためのスプレッドシートとはの、選択肢リストを管理するためのスプレッドシートです。
部署名を追加した後

これで下準備は完了です。

STEP2: Google Apps Script (GAS) で連携コードを設定する

ここからは、フォームとスプレッドシートを連携させるためのプログラム「GAS」を設定していきます。コードを記述しますが、今回はコピー&ペーストして一部を書き換えるだけで完了しますので、ご安心ください。

1. スクリプトエディタを開く

まず、GoogleフォームからGASの編集画面(スクリプトエディタ)を開きます。

  1. Googleフォームの編集画面右上の「︙」(その他)アイコンをクリックします。
  2. 表示されたメニューから「Apps Script」を選択します。
スクリプト編集画面の開き方

すると、新しいタブでGASの編集画面が開きます。

GAS編集画面

2. コードをコピー&ペーストする

スクリプトエディタに最初から書かれている function myFunction() { … } というコードはすべて削除し、以下のコードをそのままコピーして貼り付けてください。

function setPulldownChoices() {
  // ----- 設定項目(ここから)-----

  // 1. 選択肢リストが記載されているスプレッドシートのID
  const SPREADSHEET_ID = 'ここにスプレッドシートIDを入力';
  
  // 2. 選択肢リストが記載されているシート名
  const SHEET_NAME = '部署リスト';
  
  // 3. 連携させたいGoogleフォームのID
  const FORM_ID = 'ここにフォームIDを入力';
  
  // 4. 連携させたいプルダウンの質問名(タイトル)
  const FORM_ITEM_TITLE = '申請部署';

  // ----- 設定項目(ここまで)-----


  // スプレッドシートから選択肢リストを取得
  const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);
  const lastRow = sheet.getLastRow();
  
  // 2行目から最終行までの値を取得(1行目は見出しのため除外)
  // もし1行目からリストが始まっている場合は getRange(1, 1, lastRow, 1) に変更してください
  const values = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
  
  // 取得した値から空白のものを除外
  const items = values.map(value => value[0]).filter(item => item !== '');

  // フォームのプルダウン項目を更新
  const form = FormApp.openById(FORM_ID);
  const formItems = form.getItems();
  let targetItem = null;

  for (let i = 0; i < formItems.length; i++) {
    if (formItems[i].getTitle() === FORM_ITEM_TITLE) {
      targetItem = formItems[i].asListItem();
      break;
    }
  }

  if (targetItem) {
    targetItem.setChoiceValues(items);
    Logger.log('プルダウンの更新が完了しました。');
  } else {
    Logger.log('対象の質問項目が見つかりませんでした。');
  }
}

3. IDなどを設定する

貼り付けたコードの上部にある「設定項目」の部分を、ご自身の環境に合わせて書き換えていきます。具体的には、‘ここに〇〇を入力’ となっている部分を2箇所修正します。

【重要】ここを正しく設定しないとエラーになります

① SPREADSHEET_ID の設定

選択肢リストを作成したスプレッドシートのIDを設定します。

スプレッドシートを開き、ブラウザのアドレスバーに表示されているURLを確認してください。
https://docs.google.com/spreadsheets/d/ここに表示されている長い文字列/edit
の部分がIDです。

コピーしたIDを、コード内の ‘ここにスプレッドシートIDを入力’ の部分に貼り付けます。

② FORM_ID の設定

次に、連携させたいGoogleフォームのIDを設定します。

フォームの編集画面を開き、スプレッドシートと同様にURLを確認します。
https://docs.google.com/forms/d/ここに表示されている長い文字列/edit
の部分がIDです。

コピーしたIDを、コード内の ‘ここにフォームIDを入力’ の部分に貼り付けます。

③ シート名と質問名の確認

コード内の SHEET_NAME と FORM_ITEM_TITLE が、ご自身で設定したシート名(今回は 部署リスト)、フォームの質問名(今回は 申請部署)と一致しているか確認してください。もし違う名前にしている場合は、コード側を修正してください。

設定後のコード例:

// 1. 選択肢リストが記載されているスプレッドシートのID
const SPREADSHEET_ID = '1aBcD_efGhIJKLMnoP-qrsTuvWXYZ1234567890'; // ← 修正箇所1: ご自身のスプレッドシートIDに書き換える

// 2. 選択肢リストが記載されているシート名
const SHEET_NAME = '部署リスト'; // ← 必要に応じてご自身のシート名に書き換える

// 3. 連携させたいGoogleフォームのID
const FORM_ID = '2bCdE_fgHiJkLmnOpQ-rstUvwXyzABCDEFGHIJKL'; // ← 修正箇所2: ご自身のフォームIDに書き換える

// 4. 連携させたいプルダウンの質問名(タイトル)
const FORM_ITEM_TITLE = '申請部署'; // ← 必要に応じてご自身の質問名に書き換える

4. スクリプトを保存して実行する

設定が完了したら、スクリプトを一度動かしてみましょう。

  1. スクリプトエディタの上部にあるフロッピーディスクのアイコン(プロジェクトを保存)をクリックして、変更を保存します。
  2. 保存アイコンの横にある「実行」ボタンをクリックします。
保存、実行ボタン

初回実行時の「権限の承認」について

初めてスクリプトを実行する際には、「権限の承認」を求める画面が表示されます。これは、作成したスクリプトがあなたのGoogleフォームやスプレッドシートにアクセスすることを許可するための、一度だけ必要な手続きです。
承認の手順について、詳しくはこちらの記事をご参照ください。

承認が完了すると、スクリプトが実行されます。下部に「実行ログ」が表示され、「プルダウンの更新が完了しました。」と表示されれば成功です。

5. フォームを確認する

Googleフォームの編集画面に戻り、右上の「プレビュー」(目のアイコン)をクリックして、フォームが実際にどのように表示されるか確認してみましょう。

「申請部署」のプルダウンをクリックすると、スプレッドシートに記載した部署名が選択肢として表示されていれば、正しく設定ができています。

フォーム設定完了画面

STEP3: 「トリガー」を設定して更新を完全自動化する

さて、ここまでの手順で、手動で「実行」ボタンを押せばフォームが更新されるようになりました。しかし、これではまだ「自動更新」とは言えません。

そこで、「トリガー」という機能を使って、定期的にこのスクリプトを自動で実行するように設定します。

  1. スクリプトエディタの左側メニューから、時計のアイコン「トリガー」をクリックします。
トリガー設定を選択
  1. 右下に表示される「トリガーを追加」ボタンをクリックします。
トリガーを追加を選択
  1. トリガーの設定画面が表示されるので、以下のように設定します。
    • 実行する関数を選択: setPulldownChoices (今回作成した関数名)
    • 実行するデプロイを選択: Head
    • イベントのソースを選択: 時間主導型
    • 時間ベースのトリガーのタイプを選択: 日付ベースのタイマーや時間ベースのタイマーを選択
    • 時刻を選択: リストの更新頻度に合わせて選択(例: 1時間おき、午前 8 時~9 時 など)

今回は、1時間ごとに自動更新されるように「時間ベースのタイマー」から「1時間おき」を選択してみます。

トリガー設定画面
  1. 設定が完了したら「保存」ボタンをクリックします。

これで、設定したタイミングでスクリプトが自動的に実行され、スプレッドシートのリストを常にチェックし、変更があればフォームのプルダウンに反映してくれるようになります。

【応用】コードの処理内容を解説

「コピペだけでなく、コードが何をしているのかも少し知りたい」という方向けに、今回のスクリプトの処理内容を簡単に解説します。

// スプレッドシートから選択肢リストを取得
const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);
const lastRow = sheet.getLastRow();
const values = sheet.getRange(2, 1, lastRow - 1, 1).getValues();

この部分では、設定したIDとシート名をもとにスプレッドシートを特定し、データを取得しています。getRange(2, 1, lastRow – 1, 1) は、「2行目・1列目から、(最終行 – 1)個の行、1個の列」の範囲を指定するという意味です。1行目を見出しとして除外するために、2行目から取得しています。

// 取得した値から空白のものを除外
const items = values.map(value => value[0]).filter(item => item !== '');

スプレッドシートから取得したデータは二次元配列という少し特殊な形式になっているため、map を使って扱いやすいシンプルな配列に変換しています。さらに、リストの途中に空白行があった場合でもエラーにならないよう、filter を使って空白の選択肢を取り除いています。

// フォームのプルダウン項目を更新
const form = FormApp.openById(FORM_ID);
const formItems = form.getItems();
let targetItem = null;

for (let i = 0; i < formItems.length; i++) {
  if (formItems[i].getTitle() === FORM_ITEM_TITLE) {
    targetItem = formItems[i].asListItem();
    break;
  }
}

ここでは、設定したフォームIDをもとにフォームを特定し、getItems() で全ての質問項目を取得しています。その後、for文(繰り返し処理)を使って、設定した質問名(FORM_ITEM_TITLE)と一致する項目を探し出しています。

if (targetItem) {
  targetItem.setChoiceValues(items);
  Logger.log('プルダウンの更新が完了しました。');
}

対象の質問項目が見つかった場合、setChoiceValues(items) という命令で、スプレッドシートから取得したリスト(items)を選択肢として上書き設定しています。

なぜ「時間主導型トリガー」なのか?

GASには、スプレッドシートが編集された瞬間にスクリプトを実行するonEditというトリガーもあります。リアルタイム性が高く便利ですが、複数人での共同編集時などに意図せず頻繁に実行されてしまう可能性があり、設定も少し複雑になります。

対して、今回使用した「時間主導型トリガー」は、設定が簡単で、決まった時間に確実に実行されるため、特にGAS初心者の方にはおすすめです。リストの更新頻度がそれほど高くない場合は、こちらのトリガーで十分対応できます。

まとめ:定型業務を自動化して、より価値のある仕事へ

今回は、Google Apps Script (GAS) を使って、スプレッドシートのリストをGoogleフォームのプルダウンに自動反映させる方法をご紹介しました。

【設定手順のまとめ】

  1. 準備: 連携させたいGoogleフォームと、選択肢リスト用のスプレッドシートを用意する。
  2. GAS設定: フォームからスクリプトエディタを開き、指定のコードを貼り付けて、IDなどを設定する。
  3. 自動化: トリガーを設定し、定期的にスクリプトが実行されるようにする。

一度設定してしまえば、あとはスプレッドシートのリストをメンテナンスするだけで、フォームは常に最新の状態が保たれます。これにより、面倒な手作業による更新業務から解放されるだけでなく、更新漏れなどのヒューマンエラーを防ぎ、フォーム運用の正確性を向上させることができます。

今回ご紹介したGASは、他にもGoogleの各種サービス(Gmail, カレンダー, ドキュメントなど)と連携して、様々な業務を自動化できる可能性を秘めています。

まずは第一歩として、今回のフォーム連携を試し、業務効率化のインパクトを実感してみてはいかがでしょうか。

※Googleサービスは、Google LLC の商標であり、この記事はGoogleによって承認されたり、Google と提携したりするものではありません。