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

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

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

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

808閲覧

GASを利用してGoogleフォームで入力された情報をメールで送信する際、未入力の欄があってもメールを送信したい。

wa3bon

総合スコア2

Google フォーム

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/08/30 01:43

前提

プログラミングはJavaをよくある初心者研修を受けた程度、GASは今回初めて触ります。
まず、やりたい最終目標としてはタイトルの通りで、Googleフォームに入力された内容を記載したメールを担当者へ自動で飛ぶようにGASを作成したいです。
主に以下のサイトを参考にして大まかな記述はできたのですが、フォームの中で未入力の項目があるとその項目だけ値が取れずにエラーになってしまいます(未入力なので値が無いのは当然ですが)。
https://solutions.system-exe.co.jp/appremo/blog/self-workflow
そこで、以下の質問を参考に未入力をチェックする条件式を入れたのですが、上手く動いてくれません。
https://teratail.com/questions/145802
この点の解決のため、どのように修正をすれば良いかご教示お願い致します。

実現したいこと

・フォーム側で未入力の項目があってもメールが送信されるようにしたい

試したこと

①switch文の外で以下のif文を追加し、今回の項目のみ別で値を代入するようにした。
→未入力際は、メール文に「項目名:(空白)」と表示されるようにしていた。

JavaScript

1FormApp.getActiveForm() 2function sendMessage(e) { 3 // GoogleFormから回答内容を取得 4 let itemResponses = e.response.getItemResponses(); 5 6 // 取得した回答内容を各変数に代入するためのループ 7 for (var i=0; i < itemResponses.length; i++) { 8 let formData = itemResponses[i]; 9 let formLabel = formData.getItem().getTitle(); 10 let response = formData.getResponse(); 11 12 switch (formLabel) { 13 case "質問A1": 14 A1 = response; 15 break; 16 case "質問A2": 17 A2 = response; 18 break; 19 (中略)20 default: 21 C3 = response; 22 break; 23 } 24 25 if ( formLabel === '質問B1' && response != '') { 26 B1 = response; 27 } else{ 28 B1 = ''; 29 }

②switch文の中で以下のif文を追加した。
→未入力際は、メール文に「項目名:(空白)」と表示されるようにしていた。

JavaScript

1FormApp.getActiveForm() 2function sendMessage(e) { 3 // GoogleFormから回答内容を取得 4 let itemResponses = e.response.getItemResponses(); 5 6 // 取得した回答内容を各変数に代入するためのループ 7 for (var i=0; i < itemResponses.length; i++) { 8 let formData = itemResponses[i]; 9 let formLabel = formData.getItem().getTitle(); 10 let response = formData.getResponse(); 11 12 switch (formLabel) { 13 case "質問A1": 14 A1 = response; 15 break; 16 case "質問A2": 17 A2 = response; 18 break; 19  case "質問B1": 20 if (response != '') { 21 B1 = response; 22 } else{ 23 B1 = ''; 24 } 25 break; 26 case "質問C1": 27 C1 = response; 28 break; 29 case "質問C2": 30 C2 = response; 31 break; 32 default: 33 C3 = response; 34 break; 35 } 36

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

試したこと①のエラーメッセージ
※(コード:77:22)の77行目は、メール本文を設定していてその中で${B1}を利用しており、そこを指しています。

ReferenceError: B1 is not defined at sendMessage(コード:77:22)

試したこと②はエラーメッセージは出ないが、該当の項目に入力があっても無くてもメール文に「空白」が表示されてしまう。

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

フォームの作りは以下のようにしています。

セクションA→次のセクションへ
質問A1 必須
質問A2 必須
質問A3(ラジオボタン) 必須
選択肢A3-1→セクションCへ
選択肢A3-2→セクションBへ
セクションB→次のセクションへ
質問B1 必須
セクションC→送信
質問C1 必須
質問C2 必須
質問C3 必須

ここの「質問B1」が未入力の場合が想定され、このテストをした際にエラーになります。

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

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

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

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

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

YAmaGNZ

2022/08/30 02:49

A1やB1等の変数はどこで定義しているのでしょうか?
wa3bon

2022/08/30 03:00 編集

参考元がしていなかったので明確に定義はしていません。 ですが、この状態でB1以外の変数は問題なく値が代入されてメール本文にも正しい情報が記載されていましたので、定義は無くても問題ないと思っていました。 別途それぞれ変数定義が必要ということでしょうか?
guest

回答1

0

ベストアンサー

例えば
A1 = 1;
とすればA1という変数を定義し1を代入するという形になります。
なので、

A1 = 1; Logger.log(A1);

とすれば正常に実行されます。

しかし定義されていない変数B1をいきなり
Logger.log(B1);
とするとB1は未定義なのでエラーとなります。
B1を使用する前に
let B1;
と定義すれば正常動作します。(値はnullとなりますが)

let B1; // この行がないばあいはエラーとなる。 Logger.log(B1); // nullとなる

この為、回答が省略された場合はB1= response;といった代入の部分が実行されないために未定義となっているのでしょう。
あらかじめ変数を定義し、初期化しておけばこのようなエラーにはならないでしょう。

また

if (response != '') { B1 = response; } else{ B1 = ''; }

とありますが、responseが''ではない場合はresponseをresponseの場合は’’をいれるということは
B1 = response;
と書いてもその通りとなります。

投稿2022/08/30 03:22

YAmaGNZ

総合スコア10258

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

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

wa3bon

2022/08/30 04:29 編集

回答いただき、ありがとうございました。 ご指摘いただいた通り、変数の定義をしましたら入力が無くてもメールが送信されるようになりました。 ですが、別の問題が浮上してきてしまいましたので、可能でしたらこちらも解決策をご教示いただけますと幸いです。 【問題点】 未入力でもメールが送信されるが、メール文の変数B1に該当する箇所に「undefined」と記載されてしまう。 ※理想は「質問B1は[(空白)]と入力されています」と記載したいが、実際は「質問B1は[undefined]と入力されています」となっている。 【ご指摘いただいて変更した点】 ・A1やB1等の変数を全て「let A1; let A2;・・・」と定義 ・if文は全て削除 ・試したこと②のやり方に修正  case "質問B1": B1 = response; break; ※(元々↑状態で動いていたのですが、フォーム側を変更して質問B1をセクション分けすると、試したこと①のエラーメッセージが表示されてしまったため、対策をしたく色々と試していました) 【新しい問題が出て変更した点】 ・削除したif文の追加 case "質問B1": B1 = response; break; ↓ case "質問B1": B1 = response; if(B1 === 'undefined'){ B1 = ''; } break; ・↑でもダメだったので、以下に変更 case "質問B1": B1 = response; if(response === 'undefined'){ B1 = ''; } break; //これも同じ結果でした ※「undefined」のシングルクォートを付けたり外したりしても結果は変わらずでした。
YAmaGNZ

2022/08/30 04:39

質問「質問B1」が省略された場合、そもそも case "質問B1" を通らずに処理されずにいたのが問題だったはずで、それを変数定義したからといってそこを通るわけではありません。 なので、そこに何を書こうが実行されません。 省略され値が代入されないのが問題なのであれば、絶対通るところで値を代入して変数を初期化しましょう。 通常は let B1 = ''; といった感じで初期値を設定します。
wa3bon

2022/08/30 05:21

>質問「質問B1」が省略された場合、そもそも >case "質問B1" >を通らずに処理されずにいたのが問題だったはずで、それを変数定義したからといってそこを通るわけではあり>ません。 >なので、そこに何を書こうが実行されません。 なるほど!ありがとうございます!ここが理解できていませんでした。 最初の「試したこと①」の形式にしてif文をswitch文の外に出してみたら、想定通りの動きになりました。 YAmaGNZさんが記載いただいた通り、変数の初期化でも対応できました。 逆に今まで変数の定義も初期化もしていない段階で問題なく動いていた理由がイマイチわかっていませんが、とりあえず今回の件は解決できました!本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問