🌽
【GAS】Googleフォームの回答取得から引数eの違いを理解、トリガー実行時のエラー解決方法
フォームの回答内容をメール送信したいだけなのにエラー
よくある実装はトリガーで実行したイベントの引数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