質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

5459閲覧

Googleフォームの自動返信メールを設問の回答選択肢によってメール本文を送り分ける

msug

総合スコア2

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2021/02/21 08:10

編集2021/02/22 04:30

前提・実現したいこと

google form を使用してイベントの参加の確認をしています。
スクリプトエディタを使用して、フォームに回答送信の完了後に「回答ありがとうございました」のメールを自動送信しています。
そのメールを、設問の回答内容によって本文を送り分けしたいと思っています。
イベントの参加を問う設問(ラジオボタン)の回答が 「はい」 か 「いいえ」 かで、自動送信メールの内容を変えたいと思っています。
現時点では、送り分けをせず回答後に「ありがとうございました」という、受付完了のメールを送っており、正常に機能しています。

発生している問題・エラーメッセージ

ifを使ってメールの本文の送り分けをするように書いてみましたが、メールが送信されません。
設問の回答の選択肢によって本文を変えるというifの部分が間違っているのだとは思っているのですが、
エラーメッセージが特に出てこず、何が問題かわかっていません。
以下のエラーメッセージは出ますが、これは今正常に送れているものでも出ているので、普通に回答送信してメールアドレスを入力していれば問題ないものだと思っているので、関係ないと解釈しています。

エラー TypeError: Cannot read property 'response' of undefined SendMail @ コード.gs:15

※追記 2021/02/22 13:28

TypeError: Assignment to constant variable. at SendMail(コード:45:11)

該当のソースコード

GAS

1function SendMail(e){ 2 3 const QuestionName = "お名前"; 4 let Name = ""; 5 6 const QuestionID = "ID"; 7 let ID = ""; 8 9 const QuestionCon = "ご自身の意思で研究に参加"; 10 11 //現在時刻を取得してyyyy/MM/dd HH:mm形式に変換 12 const timeStamp = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm'); 13 14 //回答者のメールアドレスを取得し、送信先に設定 15 const ToMailAddress = e.response.getRespondentEmail(); 16 17 //CCの設定(使用しない) 18 const CcMailAddress = ''; 19 20 //件名、本文 21 const Subject = '回答を受け付けました' + timeStamp; 22 const Body = ''; 23 24 25 const items = e.response.getItemResponses(); 26 27 for (let i = 0; i < items.length; i++) { 28 const item = items[i]; 29 const q = item.getItem().getTitle(); 30 const a = item.getResponse(); 31 32 //質問タイトルが「お名前」だったらNameに格納 33 if ( q === QuestionName ) { 34 Name = a; 35 } 36 37 //質問タイトルが「ID」だったらAppsに格納 38 if ( q === QuestionID ) { 39 ID = a; 40 } 41 42 //選択肢に応じて本文を変更 43 if ( q === QuestionCon ) { 44 if (a === "はい" ) { 45 Body += Name +'様\n\n' 46 +'ご回答ありがとうございます。\n以下の内容に誤りがないか今一度ご確認ください。\n\n' 47 +'--------------------------------------------------------\n' 48 +'■お名前\n' 49 + Name + '\n' 50 +'■ID\n' 51 + ID + '\n' 52 +'--------------------------------------------------------\n\n' 53 +'IDやお名前に誤りがあった場合は再度回答をやり直すか、以下にご連絡ください。\n\n' 54 +'担当\n' 55 +'xxxxxxx@xxxx.co.jp\n\n' 56 +'※このメールは送信専用のメールアドレスから配信されています。\n' 57 +'ご返信いただいてもお答えできませんのでご了承ください。\n\n'; 58 } else if ( a === "いいえ" ) { 59 Body += Name +'様\n\n' 60 +'ご回答ありがとうございます。\n以下の回答内容に誤りがないか今一度ご確認ください。\n\n' 61 +'--------------------------------------------------------\n' 62 +'■「イベント名イベント名イベント名」にご参加いただけますか?' 63 +'参加しません。\n' 64 +'--------------------------------------------------------\n\n' 65 +'内容に誤りがあった場合は再度回答をやり直してください。\n\n' 66 +'※このメールは送信専用のメールアドレスから配信されています。\n' 67 +'ご返信いただいてもお答えできませんのでご了承ください。\n\n'; 68 } 69 } 70 } 71 72 //メールを送信 73 GmailApp.sendEmail(ToMailAddress, Subject, Body, {cc:CcMailAddress, noReply:true}); 74}

試したこと

ラジオボタンの選択肢の値のデータ型が違うのかと思いましたが、調べたところ文字列ということだったので、これも違うのかなと思っています。
a === "いいえ"a == "いいえ"にしてみたりしたのですが、これも特になんの意味もなかったです。

補足情報(FW/ツールのバージョンなど)

エンジニアではなくただの素人なので、この質問に回答していただくために必要な情報がなにか不足しておりましたらご指摘いただければ幸いです。
助けてください。
どうぞよろしくお願いいたします。

※追記 2021/02/21 19:45
「実行数」のところを確認してみましたが、
スクリプトエディタで実行した際には上記のメールアドレス取得のエラーが出るのですが、普通にフォームで回答を送信してテストしてみると、何もエラーが出ませんでした。メールは届きません。
指定した条件に合致してないのでメールが送信されていないような挙動のように感じています。。。
ラジオボタンの選択肢は「はい」と「いいえ」しかなく、必須にもしているので、確実に回答しているのですが、、、

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawa

2021/02/21 08:51

エラーがでなければ少なくともメールは飛ぶはずなので、なんらかのエラーが残ってるはずです。 スクリプトエディタの左側の「実行数」を開くと、トリーがで起動になった過去の実行履歴も見れるので、そこで多分「失敗」となってるかと思います。その中にエラー内容が表示されてませんか?
msug

2021/02/21 10:44

ご回答ありがとうございます。 「実行数」のところを確認してみましたが、 スクリプトエディタで実行した際には上記のメールアドレス取得のエラーが出るのですが、普通にフォームで回答を送信してテストしてみると、何もエラーが出ませんでした。メールは届きません。 指定した条件に合致してないのでメールが送信されていないような挙動のように感じています。。。 ラジオボタンの選択肢は「はい」と「いいえ」しかなく、必須にもしているので、確実に回答しているのですが、、、
sawa

2021/02/21 12:27 編集

うーん、それは変ですね。トリガーで実行された痕跡は残ってますか? エラーがなくても実行された痕跡は実行数のところに残りますが、それは存在して完了となってますか? もし何ものこってないのであれば、トリガー自体が動いてない可能性があります。 今回の変更のタイミングで今の関数名(SendMail)に変えたとかは? 一応コード上のミスはたぶんここだってのはわかりますが、実行のログが残らないのであれば別の問題もあるかと思います。
msug

2021/02/22 00:46 編集

ありがとうございます。フォームに回答を送信した結果は実行数のところに「完了」も「失敗しました」も何もなく、痕跡がありませんでした!トリガー自体が動いてないのですね。 関数名は何も変えてないです。 今機能している自動送信のコードはこちらです↓ ``` function SendMail(e){ const QuestionName = 'お名前'; let Name = ""; const QuestionID = 'ID'; let ID = ""; //★現在時刻を取得してyyyy/MM/dd HH:mm形式に変換 const timeStamp = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm'); //回答者のメールアドレスを取得し、送信先に設定 const ToMailAddress = e.response.getRespondentEmail(); //CCの設定(使用しない) const CcMailAddress = ''; //質問と回答をすべて取得する場合に使用 const items = e.response.getItemResponses(); let qa = ''; for (let i = 0; i < items.length; i++) { const item = items[i]; const q = item.getItem().getTitle(); const a = item.getResponse(); qa += '■' + q + ':\n ' + a + '\n\n'; //★質問タイトルが「お名前」だったらNameに格納 if ( q === QuestionName ) { Name = a; } //★質問タイトルが「ID」だったらAppsに格納 if ( q === QuestionID ) { ID = a; } } //本文 const Body = Name +'様\n\n' +'ご回答ありがとうございます。\n以下の内容に誤りがないか今一度ご確認ください。\n\n' +'--------------------------------------------------------\n' +'■お名前\n' + Name + '\n' +'■ID\n' + ID + '\n' +'--------------------------------------------------------\n\n' +'IDやお名前に誤りがあった場合は再度回答をやり直すか、以下にご連絡ください。\n\n' +'担当\n' +'xxxxxxx@xxxx.co.jp\n\n' +'※このメールは送信専用のメールアドレスから配信されています。\n' +'ご返信いただいてもお答えできませんのでご了承ください。\n\n'; //件名 const Subject = '回答を受け付けました' +'【' + Name + '(' + ID + ')】'+ timeStamp; //メールを送信 GmailApp.sendEmail(ToMailAddress, Subject, Body, {cc:CcMailAddress, noReply:true}); } ```
sawa

2021/02/22 02:04

一応確認ですが、 ・新しいコードはトリガーのセットをしてるのですよね? ・新しいコードは返信に記載いただいた「今動いているコード」とは別のフォーム(コピーしたもの?)で作成しているのですよね?
msug

2021/02/22 04:27

大変申し訳ございません!トリガーが動いてないどころかセットができていませんでした。。無駄な手間をすみませんでした。 トリガーをセットしなおして、ログがみれました。 エラーの内容は以下です。 TypeError: Assignment to constant variable. at SendMail(コード:45:11) どうぞよろしくお願いいたします。
guest

回答1

1

ベストアンサー

ここまでくれば、あとはエラーの対処です。
検索すれば意味が分かるものですが、要は const で宣言しちゃいけないものに constを使ってる部分がエラーになってます。

今回の場合は、 ifの分岐で Body の内容を変えてる(再代入してる)ので、Bodyを宣言する際に、再代入がNGな constではなく、letあたりを使いましょう。(NameやIDも let 使ってますよね)

そこだけ直せば動くと思います。

GAS

1let Body = '';

修正・追記

Bodyの中で NameやID を使ってましたね。失礼しました。
そしたら上記はやめて他の変数と同じように、参加の可否を select に入れるように宣言しておいて、

GAS

1 const QuestionCon = "ご自身の意思で研究に参加"; 2 let select ="";

forループ内では 参加の可否の回答を格納するところまで記載

GAS

1 //質問タイトルが「ご自身の意思で研究に参加」だったらselectに格納 2 if ( q === QuestionID ) { 3 select = a; 4 }

forループを抜けた後に、 if(a=== の Bodyの分岐を記述

GAS

1 if (a === "はい" ) { 2 const Body = Name +'様\n\n' 3 ... 4} else if ( a === "いいえ" ) { 5 const Body = Name +'様\n\n' 6 ... 7} 8

としてみると良いかと。

投稿2021/02/22 05:44

編集2021/02/22 06:14
sawa

総合スコア3002

msug👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msug

2021/02/22 05:56

すみません、メールは無事送信されたのですが、本文に回答か引用しているNameやIDが入らなくなってしまいました。。なぜでしょうか、、 無事送信はできたのですが、すみません。。
sawa

2021/02/22 06:15

forの外にBodyの作成を移動したコードを追記ました。こちらを元にコード修正を試してみてください。
msug

2021/02/24 03:34

ありがとうございました。 レベルの低い質問でお手数をおかけしてすみませんでした。参考にさせていただいて、 以下のような形で意図していることが叶いました。 //質問と回答を取得 const items = e.response.getItemResponses(); let qa = ''; for (let i = 0; i < items.length; i++) { const item = items[i]; const q = item.getItem().getTitle(); const a = item.getResponse(); //質問タイトルが「お名前」だったらNameに格納 if ( q === QuestionName ) { Name = a; } //質問タイトルが「ID」だったらAppsに格納 if ( q === QuestionID ) { ID = a; } //質問タイトルが「ご自身の意思で参加」だったらConに格納 if ( q === QuestionCon ) { Con = a; } } for (let i = 0; i < items.length; i++) { const item = items[i]; const q = item.getItem().getTitle(); const a = item.getResponse(); //選択肢に応じて本文の内容を変更 if ( q === QuestionCon ) { if ( a=== "はい" ) { qa += '■お名前\n' + Name + '\n' +'■ID\n' + ID + '\n' } else if ( a === "いいえ" ) { qa += '■「イベント名イベント名イベント名」にご参加いただけますか?' +'参加しません。\n' } } } //本文 const Body = Name +'様\n\n' +'ご回答ありがとうございます。\n以下の内容に誤りがないか今一度ご確認ください。\n\n' +'--------------------------------------------------------\n' + qa +'--------------------------------------------------------\n\n' +'IDやお名前に誤りがあった場合は再度回答をやり直すか、以下にご連絡ください。\n\n' +'担当\n' +'xxxxxxx@xxxx.co.jp\n\n' +'※このメールは送信専用のメールアドレスから配信されています。\n' +'ご返信いただいてもお答えできませんのでご了承ください。\n\n';
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。