🌽

【GAS】Googleフォームの回答取得から引数eの違いを理解、トリガー実行時のエラー解決方法

2023/07/05に公開

フォームの回答内容をメール送信したいだけなのにエラー

よくある実装はトリガーで実行したイベントの引数eから回答を取得する方法です。
このイベントの引数eは、トリガーの設定をGoogleフォームスプレッドシートのどちらでしているかで、中身(プロパティ・メソッド)が異なっているので注意が必要です。

  • Googleフォーム
    e.response.getItemResponses()

  • スプレッドシート
    e.values e.namedValues

コピペしたコードだとこの違いに気づかず、エラーで大苦戦する方が少なくないです。

Googleフォームのトリガーで実行する場合


以下のようなコードで回答を取得できます。

function onFormSubmit1(e) {

  console.log(`フォーム名: ${e.source.getTitle()}`);
  // console.log(`フォーム説明: ${e.source.getDescription()}`);
  // console.log(`フォームID: ${e.source.getId()}`);

  const timestamp = e.response.getTimestamp();
  const date = Utilities.formatDate(timestamp, "JST", "yyyy/MM/dd HH:mm:ss");
  console.log(`回答日時: ${date}`);

  const itemResponses = e.response.getItemResponses();
  let message = "";
  for (const itemResponse of itemResponses) {
    const item = itemResponse.getItem();
    const title = item.getTitle();
    const helpText = item.getHelpText();
    const index = item.getIndex();
    const response = itemResponse.getResponse();
    // console.log(`●設問番号: ${index}`);
    // console.log(`タイトル: ${title}`);
    // console.log(`説明: ${helpText}`);
    // console.log(`回答: ${response}`);
    message += `${title}: ${response}\n\n`;
  }
  console.log("●回答結果");
  console.log(message);
}

Googleフォームのトリガーの場合、引数eのe.response.getItemResponses()でタイトル、回答などが取得できます。

スプレッドシートのトリガーで実行する場合

以下のようなコードで回答を取得できます。

function onFormSubmit2(e) {
  console.log(e.namedValues);
  console.log(`●タイムスタンプ: ${e.namedValues["タイムスタンプ"][0]}`);
    
  let message = "";
  for (const title of Object.keys(e.namedValues)) {
    const value = e.namedValues[title][0];
    // console.log(`タイトル: ${title}`);
    // console.log(`回答: ${value}`);
    message += `${title}: ${value}\n\n`;
  }

  console.log("●回答結果");
  console.log(message);

  // ↓設問順の回答が得られる
  // console.log(e.values);
}

スプレッドシートのトリガーの場合、引数eのe.namedValuesでタイトル、回答が取得できます。設問順で回答が欲しい場合はe.valuesでも得られます。

フォームの実装でエラーに陥り大苦戦する理由

  • 引数eがあるためスクリプトエディタから実行ができない
  • 引数eのプロパティ、メソッドがサジェスト(入力補完)がでない
  • 打ち間違えてもアラート表示がでないので気づかない
  • 実行ログを確認する方法を知らない

トリガーで実行した時のログ画面(実行履歴)の確認方法

スクリプトエディタから実行すると、画面下部に実行ログが表示されます。
引数eを使った実装では、スクリプトエディタから実行すると、引数eがundefinedでエラーになります。

TypeError: Cannot read properties of undefined (reading 'namedValues')

そのため、フォームから回答してトリガーでの実行が必要です。トリガーで実行した場合でも実行ログを確認することができます。スクリプトエディタの画面左の「実行数」から、実行履歴のページで実行ログが確認できます。

Discussion