Google Apps ScriptでGmailを検索するには
Google Apps ScriptでGmailを検索するには、GmailAppクラスのsearchメソッドを利用します。
なんやら難しいことを書きましたが、ひらたくいうと
「Gmailに送られてきたメールを検索できる命令文がありますよ」
という以上でも以下でもありません。
下のScriptは「Google」から送られてきたメールを検索する例です。
const searchGmail = () => {
const threads = GmailApp.search('from: Google')
console.log(threads)
}
結果はこのようになります。

やっほい、意味不明な文字列をゲットできました。
なるほど、素人目には掴まされたような気しかしません。
これ、なんなのかっていうと、スレッドオブジェクトです。
もっと正確に言うとスレッドオブジェクトの配列です。
スレッドオブジェクトの配列なんて言われて一発でわかる人はいません。安心してください。
プログラムって大変。
スレッドオブジェクトってなんだ?
スレッドとは?
スレッドはGmailのスレッドのことです。

Gmailの受信箱にメールが並んでますよね。あれの正式名称はスレッドです。
赤枠でかこんだのは1スレッドです。上には3つのスレッドが並んでいるということになります。
オブジェクトとは?
オブジェクトってのはデータとメソッド(命令)がセットになった箱のようなものです。
オブジェクトの概念図

オブジェクトはデータとメソッド(命令)を持っております。
プログラムをする人がオブジェクトを操作するときは、メソッドを通じてデータを操作するのが一般的な流儀です。
市役所に住民票を取りに行ったら窓口の人に「住民票ください」と言いますよね?
勝手に執務スペースに入って住民票を取ろうとするのは行儀が悪いでしょう。
それと一緒です。
さて、ここで手に入れたスレッドオブジェクトはメソッドを通じて操作できます。
たとえば、スレッドの件名を取得するとか、スレッドに重要マークをつけるとか、ですね。
つまり、スレッドオブジェクトとはGmailのスレッドをプログラムで操作可能にしたものなんですよ。
配列ってなんだ?
手に入れたのは単なるスレッドオブジェクトではありません。
スレッドオブジェクトの配列です。
今回は送信者が「Google」のスレッドを検索して取得しましたが、複数件のスレッドがヒットする可能性がありますよね。
複数件のデータは配列という形式で扱います。
よって、スレッドオブジェクトの配列なんです。
スレッドオブジェクト配列の概念図

実は一つのスレッドは、さらにメッセージの配列をしたがえています。
Gmail画面でスレッドを選択するとこんな画面がひらきますよね。

赤枠で囲った部分が1つのメッセージで、このスレッドには3つのメッセージがあるということになります。
だからスレッドの中にはメッセージの配列があるって理屈なんですね。
スレッドから一番最初のメッセージの件名を取り出す
ためしに「Google」から送られてきたメールのスレッドに含まれている最初のメッセージの件名を取り出してみます。
スレッドの最初のメッセージの件名を取り出すコード
const searchGmail = () => {
const threads = GmailApp.search('from: Google')
const subjects = threads.map(thread => {
return thread.getFirstMessageSubject()
})
console.log(subjects)
}
結果はこうなります。

差出人が「Google」のスレッドは5通あって、スレッドのメッセージの件名も5つ取り出せました。
GmailApp.searchというメソッドはGmailの受信箱からクエリ(検索条件)に合致する複数のスレッドを取り出す命令なんですね。
では次にどんなクエリ(検索条件)が使えるのか見てみましょう。
GmailApp.searchメソッドで利用できる検索条件
よく使う検索条件です。もちろん他にもあります。
| どんな条件で検索したいか | クエリ(検索条件) |
| 特定の送信者からのメールを検索したい | from: 送信者名 例)from: Google |
| 特定の受信者のメールを検索したい | to: 受信者名 例)to: 山田太郎 |
| 件名で検索したい | subject: 件名 例)subject: 【重要】お疲れ会のお知らせ |
| ラベルで検索したい | label: ラベル名 例)label: 会社 |
| 重要マークがついたメールを検索したい | is: important 例)is: important |
| スターがついたメールを検索したい | is: starred 例)is: starred |
| 未読のメールを検索したい | is: unread 例)is: unread |
| 指定の日付以降のメールを検索したい | after: 日時 例)after: 2024/02/28 |
| 指定の日付以前のメールを検索したい | before: 日時 例)before: 2024/02/28 |
| 添付ファイルのあるメールを検索したい | has: attachment 例)has: attachment |
| CC、BCCの受信者で検索したい | cc: CC受信者 bcc: BCC受信者 例)cc: CC太郎, bcc: BCC太郎 |
| 複数条件(AND条件)で検索したい | (複数条件) 例)subject: (Google セキュリティ通知) |
応用編① 件名と送信者をAND条件で絞り込んで検索する
件名に「通知」が含まれる
かつ
「Google」から送信されたメールを検索します。
const threads = GmailApp.search('subject: 通知 from: Google')
threadsという変数には件名と送信者のAND条件で絞り込まれたスレッドオブジェクトが格納されます。
異なるクエリ(検索条件)をAND条件にする場合はクエリ同士を半角スペースで区切ります。
応用編② 件名と送信者をOR条件で絞り込んで検索する
件名に「通知」が含まれる
または
「Google」から送られてきたメールを検索します。
const threads = GmailApp.search('from: Google OR subject: 通知')
OR条件なのでどちらかの条件に該当するスレッドを見つけ出します。
異なるクエリ(検索条件)を OR で区切ればオーケーです。(ORの前後は半角スペース)
応用編③ 未読、件名、送信者をAND条件とOR条件で絞り込んで検索する
未読
かつ
件名に「通知」が含まれる
または
「Google」から送られてきたメールを検索します。
const threads = GmailApp.search('is:unread from: Google OR subject: 通知')
AND条件は半角スペースで区切り、OR条件は OR で区切ります。
このようにしてGmailを検索して、合致するスレッドを見つけ出すことができます。
ちなみにメッセージの中身を検索することはGmailApp.searchではできません。
なぜならGmailApp.searchはあくまでスレッドの情報を検索するメソッドだからです。
メッセージを検索するには別の方法が必要ってわけですね。
快適なGmailメソッドライフはすぐそこに。
