実現したいこと
GAS 送付エラーになったメールの内容を重複なくスプレッドシートに出力したい。
前提
Googleフォームの回答をトリガーに、フォームに入力されたアドレスへメールが自動送信されるGASを作成しました。
その際に入力されたアドレスにメールが届かない(送付エラー)場合に、その内容(日時、件名、本文、メッセージID)をスプレッドシートに出力するGASを作成したいです。
仕組みとしては、
1,エラーメールを受信するとにGメール内で作成した「送付エラー」ラベルが付く
2,プログラムが実行されると、スプレッドシートに出力され、該当メールに「処理済み」ラベルが付く
4,次回実行時は「処理済み」ラベルが付いたメールを除いてプログラムを実行される。(重複して出力されない)
というようなものです。
発生している問題
プログラムを実行すると、「処理済み」のメールフォルダに入っているメールの内、本日送付エラーになった別のメールの内容もスプレッドシートに出力されてしまう。
(昨日以前に送付エラーになっているメールは出力されないので、プログラム上では当日についた処理済みラベルは検知されないのでしょうか…?)
該当のソースコード
//送付エラーのメール内容をスプレッドシートに吐き出すGAS function getGmailToSS() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('errordata_gmail'); const searchlabel = '"送付エラー"'; const threads = GmailApp.search('label:(' + searchlabel + ') -label:処理済み'); let lastRow = sheet.getRange("A:A").getValues().filter(String).length + 1; for(const n in threads){ const thread = threads[n]; const msgs = thread.getMessages(); msgs for(m in msgs){ const msg = msgs[m]; const date = msg.getDate(); const subject = msg.getSubject(); const body = msg.getPlainBody(); const id = msg.getId(); if(msgs.length > 0){ sheet.getRange(lastRow,1).setValue(date); sheet.getRange(lastRow,2).setValue(subject); sheet.getRange(lastRow,3).setValue(body); sheet.getRange(lastRow,4).setValue(id); lastRow++ const label = GmailApp.getUserLabelByName('処理済み'); thread.addLabel(label); } } } }
補足
メールのラベルは問題なく作動しています。
スプレッドシートへの出力も重複する事以外は問題なく出力されています。
GAS プログラミング共に初心者のため、初歩的なミスも含まれるかもしれませんがよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー