概要
Gmailで受信したメールをGoogle Apps Scriptで処理する際には、同じメールを何度も処理するのを防ぐため、未処理のメールを判定する必要があります。
判定方法を3つ紹介します。
1. 未読メールは未処理
人間が読まずに自動処理するメールの場合、既読フラグ(is:unread)を流用するのが簡単です。
前提として、受信したメールが人間の目に触れないよう、Gmailのフィルタ設定でInbox以外のフォルダに振り分けます。情報収集用など、あまり重要でないメールであれば、Trashに振り分けると30日後に自動削除されて便利です。
以下はアマゾンのおすすめメールを処理する例です。
const criteria = 'from:store-news@amazon.co.jp in:trash is:unread'
const threads = GmailApp.search(criteria,0,1)
for (let t = 0; t < threads.length; t++) {
let messages = threads[t].getMessages()
let message = messages[messages.length - 1]
// 処理
message.markRead() // 既読にする
}
上記では端折っていますが、同じスレッドで複数のメールが来るケースでは、スレッド内の全未読メールを処理する必要があると思います。
2. ラベル付きスレッドは未処理
人間も読むメールでは、既読フラグは使えません。
この場合はラベルで判定する手があります。
Gmail受信時にフィルタでラベルをつけて、ラベルがついているスレッドを処理対象とします。処理後はラベルを外します。
以下は、unprocessedラベルとcustomerラベルがついた、客先から来た未処理メールを処理する例です。
const label = GmailApp.getUserLabelByName('unprocessed')
const criteria = 'label:unprocessed AND label:customer'
const threads = GmailApp.search(criteria, 0, 2)
for (let t = 0; t < threads.length; t++) {
// 処理
threads[t].removeLabel(label) // unprocessedラベルを外す
}
3. ラベルなしスレッドは未処理
逆に、処理した際にラベルをつけて、ラベルがついていないスレッド(-label:…)を処理対象とする手もあります。
Gmailでフィルタを設定しなくても済む利点があります。
ただし、保存するメールでラベルがずっと残るのが気になるほか、処理対象のメールをGASで検索するのが重くなりそうなので、使っていません。