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

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

ただいまの
回答率

87.48%

Google Apps Script 自動返信メール チェックボックスの回答により送信先を変えたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 563

前提・実現したいこと

Googleフォームでチェックボックスで選んだ選択肢により
自動返信の宛先が変更されるようにしたい。

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

チェックボックスの選択肢を複数選んだ時、宛先が複数にならずToが空になってしまう。

例)質問Aの回答
BBB,CCCにチェックを入れた場合、送信先Toはbbb@xxx.co.jp,ccc@xxx.co.jp
BBBのみにチェックを入れた場合、送信先Toはbbb@xxx.co.jp

該当のソースコード

function onFormSubmit(e){
try{
var admin = "aaa@xxx.co.jp";
var to = "";
var cc = "";
var bcc = admin;

var subject = '';
var itemResponses = e.response.getItemResponses();
var body = '';

//宛先メールアドレス用の変数を用意
var mail1 = "bbb@xxx.co.jp";
var mail2 = "ccc@xxx.co.jp";
var mail3 = "ddd@xxx.co.jp";

for (var i = 0; i < itemResponses.length; i++) {

  var itemResponse = itemResponses[i];
  var question = itemResponse.getItem().getTitle();
  var answer = itemResponse.getResponse();

// 自動返信メール本文へ回答内容記載
  if (question == "◆質問A"){
    body += question + '\n' + answer + '\n\n';
  }

// 送信先出し分け
  if (question == "◆質問A") {

    for (var j = 0; j < itemResponses.length; j++) {

      var itemResponse = itemResponses[j];
      var answer = itemResponse.getResponse();

      if (answer == "BBB") {
        to += mail1 + ",";
      } else if (answer == "CCC") {
        to += mail2 + ",";
      } else if (answer == "DDD") {
        to += mail3 + ",";
      }

    }

  } 

var content = body;      

//メールを送信
MailApp.sendEmail(
  to,
  subject,
  content,
  {cc: cc,
    bcc: bcc,
    from: 'aaa@xxx.co.jp',
    name: 'hogehoge'
  });

} catch (e) {
//エラーが発生した場合に管理者にメールを送信する
MailApp.sendEmail(admin, "Error report", e.message);
}

}

試したこと

for文を質問Aの前に入れたが同じ結果でした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Googleフォームの記入内容が下記になっているとします。
(xはチェックが入っているという意味です)
◆質問A
[x] BBB
[x] CCC
[ ] DDD

この状態で送信ボタンを押したとき、最初のfor文以下の動作について考察します。

for (var i = 0; i < itemResponses.length; i++) {

  var itemResponse = itemResponses[i];
  var question = itemResponse.getItem().getTitle();
  var answer = itemResponse.getResponse();


i=0のときどうなるかというと
questionには「◆質問A」という文字列が入りますが
answerには、[BBB,CCC] という配列(回答の配列)が入ります。

さらに、その下で

// 送信先出し分け
  if (question == "◆質問A") {

   for (var j = 0; j < itemResponses.length; j++) {

     var itemResponse = itemResponses[j];
     var answer = itemResponse.getResponse();
     if (answer == "BBB") {
...


となっていますが、ここで最初のfor文と同じくitemResponsesに対してループをかけているため、
answerには[BBB,CCC]という配列が入ってしまい、
[BBB,CCC]=="BBB"... という比較を行うことになるため、以降のif文が正になることはありません。

したがって、2回目のfor文は、itemResponsesではなく、answer(回答の配列)に対して行う必要があります。
(下のコードでは、answersという変数名に変えています)
 
(下記先頭が-となっている行は削除 +は追加)

(略)
    //宛先メールアドレス用の変数を用意
    var mail1 = "bbb@xxx.co.jp";
    var mail2 = "ccc@xxx.co.jp";
    var mail3 = "ddd@xxx.co.jp";

    for (var i = 0; i < itemResponses.length; i++) {
      var itemResponse = itemResponses[i];
      var question = itemResponse.getItem().getTitle();
-     var answer = itemResponse.getResponse();
+     var answers = itemResponse.getResponse();

    // 自動返信メール本文へ回答内容記載
      if (question == "◆質問A"){
-       body += question + '\n' + answer + '\n\n';
+       body += question + '\n' + answers + '\n\n';
      }
    // 送信先出し分け
      if (question == "◆質問A") {
-       for (var j = 0; j < itemResponses.length; j++) {
+       for (var j = 0; j < answers.length; j++) {

-         var itemResponse = itemResponses[j];
-         var answer = itemResponse.getResponse();
+         var answer = answers[j];

          if (answer == "BBB") {
(以下略)

sendEmailの直前に、Logger.log(to);を追加して、宛先メールアドレスがうまく組み立てられているか確認してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/03/05 19:40

    ご説明、ご回答いただきましてありがとうございます。
    やりたかったことを実現できました。
    実際に宛先が組み立てられていることも確認できました。

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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