目次
Gmailの問い合わせ通知は、Gmailフィルタ、Apps Scriptの時間主導トリガー、Google Chatの受信Webhookを組み合わせれば実装できます。設計の要点は、未読メールを探すのではなく専用ラベルで対象を固定し、Chat送信の成功後に通知済みラベルを付けることです。Chatには初動に必要な情報だけを送り、メール本文と対応履歴は別の正本で管理します。
本記事は2026年6月29日時点のGoogle公式情報をもとにしています。Gmail、Apps Script、Google Chatの仕様、割り当て、管理者設定は変更される可能性があります。実装前に公式ドキュメントと自社のGoogle Workspace設定を確認してください。
Expert Q&A
Gmail通知を作る前に確認すること
湯田英也SakuraAI株式会社 代表 / ソフトウェアエンジニアQ. 未読メールを定期検索すれば十分ですか?
A. 十分ではありません。担当者が先に開くと未読条件から外れ、通知されない可能性があります。通知対象ラベルと通知済みラベルを分け、既読かどうかに依存しない構成にします。
Q. メール本文をChatへ載せるべきですか?
A. 原則として全文は載せません。件名、種別、受信日時、次の行動に絞ります。本文には個人情報、契約情報、認証情報が混ざる前提で考えます。
Q. Chat通知だけで問い合わせ管理できますか?
A. できません。Chatは知らせる場所です。担当、期限、状態、返信履歴は共有メールボックス、CRM、チケット、管理表などで管理します。
問い合わせメールを見落とさないためにChatへ通知する。この仕組み自体は小さく作れます。ただし、受信トレイを定期検索して本文を流すだけでは、既読による取りこぼし、二重通知、個人情報の拡散、通知後の放置が起きます。
この記事では、通知対象の決め方から検索、排他制御、成功後のラベル付与、失敗監視までを一つの運用として整理します。基礎はWebhookの使い方とApps Scriptで通知する方法も参照してください。
前提として一つだけ立場をはっきりさせておくと、Chatはあくまで「知らせる場所」で、正本はGmailや業務システム側に置きます。この線を引かずに本文も履歴もChatへ流し込むと、あとで検索も監査もできなくなります。
GmailからChatへ通知する3つの方法
| 方式 | 通知速度 | 実装負荷 | 向くケース | 主な注意点 |
|---|---|---|---|---|
| Apps Scriptの定期検索 | 設定した間隔 | 低〜中 | 小規模な社内通知、PoC | 厳密な即時性や配信保証はない |
| Gmail APIとCloud基盤 | 設計次第で高速 | 高 | 大量処理、再送、監査が必要 | Cloudプロジェクトと運用監視が必要 |
| 外部自動化サービス | サービス仕様による | 低〜中 | 複数SaaSをノーコード連携 | データ保存先、料金、実行上限を確認 |
このページでは、少量の問い合わせ通知を短期間で始めるApps Script方式を扱います。数秒単位の即時性、厳密な再送、監査ログが必要なら、最初からCloud基盤を検討します。
通知フロー
Gmail受信
問い合わせメールが届く
Gmailフィルタ
専用ラベルを付ける
時間主導トリガー
Apps Scriptを定期実行
未通知を検索
対象ラベルから処理済みを除く
Google Chat
初動に必要な情報だけ通知
通知済みラベル
送信成功後に付ける
正本で対応
担当、期限、返信を記録
Chatへの送信に失敗した場合は、通知済みラベルを付けません。次回実行で再び対象になります。一方、送信後にラベル付けだけ失敗すると重複通知の可能性が残るため、重要業務ではイベントIDを持つ台帳やキューが必要です。
通知対象をGmailフィルタで決める
Apps Scriptへ複雑な分類処理を詰め込む前に、Gmailフィルタで対象メールへChat通知_問い合わせラベルを付けます。
| 条件 | 検索例 | 向く用途 | 注意点 |
|---|---|---|---|
| 受信先 | to:contact@example.com | 専用窓口への問い合わせ | エイリアスや転送経路を確認する |
| 差出人 | from:partner.example | 特定取引先からの連絡 | なりすまし対策とは別に考える |
| 件名 | subject:(問い合わせ OR 見積) | 定型件名の受付 | 表記揺れで漏れる可能性がある |
| 添付 | has:attachment filename:pdf | 書類受信 | 添付内容の安全性は判定できない |
| 既存ラベル | label:問い合わせ | 手動・フィルタ分類済み | ラベル運用を変更すると影響する |
is:unreadは通知対象の条件に使いません。人が先に開く、モバイルで既読になる、別の自動処理が既読化するといった状況で、対象から外れるためです。
検索条件はGmailの検索欄で実データに対して確認してから、Apps Scriptへ移します。対象外メールと過去メールが混ざらないことを確認してください。
Chatへ送る情報を決める
メールには、本文以外にも個人情報や機密情報が含まれます。通知先スペースの参加者全員に見せる必要があるかを項目ごとに判断します。
| 項目 | Chatへの掲載 | 判断理由 |
|---|---|---|
| 受信日時 | 掲載する | 初動の遅れを判断できる |
| 問い合わせ種別 | 掲載する | 担当を判断できる |
| 件名 | 必要に応じて短縮 | 件名自体に個人情報が入る可能性がある |
| 差出人名 | 業務上必要な場合だけ | 氏名とメールアドレスの複製を避ける |
| メールアドレス | 原則掲載しない | Chatの閲覧範囲へ広げない |
| 本文 | 原則掲載しない | 機密情報、署名、過去の引用を含む |
| 添付ファイル | 直接転送しない | 権限、マルウェア、保管場所を別途管理する |
| 正本リンク | 権限確認後に掲載 | 担当者が元情報を確認できる |
Gmailのスレッドリンクは、Chat参加者全員が開けるとは限りません。チームで問い合わせを扱うなら、共有メールボックス、Googleグループ、CRM、チケット管理など、共同で参照できる正本を先に決めます。
Webhookを用意する
ブラウザ版Google Chatで通知先スペースを開き、アプリとインテグレーションから受信Webhookを追加します。Webhook URLには秘密のkeyとtokenが含まれるため、Apps ScriptのスクリプトプロパティへCHAT_WEBHOOK_URLとして保存します。
Google Chatの設定画面は、公開前に運用環境で手動撮影した実画面へ差し替えます。アカウント名、スペース名、メール情報、Webhook URLをマスキングしてから掲載してください。
Apps Scriptを実装する
次のコードは、専用ラベルが付き、通知済みラベルがないスレッドを最大20件取得します。同時実行による重複を減らすため、スクリプトロックを使います。
const SOURCE_LABEL = 'Chat通知_問い合わせ';
const DONE_LABEL = 'Chat通知済み';
function notifyInquiries() {
const lock = LockService.getScriptLock();
if (!lock.tryLock(1000)) {
console.log('別の通知処理が実行中です。');
return;
}
try {
const sourceLabel = GmailApp.getUserLabelByName(SOURCE_LABEL);
if (!sourceLabel) {
throw new Error(`${SOURCE_LABEL}ラベルがありません。`);
}
const doneLabel = GmailApp.getUserLabelByName(DONE_LABEL)
|| GmailApp.createLabel(DONE_LABEL);
const query = `label:${SOURCE_LABEL} -label:${DONE_LABEL} newer_than:7d`;
const threads = GmailApp.search(query, 0, 20).reverse();
threads.forEach((thread) => {
const messages = thread.getMessages();
const latest = messages[messages.length - 1];
const receivedAt = Utilities.formatDate(
latest.getDate(),
Session.getScriptTimeZone(),
'yyyy-MM-dd HH:mm',
);
const text = [
'*新しい問い合わせ*',
`受信日時: ${receivedAt}`,
`件名: ${truncate(latest.getSubject(), 120)}`,
'次の行動: 受付担当が正本を確認',
].join('\n');
sendToChat(text);
thread.addLabel(doneLabel);
});
} finally {
lock.releaseLock();
}
}
function truncate(value, maxLength) {
const text = String(value || '件名なし');
return text.length <= maxLength
? text
: `${text.slice(0, maxLength)}...`;
}
function sendToChat(message) {
const url = PropertiesService.getScriptProperties()
.getProperty('CHAT_WEBHOOK_URL');
if (!url) {
throw new Error('CHAT_WEBHOOK_URLが設定されていません。');
}
const response = UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json; charset=UTF-8',
payload: JSON.stringify({ text: message }),
muteHttpExceptions: true,
});
const status = response.getResponseCode();
if (status < 200 || status >= 300) {
throw new Error(`Chat通知に失敗しました。HTTP ${status}`);
}
}
GmailApp.search(query, start, max)のページ指定を使い、一度に取得する件数を制限しています。Google公式資料でも、スレッド全体のサイズが大きい場合は範囲を指定する検索が案内されています。
この方式の通知済みラベルはスレッド単位です。同じスレッドに後から返信が届いても、通知済みラベルが残るため再通知されません。新着メッセージ単位で管理する場合は、メッセージIDを別の台帳へ保存してください。
時間主導トリガーを設定する
Apps Scriptのトリガー画面から、notifyInquiriesを時間主導トリガーへ登録します。Google公式では、時間主導トリガーは最短で毎分実行できますが、厳密な時刻での実行は保証されません。
| 実行間隔 | 向く用途 | 利点 | 注意点 |
|---|---|---|---|
| 1〜5分 | 初動を急ぐ問い合わせ | 通知遅延を短くできる | 実行回数、競合、割り当てを確認する |
| 10〜15分 | 一般的な社内受付 | 速度と実行回数のバランスを取りやすい | 即時通知ではない |
| 1時間 | 定期確認で足りる連絡 | 実行回数を抑えられる | 初動が遅くなる |
| 日次集約 | 参考情報、レポート | 通知疲れを抑えられる | 緊急連絡には使わない |
インストール型トリガーは、作成者のアカウント権限で動きます。作成者の退職やアカウント停止で止まらないよう、所有者、引き継ぎ、実行権限を運用資料へ残します。
担当別に振り分ける
振り分けは、Apps Scriptで本文を解析する前に、Gmailフィルタとラベルで分ける方が保守しやすくなります。
| Gmailラベル | 通知先 | 通知条件 | 正本 |
|---|---|---|---|
Chat通知_営業 | 営業受付スペース | 見積、導入相談 | CRM |
Chat通知_採用 | 採用スペース | 応募、面談調整 | 採用管理システム |
Chat通知_サポート | サポートスペース | 障害、操作問い合わせ | チケット管理 |
Chat通知_要確認 | 受付管理スペース | どこにも分類できない | 共有メールボックス |
分類できなかったメールを捨てず、要確認へ逃がす経路を用意します。AI分類を追加する場合も、分類不能と低信頼度の扱いを先に決めます。
テストで確認する項目
| 確認項目 | テスト方法 | 合格条件 |
|---|---|---|
| 検索条件 | 対象と対象外のテストメールを送る | 対象だけに専用ラベルが付く |
| 既読メール | 受信後すぐに開いてから実行する | 既読でも通知される |
| 二重実行 | 短い間隔で関数を複数回実行する | 同じスレッドが連続通知されない |
| 送信失敗 | テスト用の無効Webhookで実行する | 通知済みラベルが付かず、失敗が記録される |
| 個人情報 | 本文、署名、添付を含むメールを送る | 設計した項目以外がChatへ出ない |
| 権限 | 担当者が正本を開く | 必要な担当者だけが参照できる |
| 引き継ぎ | 別の管理担当が設定を追跡する | ラベル、プロパティ、トリガーを確認できる |
本番運用で見る指標
Decision chart
Gmail通知で優先して監視する項目
問い合わせ対応への影響をもとにSakuraAIが整理した優先度です。
問い合わせが届いても担当が気づけない
通知導入の効果を直接測れる
通知後に放置されていないかを見る
通知疲れと誤対応につながる
個人情報と対応遅延に影響する
Apps Scriptの実行履歴で失敗を確認し、トリガーの失敗通知を受け取れる状態にします。GmailやURL Fetchの割り当て、Google Chatのスペース単位の送信制限も公式資料で確認します。
Webhookは一方向通知です。送信失敗にはHTTPステータスを使い、一時的なエラーには指数バックオフを検討します。大量のメールを同じスペースへ短時間に送る場合は、1件ずつ投稿せず集約やキューを使います。
Apps Script方式が向かないケース
- 数秒以内の通知を業務要件にしている
- 1件も重複・欠落させない配信保証が必要
- 大量のメールを常時処理する
- メッセージ単位の状態と再送履歴を監査する
- 複数メールボックスを組織横断で扱う
この場合は、Gmail API、Google Cloudのイベント処理、キュー、監視基盤を含めて設計します。Apps Scriptは小規模な通知には向きますが、メッセージ配送基盤ではありません。
専門家に聞く運用判断
Expert Q&A
公開前に湯田へ確認すること
湯田英也SakuraAI株式会社 代表 / ソフトウェアエンジニアQ. 最初に通知するメールはどう選びますか?
A. 見落としたときの損失が大きく、担当と次の行動が明確なメールです。全メールではなく、営業問い合わせや障害連絡など1種類から始めます。
Q. AIで本文を要約してChatへ送ってもよいですか?
A. 補助としては使えます。ただし、個人情報や契約情報を必要なく外部へ送らないこと、要約を正本にしないこと、低信頼度を要確認へ回すことが条件です。
Q. 通知が二重に飛ぶことがあります。原因は?
A. たいていは通知済みラベルを付ける前にChat送信でエラーが起きて、次の実行でまた拾ってしまうパターンです。『Chat送信が成功したらラベルを付ける』の順番を守り、既読条件ではなくラベルで対象を管理すれば防げます。
Q. 運用を始めてから何を改善しますか?
A. 通知の数ではなく、初回確認までの時間・未対応・重複・誤振り分けを見ます。ここが悪いときは、通知文を長くするより、対象条件と担当の割り当てを直すほうが効きます。
関連レシピ
分類、要約、返信下書きまで含めた設計はGmail自動化、フォーム回答の通知はフォーム回答をChatに通知する方法、双方向処理を含む全体像はGoogle Chat APIの解説を参照してください。
SakuraAIで支援できること
SakuraAIは、Gmailフィルタ、Apps Script、Google Chat通知、問い合わせ台帳まで設計・実装します。通知を作るだけで終わらせず、個人情報の境界、二重通知、失敗監視、正本、担当者の引き継ぎまで含めて構築します。
よくある質問
全部のメールではなく問い合わせだけ通知できますか?
できます。Gmailフィルタで問い合わせ用ラベルを付け、Apps Scriptではそのラベルだけを検索します。未読状態に依存すると、人が先に開いたメールを見落とすため、専用ラベルを基準にします。
同じメールが何度も通知されませんか?
Chatへの送信が成功した後に通知済みラベルを付け、次回検索から除外します。さらにLockServiceで同じスクリプトの重複実行を抑えます。ただし厳密な配信保証が必要なら、Apps Scriptとラベルだけで完結させず、外部のキューや台帳を使います。
新しい返信も通知できますか?
できますが、スレッドへ通知済みラベルを付ける方式では、その後の返信は対象外になります。返信単位で通知したい場合はメッセージIDを台帳で管理するか、Gmail APIを使う設計が必要です。
担当者ごとに振り分けられますか?
できます。営業、採用、サポートなどをGmailフィルタとラベルで先に分類し、ラベルごとに送信先Webhookを切り替えます。本文を毎回解析するより、明確な条件はフィルタへ任せた方が保守しやすくなります。
GmailのリンクをChatへ載せれば全員が開けますか?
開けるとは限りません。メールボックスの権限を持たない担当者は閲覧できません。共有メールボックス、Googleグループ、CRMなど、チームが参照できる正本を別途設計してください。
参考・一次情報
自動化相談
問い合わせメール対応を自動化する
分類・要約・返信下書き・Chat通知・Drive保存を一気通貫にします。
Gmail自動化を相談する