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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

3295閲覧

GASが突然エラーになった、、、、

inagi-inagi

総合スコア1

Google フォーム

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

Google Apps Script

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

0グッド

3クリップ

投稿2023/04/06 01:37

実現したいこと

Googleフォームに回答があった際に、送信者・管理者にメールが流れるようにしたい。これまで実現実行できていて、なぜか突然使えなくなった。その理由が知りたく調べていたが全く解決せず、お分かりの方にご教示いただきたいです。V8云々の問題かと思ったが違うようだった。

前提

GASを使ってGoogleフォームに回答があった際に送信者・管理者にメールを流したい。これまで何の問題もなくエラー表示すら出なかった。しかし、送信者側から「見てます?」と連絡をもらい、プログラム実行するとエラーになった。GASのコードはGoogleフォームのスクリプトエディタに記載しています。

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

エラーメッセージ

TypeError: Cannot read properties of undefined (reading 'response')
autoEmails @ コード.gs:6

該当のソースコード(エラーはステップ1のところ)

function autoEmails(e) {
/* ◆◆ ↓↓ 回答者へのお礼メール ↓↓ ◆◆ */

/* ステップ1: フォームのデータを取得する */
//すべての質問と回答を取得する
let itemResponses = e.response.getItemResponses();
↑ここがエラーになります。

//回答者のメールアドレスを取得する
let recipient = e.response.getRespondentEmail();

/* ステップ2: 必要なデータを抽出する */
//個々の質問と回答を格納するための空配列を宣言する
let questionAndAnswers = [];

//for文(ループ)で変数itemResponsesから個々の質問と回答を取得する
for(let i = 0; i < itemResponses.length; i++) {
//質問のタイトルを取得する
let questionTitle = itemResponses[i].getItem().getTitle();

//回答を取得する let answer = itemResponses[i].getResponse(); //未回答の質問かどうかで送信文章を調整する if(!answer) { questionAndAnswers.push(questionTitle + ": 未回答"); } else { questionAndAnswers.push(questionTitle + ": " + answer); }

}

/* ステップ3: 宛先、件名、本文を決める */
//メールの件名
//★★★お好きな件名に変更ください★★★
let subject = "【受付完了】ご連絡ありがとうございました。"

//メールの本文
//★★★お好きな本文に変更ください★★★
let body = "ご連絡いただきありがとうございました。\n"
+ "\n"
+ "下記の内容でお問い合わせを受け付けました。\n"
+ "\n"
+ "========================\n"
//一次元配列questionAndAnswersをjoinメソッドを使って文字列を作成する
//区切り文字は改行"\n"
+ questionAndAnswers.join("\n")
+ "\n"
+ "========================\n"
+ "\n"
+ "不具合については早急に対応させていただきます。それ以外の内容については精査の後に対応させていただきます。"
+ "\n\n"
+ "------------\n"
+ "管理者:名前入れてます\n"
+ "Email: メアド記入してます\n"
+ "HP: https://URL入れてます/";

/* ステップ4: 回答者にメールを送信する */
//回答者にメールを送信する
GmailApp.sendEmail(recipient, subject, body);

/* ◆◆ ↑↑ 回答者へのお礼メール ↑↑ ◆◆ /
/
================================== /
/
◆◆ ↓↓ 管理者へのメール ↓↓ ◆◆ */

/* ステップ5: 管理者向けメールの宛先、件名、本文を決める */
//★★★管理者のメールアドレスを入力してください★★★
//複数名の管理者にメールしたい場合、カンマで区切って入力してください
let adminRecipient = "メールアドレス";

//メールの件名
//★★★お好きな件名に変更ください★★★
let adminSubject = "【自動通知】Googleフォームで新規回答を受け付けました";

//メールの本文
//★★★お好きな本文に変更ください★★★
let adminBody = "Googleフォームで新規回答を受け付けました。\n"
+ "\n"
+ "内容を確認し対応してください。\n"
+ "\n"
+ "========================\n"
//一次元配列questionAndAnswersをjoinメソッドを使って文字列を作成する
//区切り文字は改行"\n"
+ questionAndAnswers.join("\n")
+ "\n"
+ "========================\n";

/* ステップ6: 管理者にメールを送信する */
//管理者にメールを送信する
GmailApp.sendEmail(adminRecipient, adminSubject, adminBody);

/* ◆◆ ↑↑ 管理者へのメール ↑↑ ◆◆ */
}

試したこと

resoponse → Response
V8の解除

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

よろしくお願いいたします。

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

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

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

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

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

int32_t

2023/04/06 02:38

この autoEmails() という関数をどうやって呼んでいますか。
inagi-inagi

2023/04/06 04:01

int32_tさん コメントありがとうございます。 それがトリガーになっています。選択できる関数がこれしかありません。
int32_t

2023/04/06 04:20

「TypeError: Cannot read properties of undefined (reading 'response')」は、トリガーで実行したときに設定されるべき引数 e が空っぽという状況なんですが、このエラーはトリガーで起動したときのエラーで間違いないですか?
inagi-inagi

2023/04/06 05:10

エラーが起きたのは、 ①Googleフォームで実行した時 ②プロジェクト画面で実行した時です。 実行する関数は、autoEmails() イベントソース:フォームから イベント種類:フォーム送信時 ここは、作成時から弄ってません。
YellowGreen

2023/04/13 07:19

既に時間が解決しているかもしれませんが、 エラーになったのは、エディタから実行したからです。 このスクリプトはエディタから実行すると必ずそのエラーが発生します。 次に、メールが届かなかったのは、 トリガーによるフォーム送信時の値の取得は時々失敗することがあるからです。 スクリプトエディタの左画面の実行数を選択すると、実行ログが確認できますので、 トリガー実行のログで失敗しましたというログがあったら、クリックしてみましょう。 英語で、 フォームの値の取得に失敗したのでしばらく待ってから再度実行してください と表示されていると思います。 この時の待ってから実行するとは再度フォームを送信することなので それが実行されることはないのでメールが届かないことになります。
inagi-inagi

2023/04/14 04:54

YellowGreenさん コメントいただき有難うございます。未だ解決しておりません。ログアウト等しても全く動かず苦戦しています。 プロジェクト実行はフォームから行っても同様にエラーになります。メールは届きません。エラーログは TypeError: Cannot read properties of undefined (reading 'response') autoEmails @ コード.gs:6 です。 実行する関数は、コード冒頭functionに続くものになっております。
YellowGreen

2023/04/14 05:31

ご提示のスクリプトを試してみましたが、やはり正常に動作しており、それぞれにメールが届きました。 一度、トリガーを削除してから再度設定してみましたか?
inagi-inagi

2023/04/14 05:52

試行いただきありがとうございます。 私も違うアカウントで試しましたが、結果は同様のエラー表示になりました。ご指摘いただいたトリガー削除も試しましたがエラー表示になりました。エラーコードも上記と同様です。
YellowGreen

2023/04/14 06:13

私が追試して正常動作したのと、 そちらで違うアカウントで試してエラーになるのは違いがわからないですねぇ。 お教え願いたいことが2つあります。 1) 念のためですが、違うアカウントでお試しになったのは、 何を違うアカウントにして実施されましたか? 2) このスクリプトは、フォームのスクリプトエディタに保存されていて、トリガーは、フォームのエディタから「フォーム送信時」で設定されているのですね。
inagi-inagi

2023/04/14 06:54

1) 念のためですが、違うアカウントでお試しになったのは、何を違うアカウントにして実施されましたか? →コードをコピーした後、ログアウト。全く異なるアカウントにログイン後にコピペして作動させました。Googleフォームは新たに同様のものを作成しています。 2) このスクリプトは、フォームのスクリプトエディタに保存されていて、トリガーは、フォームのエディタから「フォーム送信時」で設定されているのですね。 →トリガーは仰る通り「フォーム送信時」で設定しています。Googleフォームから回答しましたが、メールが届きません。プロジェクト画面開くとエラーと出ていました。エラー表記は上記と同様です。 異なるアカウントでも実行しましたが、エラーになりました。 上司にお願いして試行してもらったのですが、こちらもエラーでした。。。。
YellowGreen

2023/04/14 06:59

やはり原因がわからないので、代替案をご提案しました。
YellowGreen

2023/04/14 07:16

可能性は低いですが、ドメイン管理者が管理コンソールでセキュリティを強化したということがあるかもしれません。
guest

回答1

0

ベストアンサー

ご提示のスクリプトがフォームからの回答を引数 e で受け取れない原因が不明なままなので、
e の値を取得しないでフォームの回答からメールを送信するための代替スクリプトをご提案します。
元のスクリプトにできるだけ近い動作をするようにしてあります。

このスクリプトは、スクリプトの冒頭のコメントにあるようにスプレッドシートの拡張機能から
Apps Scriptを選んでスプレッドシートのスクリプトエディタに保存して使うものです。

トリガーは、フォームのときと同じようにスプレッドシートのエディタから「フォーム送信時」に設定します。
また、このスクリプトは、エディタからも実行可能で、そのときは、既に蓄積されている回答の一番最後の回答に基づきメールを送信します。

スクリプト内のシート名と管理者メールアドレスをそちらの環境に合わせて修正してください。
単に'メールアドレス'となっている部分は書き換えずそのままです。

javascript

1//このスクリプトはフォームの回答先のスプレッドシートのスクリプトエディタで保存 2//スプレッドシートのエディタから「フォーム送信時」でトリガーを設定 3//フォームのエディタのトリガーは削除 4//フォームからシートに蓄積される回答から返信 5//トリガー実行なら回答から返信 6//エディタで実行ならシートの既存の最終行から返信 7function autoEmails() {//(e)は不要 8 const name = 'フォームの回答 1';//←回答先のシート名をコピペ 9 const sheet = SpreadsheetApp.getActiveSheet(); 10 //回答先シート名の確認 11 if (sheet.getName() != name) { 12 return; 13 } 14 /* ◆◆ ↓↓ 回答者へのお礼メール ↓↓ ◆◆ */ 15 16 /* ステップ1: シートのデータを取得する */ 17 //すべての質問(1行目)と回答(最終行)を取得する 18 const questionTitles = sheet.getRange(1, 1, 1, sheet.getLastColumn()) 19 .getValues() 20 .flat(); 21 const answers = sheet.getRange(sheet.getLastRow(), 1, 1, sheet.getLastColumn()) 22 .getValues() 23 .flat(); 24 25 /* ステップ2: 必要なデータを抽出する */ 26 //個々の質問と回答を格納するための空配列を宣言する 27 const questionAndAnswers = []; 28 29 //for文(ループ)でシートから取得した値から個々の質問と回答を取得する 30 let recipient = '';//送信先メールアドレス 31 for (let i = 1; i < answers.length; i++) {//タイムスタンプは除く(i = 1) 32 //質問のタイトルを取得する 33 const questionTitle = questionTitles[i]; 34 35 //回答を取得する 36 const answer = answers[i]; 37 38 //メールアドレスを取得したら配列に蓄積せず次の回答へ 39 if (questionTitle == 'メールアドレス') {//ここのメールアドレスは書き換えない 40 recipient = answer; 41 continue; 42 } 43 44 //質問と回答を一次元配列に蓄積(未回答の質問はその旨を表示) 45 if (!answer) { 46 questionAndAnswers.push(questionTitle + ": 未回答"); 47 } else { 48 questionAndAnswers.push(questionTitle + ": " + answer); 49 } 50 51 } 52 53 /* ステップ3: 宛先、件名、本文を決める */ 54 //メールの件名 55 //★★★お好きな件名に変更ください★★★ 56 const subject = "【受付完了】ご連絡ありがとうございました。" 57 58 //メールの本文 59 //★★★お好きな本文に変更ください★★★ 60 const body = "ご連絡いただきありがとうございました。\n" 61 + "\n" 62 + "下記の内容でお問い合わせを受け付けました。\n" 63 + "\n" 64 + "========================\n" 65 //一次元配列questionAndAnswersをjoinメソッドを使って文字列を作成する 66 //区切り文字は改行"\n" 67 + questionAndAnswers.join("\n") 68 + "\n" 69 + "========================\n" 70 + "\n" 71 + "不具合については早急に対応させていただきます。それ以外の内容については精査の後に対応させていただきます。" 72 + "\n\n" 73 + "------------\n" 74 + "管理者:名前入れてます\n" 75 + "Email: メアド記入してます\n" 76 + "HP: https://URL入れてます/"; 77 78 /* ステップ4: 回答者にメールを送信する */ 79 //回答者にメールを送信する 80 GmailApp.sendEmail(recipient, subject, body); 81 82 /* ◆◆ ↑↑ 回答者へのお礼メール ↑↑ ◆◆ / 83 / ================================== / 84 / ◆◆ ↓↓ 管理者へのメール ↓↓ ◆◆ */ 85 86 /* ステップ5: 管理者向けメールの宛先、件名、本文を決める */ 87 //★★★管理者のメールアドレスを入力してください★★★ 88 //複数名の管理者にメールしたい場合、カンマで区切って入力してください 89 const adminRecipient = "管理者のメールアドレス";//←ここを書き換える 90 91 //メールの件名 92 //★★★お好きな件名に変更ください★★★ 93 const adminSubject = "【自動通知】Googleフォームで新規回答を受け付けました"; 94 95 //メールの本文 96 //★★★お好きな本文に変更ください★★★ 97 const adminBody = "Googleフォームで新規回答を受け付けました。\n" 98 + "\n" 99 + "内容を確認し対応してください。\n" 100 + "\n" 101 + "========================\n" 102 //一次元配列questionAndAnswersをjoinメソッドを使って文字列を作成する 103 //区切り文字は改行"\n" 104 + questionAndAnswers.join("\n") 105 + "\n" 106 + "========================\n"; 107 108 /* ステップ6: 管理者にメールを送信する */ 109 //管理者にメールを送信する 110 GmailApp.sendEmail(adminRecipient, adminSubject, adminBody); 111 112 /* ◆◆ ↑↑ 管理者へのメール ↑↑ ◆◆ */ 113}

投稿2023/04/14 06:58

編集2023/04/14 07:20
YellowGreen

総合スコア731

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

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

YellowGreen

2023/04/14 07:07

何のエラーもないのにメールが送信されない場合は、シート名が合っているかご確認ください。
YellowGreen

2023/04/14 07:11

if (sheet.getName() != name) { return; } のところを if (sheet.getName() != name) { console.log('回答先シート名が違うか他のフォームからの回答です。'); return; } としておくとログが残ります。
YellowGreen

2023/04/14 07:39

もしも、回答先のシートを加工して回答以外の列があると、 メールにそれらの列のタイトルとその列の値または未回答と本文に記載されてしまいますので、 そのときは、回答以外の列を蓄積対象から外すため、 シートのデータを取得する部分を以下のように変更します。 const lastColumn = 9;//←9を回答の最後の列番号に書き換える const questionTitles = sheet.getRange(1, 1, 1, lastColumn) .getValues() .flat(); const answers = sheet.getRange(sheet.getLastRow(), 1, 1, lastColumn) .getValues() .flat();
inagi-inagi

2023/04/14 07:44

スクリプトをご提案いただき有難うございます。早速、使用させていただいたところ正常に作動しました。本当にありがとうございます。ちなみに、このあと自分のコードを再度使用してみましたが、エラーになりました。 ご提案いただいたスクリプトを活用させていただきます。 とても困っていたので本当に助けられました。ありがとうございました。
YellowGreen

2023/04/14 07:45

お役に立ってよかったです。 原因が不明なままなのが残念です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問