【GAS】Gmailから条件指定で検索して情報を取得する

GASgetInboxThreads,gmail,GmailApp,GmailApp.search,スプレッドシート

Google Apps Script(GAS)では、メールの内容を取得して様々な処理が可能です。この記事ではGASで条件指定して検索をかけ、Gmailの内容を取得する方法を解説します。

Gmailの情報取得ではメールの「スレッド」が重要な概念

「スレッド」とは

Gmailでは、指定したある条件(指定しなくてもよい)に一致するメールの一覧を「スレッド」といいます。

例えば「○○という件名がついたメール」「スター付きメール」「30日以内に受信したメール」等の条件を指定して、メールボックス内で一覧化することが可能です。

各スレッドでは開くとメッセージがカード状に時系列に重ねて表示されており、一つの条件についてのメッセージをまとめて見返せる便利な機能です。普段Gmailを使っているユーザーは自然と利用しているのではないでしょうか。

Gmailの情報取得ステップ

GASではGmailAppというクラスを用いて、この「スレッド」を一つの単位とした処理を行います。
まずはGmailからメールスレッドを取得し、その後該当スレッドに含まれている各メールを処理するという手順です。

メールスレッドを取得するには、大きく分けて3つの方法があります。

  1. 条件指定で検索してスレッドを取得する
  2. システムラベルからスレッドを取得する
  3. IDで検索してスレッドを取得する

もっとも自由度が高くよく使うのが1つ目の条件指定で検索する方法なので、この記事ではこちらをメインでご紹介します。後者2つも記事後半でご紹介しているのでぜひチェックしてみてください。

条件指定で検索しメール情報を取得する

searchメソッドで検索してスレッドを取得

GmailApp.search(query [, start, length])

  • query(必須):検索演算子(string)
  • start(任意):開始位置
  • length(必須):取得するスレッド数

普段Gmailを使っている方は、自然とメールボックス内で特定条件でメールを検索する行為を行っていると思います。探したいメールをスムーズに検索できる大変便利な機能ですが、GASでもsearchメソッドを使うことでほぼ検索が再現できます。

function myFunction() {

  // 抽出条件指定
  const query = 'is:starred'; //星付き

 //スレッド化
  const threads = GmailApp.search(query);

  for(const thread of threads){

    console.log(thread.getFirstMessageSubject());

  }
}

いろいろな検索演算子

上記のサンプルコードでは「is:starred」としてスター付きのスレッドを取得するコードでしたが、メールボックスでの検索と同様に様々な条件で検索をかけることが可能です。よく使う演算子を表にまとめたので参考に条件を作ってみてください。

演算子説明
from:送信者を指定するfrom:Tetsuo
to:受信者を指定するto:Mike
cc:Cc欄の受信者を指定するcc:Risa
bcc:Bcc欄の受信者を指定するBcc:Bob
subject:件名を検索対象にするsubject:会員登録のお知らせ
filename:添付ファイル名を検索対象にするfilename:examination.txt
OR または{ }OR条件を指定するfrom:Tetsuo OR to:Mike
AND または 半角スペースAND条件を指定するcc:Risa Bcc:Bob
除外、NOT条件を指定する-from:Tetsuo
“"完全一致“GASの基礎をまとめて学びたい方に!おすすめ記事3選"

searchメソッドで指定できる条件は下記の記事で詳細を解説しています。

searchメソッドを使った検索以外のスレッド取得方法

①:システムラベルを指定

システムラベルとは

システムラベルは「受信トレイ」「重要マークが付与されている」「送信済み」などの条件でデフォルトで指定されているラベルです。

メールボックス画面で各ラベルをクリックすると、該当するシステムラベルに該当するメールスレッド一覧を確認できます。

システムラベルの種類

スレッドを取得できるシステムラベル指定は下記の種類があります。

システムラベルメソッド
受信トレイgetInboxThreads
スター付きgetStarredThreads
下書きgetStarredThreads
迷惑メールgetSpamThreads
ゴミ箱getTrashThreads

ちなみに下書きは送信前なので、スレッドという概念はありません。メッセージのみの配列しか取得できず、下記の記事で解説しているようなスレッドの取り扱いでは制約があります。

サンプルコード

システムラベルの記述方法はどれも同じです。開始位置と取得数を引数としてスレッドを取得します。

GmailApp.getInboxThreads(開始位置, 取得数)

例えば、下記の記述では星付きのメールを一番上から3つ取得する記述になります。

function myFunction() {
  
  const threads = GmailApp.getStarredThreads(0,3); // メールを3取得

  for(const thread of threads){

    console.log(thread.getFirstMessageSubject()); // 件名をログ出力

  }

}

スレッド取得②:IDでスレッドを取得する

GmailスレッドのIDとは

各スレッドは一意に決まるIDが付与されています。このスレッドIDがわかっていれば、getTreadByIdでスレッドを取得できます。

サンプルコード

GmailApp.getThreadById(id);

function myFunction() {

  const starred_threads = GmailApp.getStarredThreads(0,3);
  const id = starred_threads[0].getId();

  const thread = GmailApp.getThreadById(id);
  console.log(thread.getFirstMessageSubject());

}

スレッドIDは、メールボックス上で確認することはできず、事前にgetIdメソッドで取得しておく必要があります。従って、getThreadByIdは、何らかの処理を実行した際にIDを保存しておいて再利用する、という使い方がメインになるでしょう。

まとめ

Gmailのスレッドを取得する3つの方法を解説しました。

  • システムラベルからスレッドを取得する
  • IDで検索してスレッドを取得する
  • 特定条件を指定して検索を行うことで取得する
この記事を書いた人

てつお
広告代理店出身、事業会社でWebマーケティングや開発の仕事をしている26歳です。プロフィール詳細はこちら
■Google広告認定資格|Google アナリティクス個人認定資格(GAIQ)|TOEIC920点