【GAS】スレッドに引っ張られて、不要なメールまで取得してしまう場合の対処法

#Google Apps Script
にメンテナンス済み
記事のトップ画像

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 を指定すると、ゴミ箱のみのスレッドを検索結果から除外できます(ただしスレッド単位の絞り込みのため、混在スレッド内のゴミ箱メールはメール単位の判定で除きます)。