Ribbit's works

【GoogleAppsScript】Gmailから特定のメールを取得する

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

Google Apps Script を用いることで、紐づくアカウントの Gmail の情報を操作することができます。

ただ、この Gmail から取得できる情報が独自の構造を持っており、一発でほしいメール情報を取得することができません。

今回は対象のメールを Google Apps Script から取得する方法を紹介します。

Gmail から取得される情報の構造について

基本的に Gmail の情報を取得する際は、グローバルに定義されている GmailApp オブジェクトを使用します。

詳細は後ほど紹介しますが、この GmailApp から取得できるのは 1 件 1 件のメール情報ではなく、スレッドと呼ばれるメール群単位でのみ取得されます。

Gmail をよく利用されるかたは、UI でもメールがスレッド単位で集約されているのを見たことがあるかもしれません。

図解すると以下のような構造です。

GmailApp
  ├─ThreadA
      MailA
      MailB
      MailC

  ├─ThreadB
      MailA
      MailB
      MailC

  └─ThreadC
          MailA
          MailB
          MailC

ですので対象のメール 1 件を取得しようと思った場合、まずそのメールが含まれているスレッドを取得する必要があります。

コード

const MAIL_TITLE = '対象メールのタイトル';

// フリーワードでも広い範囲から検索してくれますが
// 今回はメールのタイトルから検索します。
const threads = GmailApp.search(`subject: "${MAIL_TITLE}"`);

for (const thread of threads) {
  // スレッド内のメールを全て取得
  const messages = GmailApp.getMessagesForThread(thread);

  for (const message of messages) {
    // メールのタイトルを取得
    const subject = message.getSubject();

    // タイトルが対象と一致している場合は終了
    if (~subject.indexof(MAIL_TITLE)) {
      return message;
    }
  }
}

解説

上述した通り、まず対象のメールが含まれているスレッドを取得します。

取得には GmailApp.search を使用し、引数には検索クエリを設定します。

検索クエリは UI を使用した場合の検索条件と同様で、スター付きだけ、ゴミ箱は除くなど詳細に設定できます。

ただ注意すべきなのは、ここで詳細に検索したとしても、取得されるのは条件にヒットしたメールを含むスレッドだということです。

ゴミ箱のメールを除いたとしても、対象メールのスレッド内にゴミ箱内のメールが含まれていた場合、そのメールまで取得してしまいます。

そのあたりの不要なメールを省く方法は別の記事でも紹介しています。

参考

Class GmailApp