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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

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

Q&A

解決済

2回答

4886閲覧

Googleフォームからメール自動配信機能の不具合について

mm28

総合スコア12

Google Apps Script

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

0グッド

0クリップ

投稿2019/05/15 02:11

編集2019/05/31 04:12

前提・実現したいこと

以前より、Googleフォーム入力した内容をメールで自動配信するものを作成して使用していましたが、
送信時に2重にメールが送信されてしまう事象が起きていました。

こちらのteratailの過去の事象を参考にさせて頂き、
スプレットシートのスクリプトエディタを使用する(イベント:スプレットシートから)を辞めて
Googleフォームのスクリプトエディタを使用する(イベント:フォームから)に変更しました。

メールが2重に配信されてしまうという事象は解消されたのですが、
当日朝1番でフォームで入力し、届くメールの内容が、前日の1番最後にフォーム入力したものが再び送られてしまう、という事象が発生しています。

その後、朝1番以降に送る内容については、通常通り自動配信可能です。

こちらの事象を解消したいです。

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

上記にも記載しましたが、
当日の朝1番で送るフォームの内容が、前日の一番最後の内容が再送されてしまう。

朝1番に送る内容以降は通常通り機能している。

該当のソースコード

javascript

1function sendMailGoogleForm() { 2 3 4 //------------------------------------------------------------ 5 // 設定エリアここから 6 //------------------------------------------------------------ 7 8 // 件名、本文、フッター 9var subject = "題名"; 10var body 11 ="****\n\n" //メールの冒頭分固定文章 12 +"********\n\n"//メールの冒頭分固定文章 13 + "*****************************\n"//メールの冒頭分固定文章 14 + "---------------------------------------------------------------------------------\n"; 15var footer 16 = "---------------------------------------------------------------------------------\n\n" 17 + "*****************\n" 18 19 20+ "====================================================\n" 21 署名 22+ "====================================================\n" 23 24// 入力カラム名の指定 25var NAME_COL_NAME = '名前'; 26var MAIL_COL_NAME = 'メールアドレス'; 27var TIMESTAMP_LABEL = 'タイムスタンプ'; 28var BODY_FORM_NAME = '担当'; //フォーム作成時に設定した項目名 29var BODY_FORM_NAME = '番号'; //フォーム作成時に設定した項目名 30var BODY_FORM_NAME = '連絡先'; //フォーム作成時に設定した項目名 31 32// メール送信先 33var admin_name ="アドレスの名前";//送信メールの名前 34var admin = "アドレス"; // 管理者(必須) 35var cc = "アドレス"; // Cc: 36var reply = admin; // Reply-To: 37var to = ""; // To: (入力者のアドレスが自動で入ります) 38 39 //------------------------------------------------------------ 40 // 設定エリアここまで 41 //------------------------------------------------------------ 42 43try{ 44// スプレッドシートの操作 45 46var sh = SpreadsheetApp.openById("スプレットシートのID"); 47var rows = sh.getLastRow(); 48var cols = sh.getLastColumn(); 49var rg = sh.getDataRange(); 50Logger.log("rows="+rows+" cols="+cols); 51 52 53// メール件名・本文作成と送信先メールアドレス取得 54for (var j = 1; j <= cols; j++ ) { 55var col_name = rg.getCell(1, j).getValue(); // カラム名 56var col_value = rg.getCell(rows, j).getValue(); // 入力値 57 58if ( col_name === NAME_COL_NAME ) {  //題名にsubjectで指定した文字+申込者者名を反映 59 subject = subject +"【"+col_value+"】\n"; 60} 61 62if ( col_name === MAIL_COL_NAME ) {  //メールアドレス 63to = col_value; 64} 65if ( col_name === TIMESTAMP_LABEL ) { //タイムスタンプ⇒申込日時 66col_name = '申込日時'; 67} 68// 日付のフォーマットを指定。 69 70if (col_name === '希望日' && col_value != '') { 71col_value = Utilities.formatDate(col_value, 'Asia/Tokyo', "YYYY'年'MM'月'dd'日'"); 72} 73body += "【"+col_name+"】\n"; 74body += col_value + "\n\n"; 75} 76body += sh.getUrl(); 77body += "\n"; 78body += footer; 79 80 81// 送信先オプション 82var options = {}; 83if ( cc ) options.cc = cc; 84if ( reply ) options.replyTo = reply; 85 86// メール送信 87if ( to ) { 88//メールを送信 89 90GmailApp.sendEmail(to, subject, body, { 91 from: admin, //fromアドレス 92 name: admin_name, //差出人 93 cc: cc, 94 } 95 ); 96 97}else{ 98MailApp.sendEmail(admin, "【失敗】Googleフォームにメールアドレスが指定されていません", body); 99} 100}catch(e){ 101MailApp.sendEmail(admin,"【失敗】Googleフォームからメール送信中にエラーが発生",e.message); 102} 103}

試したこと

①スクリプトエディタの実行数を確認したところ1日の中で1回 13時頃に
プロジェクト:最終行表示
関数:on open
になっているものがあります。
→これは関係あるのでしょうか?

②var sh = SpreadsheetApp.openById("スプレットシートのID");
ではなく、var sh = SpreadsheetApp.getActiveSheet();に置き換えてみたのですが、
エラーで「null のメソッド「getLastRow」を呼び出せません。」と出てしまいます。

補足情報

GASのコードについても試行錯誤して確認しておりますが、特に問題点は見当たりませんでした。
未熟な点があるかと思いますが、どうぞよろしくお願い致します。

【5月31日変更点】↓
変更して、メールは配信されるようになりましたが、題名にある項目を反映不可の状態。

googleフォームでは、下記スクリプト内で定義している、「メールアドレス」、「担当者」以外にも
・申込者名
・番号
・日程
等をフォームから入力して、メールに反映しております。

「申込者名」を一部メールの件名に反映させたいのですが、うまくいきません。

【試みた内容】
const nameTitle = '申込者名';

const name = getValueByTitle(items,nameTitle);

で定義した後に、subjectのあとにnameを付ける
const subject = 'テスト中'+'【'+name+'】';

→自動配信されたメールの件名は「テスト中【undefined】」という表示になってしまう。
フォームから入力した内容が定義できていない模様です。

JavaScript

1FormApp.getActiveForm(); 2 3function onSubmit(e) { 4// 項目名 5const emailTitle = 'メールアドレス'; 6const nameTitle = '担当者'; 7 8// 件名 9const subject = 'テスト中'+'【'+name+'】'; 10 const newLine = '\n'; 11 12// フォームの内容一覧を取得する 13const items = e.response.getItemResponses(); 14 15// 自動返信するお問い合わせのあったメールアドレスを取得する 16const email = getValueByTitle(items,emailTitle); 17 18//担当者を取得する 19const name = getValueByTitle(items,nameTitle); 20 21// メール送信先 22var admin_name="" 23var admin = ""; // 管理者(必須) 24var cc = ""; // Cc: 25var bcc = admin; // Bcc: 26var reply = admin; // Reply-To 27 28 29if(email === '') { 30Logger.log('メールアドレスが入力されていませんでした'); 31return; 32} 33 34 35// 本文を作成する 36var body = ''; 37if(name !== '') { 38body += 'ご担当者様' + newLine + newLine; 39} 40body += 'お疲れ様です。' + newLine; 41body += '以下の内容にてお申込みがありましたのでご対応をお願い致します。' + newLine + newLine; 42items.forEach(function(item) { 43body += '【' + item.getItem().getTitle() + '】' + newLine; 44body += item.getResponse() + newLine + newLine; 45}); 46body += newLine + newLine; 47 48body += '【管理簿】' + newLine; 49body += 'https://docs.google.com/spreadsheets/xxxxxxxxx'; 50 51Logger.log(email); 52Logger.log(body); 53 54 55 56// メールを送信する 57GmailApp.sendEmail(email,subject,body); 58} 59 60/** 61* itemsからtitleの値を取得する 62*/ 63function getValueByTitle(items, title) { 64return items.filter(function(item) { 65return item.getItem().getTitle() === title; 66})[0].getResponse(); 67}

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

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

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

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

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

guest

回答2

0

フォーム送信時にその時に送信された内容でメールさくせいするなら、パラメーターから回答内容を受け取るのが確実かと思います。

投稿2019/05/15 02:44

hiroshi0240

総合スコア640

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

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

mm28

2019/05/15 05:47

>hiroshi0240さん ご回答ありがとうございます。 すみません、知識不足なのですが、パラメーターから回答を受け取るということは、スクリプトを書き換える必要があるということでしょうか。
mm28

2019/05/15 05:56 編集

>papinianusさん ありがとうございます。FormResponseが使えそうなので調べてみます。
hiroshi0240

2019/05/15 09:11

そうですね。 パラメーターeで受け取れば、確かe.response.getItemResponses()で回答を質問順に格納された配列で受け取れるはずですので、それを使って下さい。
mm28

2019/05/17 07:39

>papinianusさん、hiroshi0240さん ご回答ありがとうございます。頂いた情報で対応してみます。 対応が立て込んでおり、着手するのに時間がかかりそうですが、またご相談させて頂きます。 改善した場合はこちらに改めてポイントを記そうと思います。
mm28

2019/05/28 05:47 編集

報告が遅くなり申し訳ございません。 質問欄の補足情報に記入したスクリプトで一応動きました。 googleフォームでは、下記スクリプト内で定義している、「メールアドレス」、「担当者」以外にも ・番号 ・会社名 ・日程 等を入力して、メールに反映しております。 「番号」を一部メールの件名に反映させたいのですが、うまくいきません。 【試みた内容】 const nameTitle = '申込者名'; const name = getValueByTitle(items,nameTitle); で定義した後に、subjectのあとにnameを付ける const subject = 'テスト中'+'【'+name+'】'; →自動配信されたメールの件名は「テスト中【undefined】」という表示になってしまう。  フォームから入力した内容が定義できていない模様です。
papinianus

2019/05/28 09:15

申込者名というのは回答項目にあるのですか? 番号ではなくて? あとconstに再代入してないですよね?
hiroshi0240

2019/05/28 10:31

constに再代入はできない=前の定義がそのまま残ることになると思うので、その場合は最初の担当者が記入されると思いますが、undefinedになるんですよね。ざっと見た感じ、papinianusさんのご指摘以外におかしな部分は見当たらないので。回答項目に「申込者名」があるとしてエラーのでたコード全体を見てみたいですね。
mm28

2019/05/31 04:30 編集

>papinianusさん>hiroshi0240さん ご連絡遅くなり申し訳ありません。 スクリプト内で定義している、「メールアドレス」、「担当者」以外にも フォームで、「申込者名」「番号」「会社名」「日程」…などを入力する項目があり、件名には「申込者名」「番号」の2つを反映させたいです。(←申込者名だけといっていましたが、番号も追記したいです。すみません...) この2つを反映させる場合に使用するコードが分からない状況です。 回答項目に「申込者名」「番号」がある場合も、補足情報に書いたコードで動きます。 エラーは件名に「テスト中【undefined】」となるのみで、メール本文は正常に動作しています。
papinianus

2019/05/31 04:29

問題を誤解してました 「const subject = 'テスト中'+'【'+name+'】';」を > //担当者を取得する const name = getValueByTitle(items,nameTitle); ---ココ に移動してください。
mm28

2019/05/31 05:02

>papinianusさん ご回答ありがとうございます。 件名を定義する場所が違っていたのですね。---ココに記入し、無事反映されました。 「申込者名」「番号」については、「メールアドレス」「担当者」同様にコードで定義した後に 件名に導入したら、うまく反映されました。詳細のスクリプトについては、下記解決方法に明記します。 ありがとうございました。
guest

0

自己解決

最終的に下記スクリプトにて、うまく動くようになりました。
googleスプレッドシートでGASの記載をする場合は、2重に送信される事象があるようなので
googleフォーム側でGASコードを記載するほうがよさそうです。

メールの件名に入れたいものをconstで定義し、内容を取得したスクリプトの後に

const subject = 'テスト中'+'【'+company+''+number+'】';

を書くことで、うまく反映されました。

jabascript

1FormApp.getActiveForm(); 2 3function onSubmit(e) { 4 // フォームのメールアドレスとお名前の項目名 5 const emailTitle = 'メールアドレス'; 6 const nameTitle = '担当者'; 7 const companyTitle = '申込者名'; 8 const numberTitle='申込書番号'; 9 10 11 12 // メールで使う定数 13  const newLine = '\n'; 14 15 // フォームの内容一覧を取得する 16 const items = e.response.getItemResponses(); 17 18 // 自動返信するお問い合わせのあったメールアドレスを取得する 19 const email = getValueByTitle(items,emailTitle); 20 21 // 担当者を取得する 22 const name = getValueByTitle(items,nameTitle); 23 const company = getValueByTitle(items,companyTitle); 24 const number= getValueByTitle(items,numberTitle); 25 const subject = 'テスト中'+'【'+company+''+number+'】'; 26 27 28 // メール送信先 29 var admin_name="xxxxxxx@gmail.com" 30 var admin = "xxxxxxx@gmail.com"; // 管理者(必須) 31 var cc = ""; // Cc: 32 var bcc = admin; // Bcc: 33 var reply = admin; // Reply-To 34 35 36 if(email === '') { 37 Logger.log('メールアドレスが入力されていませんでした'); 38 return; 39 } 40 41 42 // 本文を作成する 43 var body = ''; 44 if(name !== '') { 45 body += 'ご担当者様' + newLine + newLine; 46 } 47 body += 'お疲れ様です。' + newLine; 48 body += '以下の内容にてお申込みがありましたのでご対応をお願い致します。' + newLine + newLine; 49 items.forEach(function(item) { 50 body += '【' + item.getItem().getTitle() + '】' + newLine; 51 body += item.getResponse() + newLine + newLine; 52 }); 53 body += newLine + newLine; 54 55 body += '【管理簿】' + newLine; 56 body += 'https://docs.google.com/spreadsheets/xxxxxxxxxxxx/'; 57 58 Logger.log(email); 59 Logger.log(body); 60 61 62 63 // メールを送信する 64 GmailApp.sendEmail(email,subject,body); 65} 66 67/** 68* itemsからtitleの値を取得する 69*/ 70function getValueByTitle(items, title) { 71 return items.filter(function(item) { 72 return item.getItem().getTitle() === title; 73 })[0].getResponse(); 74}

投稿2019/05/31 05:07

mm28

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問