Googleフォームで受けつけた内容をもとに、GoogleAppsScirptを使ってGmailで指定日時にメールを送信したいのですが、
同じ日時に複数の人への送信ができません。
コードのどこが間違っているか、またどのようにすればいいか教えていただけないでしょうか。
よろしくお願いいたします。
送信についての条件
- 送信する日時:9時、10時、11時など、毎時0分。下書きメールの件名に記載
- 送信する数:日時によって違う
- 送信先:毎回異なる
- 送信メール:Googleフォームの回答受けつけ時に、その内容をもとに下書きメールを別のscriptであらかじめ作成
スクリプトが行っていること
下書きのメールを取得し……
- 下書きメールの件名に {西暦年/月/日 時:分}(例:{2019/01/31 13:00}) があれば、その日時を抽出して、指定日時送信のscriptが実行された時間よりも件名の日時が過去の日時であれば送信する。
- 件名に {西暦年/月/日 時:分} がない、もしくは件名の日時がscript実行時の日時よりも未来であれば送信しない。
スクリプトのトリガー
最初はトリガーを1分に1回で設定していたが、GASのGmail読み取り制限に引っかかってしまったため、
現在は特定の日時にトリガーを作成するscriptを使用して、指定日時送信メールのscriptを実行させている。
問題点
関数のデバッグは、件名の日時を過ぎてから行っているが、
下書きメールの件名 {西暦年/月/日 時:分} の日時が同じものが複数あっても、画像の赤枠部分の1件しか送信されていない。
なお、下書き16件分の中にはGmailに設定してある返信定型文や、件名に**{西暦年/月/日 時:分}**がないものも含まれる。
ちなみに、件名に**{西暦年/月/日 時:分}**がある下書きメールを全て削除すると、ログでは全ての下書きメールが出てきます。
GoogleAppsScript
1function delaySendDraftMail() { 2 var drafts = GmailApp.getDraftMessages(); 3 var len = drafts.length; 4 Logger.log('下書きの数(len):' + len); 5 //下書きがなければ終了 6 if (!len) { 7 return false; 8 } 9 //現在時刻を取得 10 var now = (new Date()).getTime(); 11 //下書きの数だけ繰り返す 12 for (var i = 0, l = len; i < l; i++) { 13 var mes = drafts[i]; 14 Logger.log('型(mes):' + typeof mes); 15 16 if ('object' !== typeof mes) { 17 continue; 18 } 19 //件名を取得 20 var str = mes.getSubject(); 21 Logger.log('件名(str):' + str); 22 //件名から日時を抽出 23 var match = str.match(/^(\{(\d{4}[/\-]\d{1,2}[/\-]\d{1,2} \d{1,2}:\d{1,2})\}) ?(.*)?/); 24 Logger.log('件名から抽出した日時(match):' + match); 25 //日時が抽出できないならスキップ 26 if (!match || !match[1]) { 27 continue; 28 } 29 //時間を取得 30 var time = (new Date(match[2].replace(/\-/g,'/')+' +09:00')).getTime(); 31 Logger.log('時間(time):' + time); 32 //時間を取得できない、または未来の時間なら無視 33 if(!time || (time && time>now)){ 34 continue; 35 } 36 //各情報をセット 37 var to = mes.getTo(); 38 var subject = match[3] || ''; 39 var body = mes.getPlainBody(); 40 var options = {}, val; 41 //必要な情報がなければスキップ 42 if (!to || !body) { 43 continue; 44 } 45 // From を変更した場合でも対応 46 var from = mes.getFrom(); 47 var aliases = GmailApp.getAliases(); 48 Logger.log('別名アドレス(aliases):' + aliases); 49 50 for (var i = 0, l = aliases.length; i < l; i++) { 51 var val = aliases[i]; 52 // From エイリアス一覧にマッチすれば From として使用 53 if (-1 !== from.indexOf(val)) { 54 options['from'] = val; 55 break; 56 } 57 } 58 if (val = mes.getCc()) {//Cc 59 options['cc'] = val; 60 } 61 if (val = mes.getBcc()) {//Bcc 62 options['bcc'] = val; 63 } 64 if (val = mes.getBody()) {//HTML本文 65 //bodyにdivタグがあればHTMLとみなす 66 if ( val.indexOf('<div')!==-1 ) { 67 options['htmlBody'] = val; 68 } 69 } 70 //添付ファイル 71 if (val = mes.getAttachments()) { 72 options['attachments'] = val; 73 } 74 // 送信! 75 var status = GmailApp.sendEmail(to, subject, body, options); 76 Logger.log('送信(status):' + status); 77 78 //送信したら下書きをゴミ箱へ 79 if (status) { 80 mes.moveToTrash(); 81 } 82 } 83}
回答2件
あなたの回答
tips
プレビュー