本記事では、
- Googleフォーム送信時に
- 「任意のスプレッドシートのセル」または「任意のスライドのシェイプ(テキストボックスなど)」に
- フォームの回答を自動転記する
方法を、実例(Googleフォームで作成したユーザー登録を送信した時、指定したスプレッドシートおよびスライドに自動転記)を用いて紹介します。

スプレッドシートに回答を転記

スライドに回答を転記


フォーム、スプレッドシート または スライドの準備
Googleフォームを開き、質問を追加します。
本記事では、以下のようなユーザー名・住所・電話番号・メールアドレスを登録するための「ユーザー登録フォーム」を用意しました。

続いてGoogleスプレッドシート または Googleスライドを立ち上げて、フォームの回答の転記先であるフォーマットを作成します。
本記事では、以下のような「ユーザー一覧フォーマット」を用意しました。


スライドに転記する場合は、転記先のシェイプにタイトルを付けよう
スライドに転記する場合、配置した各種シェイプ(テキストボックスなど)は、次のステップで要素を取得しやすいようにタイトルを付けておきます。以下のように、転記させたいシェイプを選択して右クリック → 「代替テキスト」→「高度なオプション」を選択すると、それぞれのシェイプにタイトルを追加することができます。

本記事では、以下のようにタイトルを追加しました。
- 「ユーザー名」を転記するテキストボックス → name
- 「住所」を転記するテキスト → address
- 「電話番号」を転記するテキスト → phone
- 「メールアドレス」を転記するテキスト → email
Apps Scriptを起動してコードを記述
続いてApps Scriptを起動します。
先ほど質問を追加したフォームを開き、右上の「・・・」→「スクリプトエディタ」をクリックします。

「コード.js」が開かれていると思うので、右側に以下のいずれかのコード(両方もOK)を記述します。
本実装では以下コードを記述し、「ユーザー登録」というタイトルを設定しました。
スプレッドシートに転記する場合
function onFormSubmitToSpreadSheet(e) {
  // 回答のデータを取得
  const itemResponses = e.response.getItemResponses();
  
  // 転記先のスプレッドシートとシートの指定
  const spreadsheetId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // 転記先のスプレッドシートのIDを記載
  const spreadsheet = SpreadsheetApp.openById(spreadsheetId); // 転記先のスプレッドシートを取得
  const sheet = spreadsheet.getSheetByName('シート1'); // 転記先シート名を記載して取得
  // 転記先のセルを指定
  const nameCell = sheet.getRange('B1');
  const addressCell = sheet.getRange('B2');
  const phoneCell = sheet.getRange('B3');
  const emailCell = sheet.getRange('B4');
  let questionTitle;
  let response;
  // 回答データを転記
  itemResponses.forEach(itemResponse => {
    questionTitle = itemResponse.getItem().getTitle();
    response = itemResponse.getResponse();
    
    switch (questionTitle) {
      case 'ユーザー名':
        nameCell.setValue(response);
        break;
      case '住所':
        addressCell.setValue(response);
        break;
      case '電話番号':
        phoneCell.setValue(response);
        break;
      case 'メールアドレス':
        emailCell.setValue(response);
        break;
    }
  });
}- フォームの回答を取得
- 
onFormSubmitToSpreadSheet関数に渡される引数eは、フォーム送信時に渡されるイベントオブジェクトです。e.response.getItemResponses()メソッドを使うことで各質問の回答リスト(配列)を取得できます。
- スプレッドシート情報の取得
- 
SpreadsheetApp.openById(spreadsheetId)で特定のスプレッドシートを取得できます。spreadsheetIdには取得したいスプレッドシートのIDを入力します。IDの確認は、取得したいスプレッドシートを開き、そのURLの以下赤字の部分です。https://docs.google.com/spreadsheets/d/この部分/edit
- スプレッドシートの転記先のセルを取得
- 
getRange()で指定したセルを取得でき、取得したセルに対しsetValue()で値をセットできます。
- フォームの回答をセルに転記
- 
itemResponse.getItem().getTitle()でフォームの質問タイトル(「ユーザー名」など)を取得でき、itemResponse.getResponse()でフォームの回答(「山田 太郎」など)を取得できます。質問タイトルに応じて、転記先のセルを条件分岐( Switch文)で指定しています。
スライドに転記する場合
function onFormSubmitToSlide(e) {
  // 回答のデータを取得
  const itemResponses = e.response.getItemResponses();
  
  // 転記先のスライドの指定
  const presentationId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // 転記先のスライドのIDを記載
  const presentation = SlidesApp.openById(presentationId); // 転記先のスライドを取得
  const firstSlide = presentation.getSlides()[0]; // 転記先の1枚目のスライドを取得
  // 転記先のテキストボックスを指定
  const shapes = firstSlide.getShapes(); // スライド内の図形をすべて取得
  const nameTextBox = shapes.find(s => s.getTitle() === "name"); // タイトルが「name」というシェイプを取得
  const addressTextBox = shapes.find(s => s.getTitle() === "address"); // タイトルが「address」というシェイプを取得
  const phoneTextBox = shapes.find(s => s.getTitle() === "phone"); // タイトルが「phone」というシェイプを取得
  const emailTextBox = shapes.find(s => s.getTitle() === "email"); // タイトルが「email」というシェイプを取得
  // 回答データを転記
  itemResponses.forEach(itemResponse => {
    var questionTitle = itemResponse.getItem().getTitle();
    var response = itemResponse.getResponse();
    
    switch (questionTitle) {
      case 'ユーザー名':
        nameTextBox.getText().setText(response);
        break;
      case '住所':
        addressTextBox.getText().setText(response);
        break;
      case '電話番号':
        phoneTextBox.getText().setText(response);
        break;
      case 'メールアドレス':
        emailTextBox.getText().setText(response);
        break;
    }
  });
}- フォームの回答を取得
- 
onFormSubmitToSpreadSheet関数に渡される引数eは、フォーム送信時に渡されるイベントオブジェクトです。e.response.getItemResponses()メソッドを使うことで各質問の回答リスト(配列)を取得できます。
- スライド情報の取得
- 
SlidesApp.openById(presentationId)で特定のスライドを取得できます。presentationIdには取得したいスライドのIDを入力します。IDの確認は、取得したいスライドを開き、そのURLの以下赤字の部分です。https://docs.google.com/presentation/d/この部分/edit
- スライドの転記先のシェイプを取得
- 
getShapes()で指定したスライド内のシェイプすべてを取得できます。取得したシェイプに対し、find(s => s.getTitle() === "name")で、nameというタイトルをもつシェイプを取得します。
- フォームの回答をシェイプに転記
- 
itemResponse.getItem().getTitle()でフォームの質問タイトル(「ユーザー名」など)を取得でき、itemResponse.getResponse()でフォームの回答(「山田 太郎」など)を取得できます。質問タイトルに応じて、転記先のシェイプを条件分岐( Switch文)で指定しています。

コードを記述できたら保存し、Apps Scriptは開いたまま次の「トリガー設定」に進みます。
トリガーを設定し、Googleアカウントと連携
最後にトリガー(先ほど記述した関数の発動タイミング)を設定し、Googleアカウントと連携させます。
Apps Script画面の左側にある「時計アイコン」 → 「+トリガーを追加」をクリックし、以下画面を表示させます。

- 実行する関数を選択 → フォーム送信時に実行したい関数を指定
- イベントのソースを選択 → 「フォームから」を指定
- イベントの種類を選択 → 「フォーム送信時」を指定
とし、保存をクリックします。このとき、Apps Scriptと連携するアカウントを選択する画面が表示されるので、以下画像の通り進めていきます。




以上で準備完了です。
以降、フォームを回答して送信するたびに、スプレッドシートまたはスライドに回答が転記されるようになります。
本記事の内容では、フォームを送信するたびに転記される回答が上書きされてしまいます。回答をすべて残しておくには、フォーム送信ごとにシートやスライドを新しく増やすなどの対応が必要です。適宜コードを修正してみてください。
