Ribbit's works

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

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

Google Apps Script を用いて Gmail のメールを取得する際、取得される単位はスレッド単位になります。

これが厄介で、1 通のメールが欲しい場合も、まずはスレッドから取得する必要があります。

データとしては、GmailApp からスレッドオブジェクトを検索して、スレッドオブジェクトにメールオブジェクトが紐づいているようなイメージです。

さらに、一部のメールをゴミ箱へ送り、見た目上スレッドを分断しても、内部的には同一スレッドとみなされ、ゴミ箱からもメールを拾ってきてしまいます。

これ自体はどうしようもないので、ゴミ箱のデータなのか、受信ボックスのデータなのかを判断してやる必要があります。

今回はその判断方法をご紹介します。

コード

const messages = GmailApp.getMessagesForThread(thread);

for (let message of messages) {
  if (message.isInInbox()) {
    console.log(message.getSubject() + 'は受信ボックスに入っています');
  } else if (message.isInTrash()) {
    console.log(message.getSubject() + 'はゴミ箱に入っています');
  }
}

解説

GmailMessage - isInInbox

GmailMessage オブジェクトはメール 1 件単位の情報を持っており、isInbox はそのメールが受信ボックスに存在する場合は True を返します。

一度対象メールを含むスレッドを取得する必要はありますが、そのスレッド内の各メールが受信ボックスにいるのかを判定し、目的のデータだけを取得することができます。

GmailMessage - isInTrash

isInTrash 関数も同様に、対象メールがゴミ箱に存在する場合は True を返します。

注意点

注意すべきなのは、GmailThread オブジェクトにも同じ関数が用意されているということです。

スレッド単位でゴミ箱にいるのか、受信ボックスにいるのか判定しても、画面で確認できる結果とは異なる場合があるので注意してください。