【GAS】スレッドに引っ張られて、不要なメールまで取得してしまう場合の対処法
Google Apps Script を用いて Gmail のメールを取得する際、取得される単位はスレッド単位になります。
これが厄介で、1 通のメールが欲しい場合も、まずはスレッドから取得する必要があります。
データとしては、GmailApp からスレッドオブジェクトを検索して、スレッドオブジェクトにメールオブジェクトが紐づいているようなイメージです。
さらに、一部のメールをゴミ箱へ送り、見た目上スレッドを分断しても、内部的には同一スレッドとみなされ、ゴミ箱からもメールを拾ってきてしまいます。
これ自体はどうしようもないので、ゴミ箱のデータなのか、受信ボックスのデータなのかを判断してやる必要があります。
今回は isInInbox と isInTrash を使った判断方法をご紹介します。
コード
const threads = GmailApp.search('subject:件名');
for (const thread of threads) {
for (const message of thread.getMessages()) {
if (message.isInInbox()) {
console.log(`${message.getSubject()}は受信ボックスに入っています`);
} else if (message.isInTrash()) {
console.log(`${message.getSubject()}はゴミ箱に入っています`);
}
}
}
解説
GmailMessage - isInInbox
GmailMessage オブジェクトはメール 1 件単位の情報を持っており、isInInbox はそのメールが受信ボックスに存在する場合は True を返します。
一度対象メールを含むスレッドを取得する必要はありますが、そのスレッド内の各メールが受信ボックスにいるのかを判定し、目的のデータだけを取得することができます。
GmailMessage - isInTrash
isInTrash も同様に、対象メールがゴミ箱に存在する場合は True を返します。
注意点
GmailThread オブジェクトにも isInInbox や isInTrash が用意されていますが、スレッド単位の判定です。スレッド内に受信ボックスのメールとゴミ箱のメールが混在していると、メール単位の状態と一致しません。
不要なメールを除外したい場合は、スレッドではなく GmailMessage 単位で判定してください。
また、GmailApp.search の検索クエリに in:inbox を指定すると、ゴミ箱のみのスレッドを検索結果から除外できます(ただしスレッド単位の絞り込みのため、混在スレッド内のゴミ箱メールはメール単位の判定で除きます)。