前提・実現したいこと
以前より、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}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/15 04:22
2019/05/15 05:47
2019/05/15 05:56 編集
2019/05/15 09:11
2019/05/15 14:36
2019/05/17 07:39
2019/05/28 05:47 編集
2019/05/28 09:15
2019/05/28 10:31
2019/05/31 04:30 編集
2019/05/31 04:29
2019/05/31 05:02