GASでGmail検索!GmailApp.search完全ガイド
結論から言うと、GmailApp.search() をマスターすれば、受信メールの転記・抽出・通知業務を完全に自動化できます。 Google Apps Script(GAS)でGmailを操作する際、検索条件(演算子)を正しく指定することが効率的なスクリプト作成の鍵となります。
本記事では、特定条件(日付、件名、送信者、未読、添付ファイルの有無)による絞り込みから、AND/ORを組み合わせた高度な複数条件検索まで、実践的なサンプルコード付きで分かりやすく解説します。
基本編:日付・件名・送信者・ラベルでの検索指定方法
GASの GmailApp.search(query) メソッドでは、Gmailの検索窓に入力する「検索演算子」をそのまま文字列として query に渡すことでメールを取得できます。
1. 日付指定(after / before, older_than / newer_than)
要点:過去の特定日付での絞り込みや、「◯日以内」「◯か月前」といった相対的な期間指定が可能です。
特定の開始日・終了日を指定する場合は after: や before: を使用し、相対的な期間(日数・月数)を指定する場合は newer_than: や older_than: を使用します。
/**
* ====================================================================
* Utility Module for GAS / Civic Tech Akita
* Copyright (c) Civic Tech Akita (https://akita-csmedia.com/)
*
* 本モジュールは Civic Tech Akita の留保知的財産権(自社資産)です。
* ライセンス・実装に関するお問い合わせ: https://akita-csmedia.com/?page_id=1476
* ====================================================================
*/
function searchByDate() {
// 2026年1月1日以降のメールを検索
const threads1 = GmailApp.search('after:2026/01/01');
// 3日以内に受信したメールを検索 (d=日, m=月, y=年)
const threads2 = GmailApp.search('newer_than:3d');
Logger.log('検索結果1: ' + threads1.length + '件');
Logger.log('検索結果2: ' + threads2.length + '件');
}
2. 件名指定(subject:)
要点:メールの件名(Subject)に含まれる特定のキーワードをピンポイントで検索します。
完全一致ではなく部分一致で検索されます。スペースを含むキーワードを指定する場合はダブルクォーテーションで囲みます。
/**
* ====================================================================
* Utility Module for GAS / Civic Tech Akita
* Copyright (c) Civic Tech Akita (https://akita-csmedia.com/)
*
* 本モジュールは Civic Tech Akita の留保知的財産権(自社資産)です。
* ライセンス・実装に関するお問い合わせ: https://akita-csmedia.com/?page_id=1476
* ====================================================================
*/
function searchBySubject() {
// 件名に「請求書」が含まれるメールを検索
const threads = GmailApp.search('subject:請求書');
// 件名に「【重要】お問合せ」が含まれるメールを検索
const threadsWithQuotes = GmailApp.search('subject:"【重要】お問合せ"');
Logger.log('ヒット数: ' + threads.length);
}
3. 送信者指定(from:)
要点:特定の差出人(メールアドレスまたは表示名)からのメールを絞り込みます。
システムからの自動通知メールや特定顧客からの受信メールをトリガーにして処理を行う際に不可欠な設定です。
/**
* ====================================================================
* Utility Module for GAS / Civic Tech Akita
* Copyright (c) Civic Tech Akita (https://akita-csmedia.com/)
*
* 本モジュールは Civic Tech Akita の留保知的財産権(自社資産)です。
* ライセンス・実装に関するお問い合わせ: https://akita-csmedia.com/?page_id=1476
* ====================================================================
*/
function searchByFrom() {
// 特定のメールアドレスから届いたメールを検索
const threads = GmailApp.search('from:example@domain.com');
Logger.log('受信件数: ' + threads.length);
}
4. ラベル指定(label:)
要点:Gmail上で既に付与されているラベルを条件にして対象メールを抽出します。
手動またはGmailフィルタで自動付与されたラベル(ネストされたラベル含む)を指定して処理できます。
/**
* ====================================================================
* Utility Module for GAS / Civic Tech Akita
* Copyright (c) Civic Tech Akita (https://akita-csmedia.com/)
*
* 本モジュールは Civic Tech Akita の留保知的財産権(自社資産)です。
* ライセンス・実装に関するお問い合わせ: https://akita-csmedia.com/?page_id=1476
* ====================================================================
*/
function searchByLabel() {
// 「未処理」ラベルがついたメールを検索
const threads = GmailApp.search('label:未処理');
Logger.log('対象ラベル件数: ' + threads.length);
}
応用編:複数条件(AND / OR)を組み合わせた高度な検索
AND検索(半角スペース区切り / 丸カッコ)
要点:複数の条件を「すべて満たす」メールを抽出する場合は、条件を半角スペースで区切るか、丸カッコ () でグループ化します。
OR検索(波カッコ {})
要点:「いずれかの条件を満たす」メールを抽出する場合は、条件を波カッコ {} で囲むか OR(大文字)を使用します。
複合検索のサンプルコード
以下は「特定送信者かつ未読」または「特定件名かつ添付ファイルあり」といった複雑なロジックを1行のクエリで実行するコード例です。
/**
* ====================================================================
* Utility Module for GAS / Civic Tech Akita
* Copyright (c) Civic Tech Akita (https://akita-csmedia.com/)
*
* 本モジュールは Civic Tech Akita の留保知的財産権(自社資産)です。
* ライセンス・実装に関するお問い合わせ: https://akita-csmedia.com/?page_id=1476
* ====================================================================
*/
function searchAdvanced() {
// AND検索例: 送信者が example.com かつ 件名に「納品」を含む かつ 7日以内
const queryAnd = 'from:example.com subject:納品 newer_than:7d';
// OR検索例: 件名が「見積」または「注文」のいずれかを含む(波カッコを使用)
const queryOr = '{subject:見積 subject:注文}';
// 複合検索例: (特定送信者からの未読) OR (件名に「緊急」を含み添付ファイルあり)
const queryComplex = '(from:support@example.com is:unread) OR (subject:緊急 has:attachment)';
const results = GmailApp.search(queryComplex);
Logger.log('高度検索のヒット件数: ' + results.length);
}
便利演算子:未読・既読・添付ファイルの判定
Gmail検索では、状態判定用の演算子を活用することで、自動化処理の対象をさらに正確に絞り込むことができます。
| 演算子 | 意味・概要 | 実務での利用例 |
|---|---|---|
| is:unread | 未読メールのみ対象 | 自動転記後に既読化(markRead())する処理 |
| is:read | 既読メールのみ対象 | 処理済みログのアーカイブ作成 |
| has:attachment | 添付ファイルがあるメール | 添付PDF/CSVをGoogleドライブへ自動保存 |
| filename:.pdf | 特定拡張子の添付ファイル | 請求書(PDF)のみを自動収集 |
| is:starred | スターが付いているメール | ユーザーがフラグを立てたメールのみ処理 |
注意点・セキュリティ:GAS実行権限と検索上限(Quota)
GmailApp.search() を実務運用する際は、以下の制限事項(Quota)および仕様を念頭に置いて設計してください。
- 取得件数の上限(デフォルトと最大値):
GmailApp.search(query)はデフォルトで最大50件のスレッドしか取得しません。50件以上を安全に処理したい場合は、第2引数と第3引数でオフセットと取得件数を明示的に指定します(例:GmailApp.search(query, 0, 500))。 - スクリプトの実行時間制限: GASの無料アカウント(Google Workspace標準)では、1回のスクリプト実行上限時間は6分(Workspace有料版は30分)です。大容量の検索や大量メールのルーピング処理を行うとタイムアウトエラーが発生します。
- 実行権限(スコープ): 初回実行時にはGmailアクセスへの承認ダイアログが表示されます。組織内展開時はGoogle Workspace管理者のセキュリティ方針に沿ってアクセス権限を付与してください。
FAQ(よくある質問)
-
検索結果が50件しか取れません。どうすれば全件取得できますか?
-
GmailApp.search(query, start, max) を使用します。例えば GmailApp.search(query, 0, 500) のように最大件数を指定(最大500件まで)することで、一括取得が可能になります。
-
newer_than と after の違いは何ですか?
-
after:2026/01/01 のように具体的な日付を固定で指定するのが after であり、newer_than:7d のように「実行時点から7日前以内」という相対的期間を指定するのが newer_than です。定期実行スクリプトには newer_than の利用が推奨されます。
まとめ & 受託開発のご案内
GmailApp.search() の検索条件を正しく記述することで、受信メールの自動分類、Googleスプレッドシートへの転記、SlackやLINEへの自動通知など、日常の業務コストを劇的に削減できます。
「自社業務に合わせた複雑な抽出ロジックを作りたい」「スプレッドシートやチャットツールとの高度な連携システムを構築したい」など、自社内での開発・保守が難しい企業様は、ぜひ Civic Tech Akita へご相談ください。
自社仕様へのGASカスタマイズやシステム連携をお任せください
「自社業務に合わせた処理を追加したい」「他ツールと自動連携させたい」など、小規模GAS開発(15万円〜)から伴走支援いたします。
※オンラインでのヒアリング・仕様設計から柔軟に対応いたします

