【GAS】Googleフォームの回答をスプレッドシート・スライドへ自動転記する方法

Googleフォームの回答を指定したセルやスライドへ自動転記できますか?

はい。Google Apps Script(GAS)のフォーム送信トリガーを使えば、回答を決めたセルやスライドのテキストボックスへ自動転記できます。回答履歴を表として残すだけなら、Googleフォーム標準の回答先スプレッドシートを使う方が簡単です。

申込フォームの最新回答を名簿の固定欄へ表示したり、定型スライドへ反映したりしたい場合はGASが役立ちます。この記事では、質問名と転記先を検証し、設定ミスに気づきやすくしたコードを使います。

この記事のコードは、フォームを送信するたびに同じセルとテキストボックスを上書きします。
すべての回答履歴を残したい場合は、Googleフォーム標準の回答先スプレッドシートも併用してください。

目次

Googleフォームの回答を自動転記する仕組み

標準連携とGASの使い分け

Googleフォームには、回答を新規または既存のGoogleスプレッドシートへ保存する標準機能があります。回答を行単位で蓄積するだけならコードは不要です。設定方法はGoogleフォームの回答保存先に関する公式ヘルプで確認できます。

やりたいこと向いている方法
回答を1件ずつ表へ蓄積したいGoogleフォーム標準の回答先スプレッドシート
決めたセルへ最新回答を表示したいGASで固定セルへ転記
定型スライドへ回答を流し込みたいGASでテキストボックスへ転記

今回作るもの

「ユーザー名」「住所」「電話番号」「メールアドレス」の4項目を持つフォームを用意し、送信された最新回答をユーザー一覧シート、またはGoogleスライドの1枚目へ反映します。

ユーザー登録フォームへ4項目を入力した状態
フォームの回答を指定セルへ転記したGoogleスプレッドシート

指定セルへ最新回答を転記

フォームの回答をテキストボックスへ転記したGoogleスライド

定型スライドへ最新回答を転記

Googleフォームと転記先を準備

フォームに4つの質問を作る

Googleフォームへ次の質問を追加します。コードは質問タイトルを完全一致で探すため、表記も合わせてください。

  • ユーザー名
  • 住所
  • 電話番号
  • メールアドレス
ユーザー名、住所、電話番号、メールアドレスの質問を作ったGoogleフォーム

スプレッドシートの転記先を作る

固定セルへ転記する場合は、転記先ファイルに「ユーザー一覧」という名前のシートを作り、A1:A4へ質問名、B1:B4へ回答が入るレイアウトを用意します。

質問転記先
ユーザー名B1
住所B2
電話番号B3
メールアドレスB4
質問名と回答欄を用意したユーザー一覧シート

Googleスライドの転記先を作る

Googleスライドの1枚目に、4項目を表示するテキストボックスを配置します。本文では次のタイトルを使って転記先を識別します。

質問テキストボックスのタイトル
ユーザー名name
住所address
電話番号phone
メールアドレスemail
ユーザー情報を表示するテキストボックスを配置したGoogleスライド

テキストボックスへタイトルを付ける

  1. 1転記対象のテキストボックスを選択して右クリックします。
  2. 2「代替テキスト」から「高度なオプション」を開きます。
  3. 3「タイトル」欄へ name など、表に示した文字列を入力します。
  4. 4残りの3つのテキストボックスにも対応するタイトルを付けます。
Googleスライドのテキストボックスから代替テキスト設定を開く操作

タイトルは大文字と小文字を区別します。Apps Scriptでは getTitle() で代替テキストのタイトルを取得できます。現行仕様はShapeクラスの公式リファレンスで確認できます。

Apps Scriptを起動してコードを記述

フォームに紐づくスクリプトを開く

  1. 1作成したGoogleフォームを編集画面で開きます。
  2. 2右上のメニューから「スクリプト エディタ」を選択します。
  3. 3Code.gsへ、目的に合うコードを貼り付けます。
Googleフォームのメニューからスクリプトエディタを開く操作

このコードはフォームに紐づくApps Scriptと、フォーム用の送信トリガーを前提にしています。回答先スプレッドシートに紐づくスクリプトでは、送信イベントの中身が異なります。

スプレッドシートの固定セルへ転記するコード

XXXXXXXXXXXXXXXXXXXXを転記先スプレッドシートのファイルキーへ置き換えます。ファイルキーはスプレッドシートURLの /d//edit の間にある文字列です。

function sendFormToSheet(e) {
  if (!e || !e.response) {
    throw new Error('フォーム送信イベントから実行してください。');
  }

  const itemAnswers = e.response.getItemResponses();
  const answerMap = new Map();

  itemAnswers.forEach(function (itemAnswer) {
    const question = itemAnswer.getItem().getTitle();
    const rawAnswer = itemAnswer.getResponse();
    answerMap.set(question, String(rawAnswer || ''));
  });

  const questionNames = [
    'ユーザー名',
    '住所',
    '電話番号',
    'メールアドレス'
  ];
  const missingNames = questionNames.filter(function (question) {
    return !answerMap.has(question);
  });

  if (missingNames.length) {
    throw new Error('フォームの質問名がコードと一致しません。');
  }

  const bookKey = 'XXXXXXXXXXXXXXXXXXXX';
  const book = SpreadsheetApp.openById(bookKey);
  const sheet = book.getSheetByName('ユーザー一覧');

  if (!sheet) {
    throw new Error('ユーザー一覧シートが見つかりません。');
  }

  const outputValues = questionNames.map(function (question) {
    return [answerMap.get(question)];
  });

  sheet.getRange('B1:B4').setValues(outputValues);
  SpreadsheetApp.flush();
}

回答は質問の並び順ではなく、質問タイトルで対応付けます。そのため、フォーム上で質問の順番を入れ替えても、質問タイトルが同じなら転記先は変わりません。4セルを二次元配列にし、Rangeクラスの setValues()でまとめて書き込みます。

Googleスライドへ転記するコード

XXXXXXXXXXXXXXXXXXXXを転記先Googleスライドのファイルキーへ置き換えます。

function sendFormToDeck(e) {
  if (!e || !e.response) {
    throw new Error('フォーム送信イベントから実行してください。');
  }

  const itemAnswers = e.response.getItemResponses();
  const answerMap = new Map();

  itemAnswers.forEach(function (itemAnswer) {
    const question = itemAnswer.getItem().getTitle();
    const rawAnswer = itemAnswer.getResponse();
    answerMap.set(question, String(rawAnswer || ''));
  });

  const fieldPairs = [
    ['ユーザー名', 'name'],
    ['住所', 'address'],
    ['電話番号', 'phone'],
    ['メールアドレス', 'email']
  ];
  const missingNames = fieldPairs.filter(function (pair) {
    return !answerMap.has(pair[0]);
  });

  if (missingNames.length) {
    throw new Error('フォームの質問名がコードと一致しません。');
  }

  const presentationKey = 'XXXXXXXXXXXXXXXXXXXX';
  const deck = SlidesApp.openById(presentationKey);
  const pages = deck.getSlides();

  if (!pages.length) {
    throw new Error('転記先のスライドがありません。');
  }

  const shapes = pages[0].getShapes();

  fieldPairs.forEach(function (pair) {
    const box = shapes.find(function (shape) {
      return shape.getTitle() === pair[1];
    });

    if (!box) {
      throw new Error('タイトル「' + pair[1] + '」のテキストボックスが見つかりません。');
    }

    box.getText().setText(answerMap.get(pair[0]));
  });

  deck.saveAndClose();
}

フォームの回答を質問タイトルで対応付け、1枚目から nameaddressphoneemail のテキストボックスを探します。見つからない要素があれば、途中でエラーにして設定漏れを知らせます。

Googleスライドへの変更はスクリプト終了時にも保存されますが、コードでは saveAndClose() を呼んで変更を確定します。保存の仕組みはプレゼンテーション更新のライフサイクルで確認できます。

フォーム送信トリガーを設定

フォーム送信時のイベントを受け取るには、インストール型トリガーを作成します。関数名が onFormSubmit でなくても、トリガー画面で実行する関数を選べば動作します。

  1. STEP1
    トリガー追加画面を開く

    Apps Script画面の左側にある「トリガー」を開き、右下の「トリガーを追加」を選択します。

  2. STEP2
    実行する関数を選ぶ

    スプレッドシートへ転記する場合は sendFormToSheet、スライドへ転記する場合は sendFormToDeck を選びます。

  3. STEP3
    フォーム送信時を指定する

    イベントのソースを「フォームから」、イベントの種類を「フォーム送信時」にして保存します。

Apps Scriptでフォーム送信時トリガーを設定する画面

Google公式では、フォーム本体に紐づく送信トリガーのイベントは responseFormResponse を持つと説明されています。詳しくはイベントオブジェクトの公式ガイドFormResponseリファレンスを確認してください。

スプレッドシートとスライドの両方へ転記する場合は、sendFormToSheet用とsendFormToDeck用のトリガーを1件ずつ作成します。

初回認証とテスト送信

トリガーを作成するアカウントを確認

初回は、Googleフォーム、転記先スプレッドシート、またはGoogleスライドへのアクセス承認を求められます。自分で作成したスクリプトであることと、要求される権限が転記目的に合っていることを確認して承認します。

インストール型トリガーは、フォーム回答者ではなくトリガーを作成したアカウントの権限で実行されます。転記先を編集できるGoogleアカウントでトリガーを作成してください。制約と設定方法はインストール型トリガーの公式ガイドに掲載されています。

テスト回答を1件送信する

  1. 1転記先ファイルを複製し、コードのファイルキーを複製先へ変更します。
  2. 2Googleフォームのプレビューから4項目へテスト値を入力します。
  3. 3フォームを送信します。Apps Scriptエディタの「実行」ボタンは押しません。
  4. 4指定したセル、または4つのテキストボックスへ値が入ったか確認します。
  5. 5再度フォームを送信し、最新回答で上書きされることを確認します。

うまく転記できないとき

フォーム送信イベントから実行してくださいと出る

Apps Scriptエディタ上部の「実行」を押すと、フォーム送信イベントがないため e.response を取得できません。トリガーを設定し、フォームのプレビューから回答を送信してテストします。

フォームの質問名が一致しない

フォームの質問タイトルとコード内の「ユーザー名」「住所」「電話番号」「メールアドレス」を完全に一致させます。質問タイトルを変更した場合は、コード側も同時に直してください。

シートやテキストボックスが見つからない

シート名が「ユーザー一覧」になっているか、スライドのテキストボックスへ4つのタイトルを設定したか確認します。タイトルは大文字と小文字、前後の空白も含めて一致させます。

フォームを送っても何も起きない

Apps Scriptの「トリガー」で対象関数が登録されているか確認し、次に左メニューの「実行数」を開きます。トリガー実行の失敗はフォーム画面に表示されないため、エラー内容は実行履歴または失敗通知メールで確認します。

複数選択の回答を扱いたい

チェックボックスなどの回答は配列になる場合があります。このコードは String() で文字列へ変換するため、複数の値はカンマ区切りで転記されます。別の区切り文字や改行を使いたい場合は、質問の種類を確認して変換処理を調整してください。

回答履歴を残すときの考え方

この記事の固定セル・固定テキストボックス方式は、ダッシュボードや名札など「最新の1件」を表示する用途向けです。すべての回答を残す場合は、次のどちらかを選びます。

  • Googleフォーム標準の回答先スプレッドシートへ全件を蓄積する
  • 送信のたびに行、シート、またはスライドの複製を増やすコードへ拡張する

申込記録や顧客情報など、消失すると困る回答を固定セルへの転記だけで管理しないでください。まず標準の回答履歴を残し、GASによる転記を表示・帳票作成用として追加する構成が安全です。

まとめ

  • 回答を蓄積するだけならGoogleフォーム標準のスプレッドシート連携を使う
  • 固定セルや定型スライドへ反映するときにGASを使う
  • フォーム本体に紐づくインストール型の送信トリガーを設定する
  • 質問タイトルと転記先要素を検証してから書き込む
  • 複製した転記先でテストし、実行履歴も確認する

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次