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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

340閲覧

【再掲】 ReferenceErrorが解決できません

10-mo

総合スコア23

Google フォーム

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

Google Apps Script

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

0グッド

1クリップ

投稿2025/04/02 02:11

実現したいこと

Googleフォームの回答の選択先によって、メールの送信先を変更するようにしたく作成しております。
具体的には、フォーム内に学年を選択できる項目があり、例えば6年生と選択して送信すると6年生の担当者のメールアドレス先へGoogleフォームの回答内容が送信されるようにしたいと考えております。

発生している問題・分からないこと

ReferenceErrorが発生しています。
先日、ご回答いただいて修正した後はエラーなく動いておりましたが、4月に入った途端急にエラーになりました。
先日の回答:https://teratail.com/questions/d7ztbywg4jd6pu

ご回答いただきましたが、修正方法が分からずご質問させていただきました。
ご教示いただけると幸いです。

エラーメッセージ

error

1ReferenceError: to is not defined 2 at sendForm(コード:55:23)

該当のソースコード

Google

1function sendForm(e) { 2//学年 3var schoolyear = ""; 4 5//タイトル 6var body = "体験のお申込がありました。内容を確認の上、ご返信の程、よろしくお願い致します。"; 7 8var itemResponses = e.response.getItemResponses(); 9for(var i = 0 ; i < itemResponses.length; i++){ 10 var itemResponse = itemResponses[i]; 11 var question = itemResponse.getItem().getTitle(); 12 var answer = itemResponse.getResponse(); 13 body += "\n\n【" + question + "】\n\n"; 14 body += answer; 15 16 17//学年によって送信先を変更する 18//toとCC内にメールアドレスを入力(複数ある際は、カンマ[,]を使う) 19 if (question === "学年"){ 20 if (answer === "園児"){ 21 schoolyear = answer; 22 to = "メールアドレスを入力"; 23 cc ="メールアドレスを入力" 24 25 } else if (answer === "1年生"){ 26 schoolyear = answer; 27 to = "メールアドレスを入力"; 28 cc ="メールアドレスを入力" 29 30 } else if (answer === "2年生"){ 31 schoolyear = answer; 32 to = "メールアドレスを入力"; 33 cc ="メールアドレスを入力" 34 35 } else if (answer === "3年生"){ 36 schoolyear = answer; 37 to = "メールアドレスを入力"; 38 cc ="メールアドレスを入力" 39 40 } else if (answer === "4年生"){ 41 schoolyear = answer; 42 to = "メールアドレスを入力"; 43 cc ="メールアドレスを入力" 44 45 } else if (answer === "5年生"){ 46 schoolyear = answer; 47 to = "メールアドレスを入力"; 48 cc ="メールアドレスを入力" 49 50 } else if (answer === "6年生"){ 51 schoolyear = answer; 52 to = "メールアドレスを入力"; 53 cc ="メールアドレスを入力" 54 } 55 } 56} 57 58//件名 59var subject = "体験問い合わせ"; 60MailApp.sendEmail({to:to,cc:cc,subject:subject,body:body}); 61 62}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

先日の回答:https://teratail.com/questions/d7ztbywg4jd6pu
でアドバイスをいただいた点を修正⇨先日まではエラーなく稼働

参考サイト
https://engineering.nifty.co.jp/blog/12154
こちらのサイトを参考に作成しました。

補足

コード内の
toやcc内には、メールアドレスを入力しております。

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

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

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

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

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

YAmaGNZ

2025/04/02 02:51

toはどこで宣言してあるのでしょうか? またquestionやanswerに実際にどういう値が格納されているか確認されましたか?
int32_t

2025/04/02 03:04 編集

> 先日の回答:https://teratail.com/questions/d7ztbywg4jd6pu 前回の質問が解決済みなら、質問を「解決済み」状態にしてください。 質問のコードは月が変わったからといって動作が変わるようなものではありません。よって、コード以外の何かが変わった可能性が高いです。たとえば、フォームが編集されてしまったとか。 13行目ぐらいに console.log('question=' + question); console.log('answer=' + answer); を入れてフォーム送信してみて、ログがどうなるか確認してみてください。 また、想定しない question や answer が来たら管理者にメールを送るような仕組みを入れておくとよいかもしれませんね。
10-mo

2025/04/02 04:05

YAmaGNZさん コメントありがとうございます。 toの宣言とは、 to = "メールアドレス"と思っていたのですが、このことではないでしょうか? >またquestionやanswerに実際にどういう値が格納されているか確認されましたか? ⇨コメント頂いた方の内容にあるようにconsole.logを入れて確認したところ、 question=function () { [native code] } と表示されました。 これはどういう意味なのでしょうか?
10-mo

2025/04/02 04:18

int32_tさん コメントありがとうございます。 先日はありがとうございました。ページ更新時に誤ってベストアンサー解除していたようです。ご指摘ありがとうございます。 フォームの質問内容等は一切変更しておりません。一時は使用できていましたので、急にエラー通知が来たという認識です。 ご教示いただいた console.log('question=' + question); console.log('answer=' + answer); を入れて確認してみました。 console.log('question=' + question); ⇨question=function () { [native code] } console.log('answer=' + answer); ⇨各々値が取得できている となりました。答えの取得はできているように思いますが、質問を取得出来ていないかも。。。?? >想定しない question や answer が来たら管理者にメールを送るような仕組みを入れておくとよいかもしれませんね。 ⇨作成するか否か検討します、、、
int32_t

2025/04/02 04:27 編集

> ⇨question=function () { [native code] } 11行目が「var question = itemResponse.getItem().getTitle();」なら、その結果にはならないはずです。コードの11行目で文字が欠落してたり、変な文字が混入してたりしませんか? 11行目以降で question の値が変わるようなコードが混入していませんか? (現在の質問文のコードには、そういうものは見当たりません)
10-mo

2025/04/02 04:43

入力していた文字に誤りがありました。ご指摘ありがとうございます。 質問も回答も取得できております。 最後に表示されるのは、 ReferenceError: to is not defined at sendForm(コード:55:23) になります。 これがよく分かりません。 toにはメールアドレスを入力しているので、これが宣言という認識は間違いでしょうか?
YAmaGNZ

2025/04/02 04:49

ご自身でロジックを理解されていないのですね。 if文にてquestionが"学年"ではない場合はどうなりますか? answerが"園児"~"6年生"ではない場合はどうなりますか? エラーメッセージには「to is not defined」とあります。 これを読めば書いてある通り「toが宣言されていない」です。 このメッセージが出るとすればif文にてtoを設定していない場合となります。 if文にて内部が実行されないとなればその条件のquestionやanswerの値がどうなっているか調べる必要があります。 こういった作業をデバッグと言います。 そしてlogにて調べた結果が question=function () { [native code] } とquestionが"学年"ではないという結果です。 そうなるとquestionに内容を代入している部分がおかしいという話になるわけですが提示されているコードですとint32_tさんが仰っている通りこの結果にはなりません。 以前の質問のように実際に動作しているものが「var question = itemResponse.getItem().getTitle」となっていたりしませんか?
YAmaGNZ

2025/04/02 04:52

>入力していた文字に誤りがありました。 というのはどこの文字がどのように間違っていたのですか? もしかして console.log('question=' + question); を console.log('question=' + question()); としたとかではないですよね? 何をどうしたのかは具体的に書かないと伝わらない可能性があります。
10-mo

2025/04/02 04:58

>入力していた文字に誤りがありました。 というのはどこの文字がどのように間違っていたのですか? ⇨var question = itemResponse.getItem().getTitle; となっておりました... 前回アドバイスいただいように本来は、getTitlenoの後に()をつけるべきところでしたが、エラー表示が出た際に、ここを外せばエラー回避できるのでは?という安易な考えから外して元に戻すことを忘れておりました。。。
10-mo

2025/04/02 05:06

if文内に to = "メールアドレス" は、宣言してことにならないということなのですね。 この場合 to = address をschoolyear = answer;の下に記入して address = "メールアドレス" とすれば解決できるということでしょうか??
int32_t

2025/04/02 05:09

> 質問も回答も取得できております。 > 最後に表示されるのは、 > ReferenceError: to is not defined > at sendForm(コード:55:23) > になります。 そのエラーより前に出ている question= answer= の表示もすべて開示してください。
10-mo

2025/04/02 05:14

デバッグ question=【確認用】メールアドレス デバッグ answer=undefined デバッグ question=学年 デバッグ answer=@gmail.com デバッグ question=お子様のお名前 デバッグ answer=幼児 デバッグ question=性別 デバッグ answer=TEST送信 デバッグ question=お子様が通っている幼稚園/保育園/学校名をご記入ください デバッグ answer=男の子 デバッグ question=幼稚園/保育園に通われている方は、年次を選択してください デバッグ answer=TEST送信 デバッグ question=保護者のお名前 デバッグ answer=当てはまらない デバッグ question=体験希望日 デバッグ answer=TEST送信 デバッグ question=ご質問・ご不安な点などございましたら、お気軽にご記入下さい。 デバッグ answer=TEST送信
10-mo

2025/04/02 05:15

⇧がデバッグで取得できた内容になります。
YAmaGNZ

2025/04/02 05:31

その内容ですとanswerが"園児"~"6年生"に当てはまらないのではないですか?
YT0014

2025/04/02 05:36

質問と答えがずれていますし、学年として、現在コードで想定していない「幼児」が入力されいるようです。呼び出し元のGoogleフォームが変更されているのではないでしょうか?
YAmaGNZ

2025/04/02 05:37

なんとなくですがquestionとanswerがずれていたりしませんか? そうなるとフォーム側で何かさわったとか考えられるのではないかと思います。
10-mo

2025/04/02 05:46

このデバッグは、順番通りに情報を取得するのですね。てっきり、取得された内容から反映されるものと思っていました。 ご指摘のように、質問と回答がズレています。 ただ、フォームの内容を変更はしておらず、強いて言えば、上記でご指摘いただいておりますが、園児⇨幼児へ単語の変更をした程度です。その他、説明を加えた程度です。
YAmaGNZ

2025/04/02 05:52

>その他、説明を加えた程度です。 これはフォームにでしょうか? そうなるとこの説明の加え方がまずかった可能性も考えられます。 また「園児⇨幼児へ単語の変更をした程度」とのことですが提示されたコードでは”幼児”には対応していないのではないですか? そういったフォームを変更してコードを変更していないというアンマッチ状態はまずいのではないですか?
10-mo

2025/04/02 06:00

確かにコード内の単語を修正しておりませんでした。 気づかせていただきありがとうございます。 説明を加えただけでも不具合が発生し得るということですね、、、 新たにフォームを作成して、このコードを再度書いたら正常に動くのでしょうか?
YAmaGNZ

2025/04/02 06:06

どのように説明を加えたのか私には分かりませんのでその方法が正しい方法なのか不具合が発生してしまう方法なのかを判断できません。 しかし実際問題として回答がずれているのは確かなのでこれを修正する必要があります。
10-mo

2025/04/02 06:09

>回答がずれているのは確かなのでこれを修正する必要があります。 ⇨これはどのように修正すれば良いのでしょうか?
YAmaGNZ

2025/04/02 06:38

ログの出力部分は var itemResponse = itemResponses[i]; var question = itemResponse.getItem().getTitle(); var answer = itemResponse.getResponse(); console.log('question=' + question); console.log('answer=' + answer); このようになっていると思っておりますが、この時に「answer=undefined」となる現象が再現できません。 なので現時点ではどのように修正すればよいのか当方には分かりません。 修正したフォームを元に戻してみるといったことは出来ますか?
10-mo

2025/04/02 07:12

修正してからだいぶ時間が経ってしまっているため、元のフォームがどのようになっているのか覚えておりません。。。。 明日、新しく再度フォームを作成して、このフォームをくっつけてみたいと思います。
YAmaGNZ

2025/04/02 07:52

念のため確認ですがログの出力は var itemResponse = itemResponses[i]; var question = itemResponse.getItem().getTitle(); var answer = itemResponse.getResponse(); console.log('question=' + question); console.log('answer=' + answer); となっていますよね? var itemResponse = itemResponses[i]; var question = itemResponse.getItem().getTitle(); console.log('question=' + question); console.log('answer=' + answer); var answer = itemResponse.getResponse(); この順番になっていないですよね?
10-mo

2025/04/03 00:15

出力ログの挿入位置がご指摘のように間違っていました、、、 修正したところ、質問と回答が一致するようになりました。 デバッグ question=【確認用】メールアドレス デバッグ answer=@gmail.com デバッグ question=学年 デバッグ answer=幼児 デバッグ question=お子様のお名前 デバッグ answer=TEST デバッグ question=性別 デバッグ answer=男の子 デバッグ question=お子様が通っている幼稚園/保育園/学校名をご記入ください デバッグ answer=TEST デバッグ question=幼稚園/保育園に通われている方は、年次を選択してください デバッグ answer=当てはまらない デバッグ question=保護者のお名前 デバッグ answer=TEST デバッグ question=体験希望日 デバッグ answer=TEST デバッグ question=ご質問・ご不安な点などございましたら、お気軽にご記入下さい。 デバッグ answer= ※ここは、自由記入のため空欄でも問題ありません※
YAmaGNZ

2025/04/03 00:19

そうなると”幼児”に対応していないことが原因で「to is not defined」になっているのではないですか? if文の条件に全く当てはまらない場合にtoやccが設定されないことは分かりますよね?
10-mo

2025/04/03 00:29

理解できました。スクリプトでは、「園児」となっており、フォームは「幼児」となっていたため、「to is not defined」と表示され、その条件に当てはまっていなかったためにメール送信されなかったということですよね?
YAmaGNZ

2025/04/03 00:48

そうなります。 なのでint32_tさんが提案されたように「想定しない question や answer が来たら管理者にメールを送るような仕組みを入れておくとよいかもしれませんね。」といった変更を行えば今回のようなフォームは変更したけどスクリプトは変更していないといった事象も切り分けが比較的簡単にできたのではないかと思います。 例えば } else if (answer === "6年生"){ schoolyear = answer; to = "メールアドレスを入力"; cc ="メールアドレスを入力" } else { // 開発者のメールアドレス to = "メールアドレスを入力"; cc =""; } といった感じでif文の条件に当てはまらなかった場合に開発者向けにメールを送信するようにするとかログ出力して後で見たときに切り分けの情報になるようにするとかすればよろしいかと思います。
10-mo

2025/04/03 01:05

ありがとうございます。理解しました。 ご指摘いただいているように、確かにイレギュラー対応のスクリプトを作成しておくべきでした。運用前に、このような事象は回避できたのではないかと反省しております。 ご教示いただいております、開発者へのメールアドレススクリプトを挿入し、エラーが起きた際に落ち着いて対応できるようにしたいと思います。
YAmaGNZ

2025/04/03 01:08

”幼児”に対応等して解決したのであれば自己解決として解決済みとしておいてください。
10-mo

2025/04/03 01:20

コメント・ご指摘いただいた皆様、ありがとうございました。。
guest

回答1

0

自己解決

Googleフォームの回答項目とスクリプトの項目が不一致だったため、エラー(ReferenceError: to is not defined)が起きました。フォームでは「幼児」、スクリプトでは「園児」となっていたのが原因です。
ここを修正したところ、エラーが起きなくなりました。

また、問題がどこにあるのか確認するために
console.log('question=' + question);
console.log('answer=' + answer);
を挿入(挿入場所注意)

さらに、ご指摘いただいた内容の管理者に通知するスクリプト
else if (answer === "6年生"){
schoolyear = answer;
to = "メールアドレスを入力";
cc ="メールアドレスを入力"
} else {
// 開発者のメールアドレス
to = "メールアドレスを入力";
cc ="";

を入れてエラーが起きた際に、問題点がどこにあるのか確認できるようにすること。

以上、ご指摘いただいた内容をまとめました。
皆様、ありがとうございました。

投稿2025/04/03 01:26

10-mo

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.32%

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

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

質問する

関連した質問