Ribbit.work

記事のトップ画像

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

Google Apps Script

last modified date2021-12-15

publish date2021-8-11

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