目次
- Google Chat Webhookとは
- Webhookが向く用途・向かない用途
- Webhookの作成手順
- テキストメッセージを送る
- 通知文に入れる7項目
- カード形式は情報整理とリンクに使う
- threadKeyで同じ案件をまとめる
- Apps Scriptから送信する
- URLを秘密情報として管理する
- レート制限と送信キュー
- 再試行で重複投稿しない設計
- 通知疲れを防ぐルール
- WebhookからChatアプリへ移る基準
- 導入手順
- 1. 通知専用でよいか確認する
- 2. テスト用Webhookで送信する
- 3. イベントIDとメッセージ形式を決める
- 4. キュー・再試行・重複防止を作る
- 5. 漏えい・廃止時の停止手順を試す
- 6. 指標を見て運用する
- よくある失敗
- SakuraAIで支援できること
Google Chatの受信Webhookは、固定されたスペースへ一方向の通知を送る最小構成です。監視、バッチ、フォーム、定期レポートには向きますが、承認・返信・入力処理には使いません。本番運用では、URLを秘密情報として管理し、イベントID、スレッド、送信キュー、指数バックオフ、重複防止、失敗監視まで用意します。
本記事は2026年6月28日時点のGoogle公式情報をもとにしています。Webhookの利用条件、メッセージ形式、クォータ、管理者設定は変更される可能性があります。実装前に公式ドキュメントと自社のGoogle Workspace設定を確認してください。
Expert Q&A
Webhookを作る前に確認すること
湯田英也SakuraAI株式会社 代表 / ソフトウェアエンジニアQ. Webhookで最初に自動化するなら何ですか?
A. 結果が明確で、通知先が固定された処理です。バッチ完了、監視アラート、フォーム受付、日次集計が向いています。承認や問い合わせ対応から始めない方がよいです。
Q. カードに承認ボタンを付ければ承認できますか?
A. Webhookはクリックイベントを受け取れません。確認画面を開くリンクは置けますが、承認で状態を更新するならChatアプリが必要です。表示できることと操作できることを分けます。
Q. Webhook運用で最も多い事故は?
A. URLの漏えいと通知の連打です。URLをログやコードへ残さず、同じスペースへ複数システムが送る場合はキューで流量を制御します。
Google Chatへシステム通知を送りたいだけなら、最初からChatアプリを開発する必要はありません。受信Webhookをスペースへ登録し、発行されたURLへJSONをPOSTすれば通知できます。
仕組みは単純ですが、作成手順だけで本番運用を始めると、URL漏えい、通知重複、429エラー、アラートの大量投稿が起きます。Webhookは簡単に作れるからこそ、止め方と失敗時の扱いを先に決めます。
Google Chat Webhookとは
受信Webhookは、外部サービスから特定のGoogle Chatスペースへ非同期の一方向通知を送る仕組みです。Webhookごとに登録先スペースが決まり、そのURLを使って別のスペースへ投稿することはできません。
| 観点 | 受信Webhook | Chatアプリ |
|---|---|---|
| 通信方向 | 送信元からChatへの一方向 | ユーザーとアプリの双方向 |
| 通知先 | 登録したスペース | 認証・メンバーシップに応じたスペース |
| ユーザー入力 | 受け取れない | メッセージ、コマンド、カード、ダイアログを受け取れる |
| 認証 | 秘密のWebhook URL | アプリ認証またはユーザー認証 |
| 準備 | スペースでWebhookを作成 | Cloudプロジェクト、Chat API、受信処理など |
| 向く用途 | 通知、アラート、定期報告 | 承認、申請、FAQ、対話、動的操作 |
WebhookはGoogle Workspace Marketplaceへ公開する仕組みでもありません。組織内で複数の利用者やスペースへ配布する製品にしたい場合は、Chatアプリを検討します。
Webhookが向く用途・向かない用途
Decision chart
受信Webhookの適性
一方向性、通知先の固定度、操作の必要性、失敗時の影響をもとにSakuraAIが整理した用途別スコアです。Google公式の評価ではありません。
結果を固定スペースへ送るだけで完結する
アラートIDでスレッド化し、監視画面へリンクできる
受付通知に向くが、担当引受は別の正本で管理する
集約して決まった時間に送信しやすい
本文や個人情報を載せすぎず、元メールへ誘導する
クリックイベントを受け取れないためChatアプリが必要
ユーザーのメッセージへ応答できない
Webhookの作成手順
Google公式の手順では、ブラウザ版Google Chatから設定します。
- 通知先のスペースを開く
- スペース名のメニューからアプリとインテグレーションを開く
- Webhookを追加する
- 用途が分かる名前とアイコンを設定する
- 発行されたWebhook URLをシークレット管理へ保存する
Webhookを追加する項目が表示されない場合は、組織で受信Webhookの利用が許可されているか、管理者へ確認します。モバイルアプリからはWebhookを構成できません。
Webhook名を通知Botやシステム通知だけにせず、監視_本番、フォーム_採用受付のように送信元と用途が分かる名前にします。漏えい・停止時に影響範囲を特定しやすくなります。
テキストメッセージを送る
最小の通知は、text を持つJSONをPOSTします。
curl -X POST "$GOOGLE_CHAT_WEBHOOK_URL" \
-H "Content-Type: application/json; charset=UTF-8" \
-d '{"text":"[INFO] 日次処理が完了しました"}'
GOOGLE_CHAT_WEBHOOK_URL はシークレット管理から実行時に渡します。コマンド履歴、CIログ、エラー出力へURLそのものを表示しないようにします。
通知文に入れる7項目
| 項目 | 例 | 目的 |
|---|---|---|
| 種別 | INFO / WARNING / ERROR | 優先度を判断する |
| イベントID | JOB-20260628-001 | 重複防止と追跡に使う |
| 発生元 | 日次集計、監視、フォームなど | どのシステムか分かる |
| 要点 | 何が起きたか | 一読で状況を把握する |
| 状態 | 成功、要確認、失敗 | 次の行動を判断する |
| 担当・期限 | 誰がいつまでに見るか | 投稿だけで放置しない |
| 正本リンク | 監視、台帳、元データ | Chatを正本にしない |
通知にシステムのログ全文を貼る必要はありません。エラーの要点と追跡IDを載せ、権限を設定した監視画面やログへリンクします。
カード形式は情報整理とリンクに使う
カード形式を使うと、見出し、項目、画像、ボタンを構造化できます。Webhookは一方向なので、ボタンは外部ページを開くリンクとして使います。
{
"cardsV2": [
{
"cardId": "monitoring-alert",
"card": {
"header": {
"title": "監視アラート",
"subtitle": "ALERT-2048"
},
"sections": [
{
"widgets": [
{
"decoratedText": {
"topLabel": "状態",
"text": "要確認"
}
},
{
"buttonList": {
"buttons": [
{
"text": "監視画面を開く",
"onClick": {
"openLink": {
"url": "https://example.com/alerts/2048"
}
}
}
]
}
}
]
}
]
}
}
]
}
カードに承認や完了という表示を置いても、Webhookはクリック結果を受信できません。外部画面を開くリンクは使えますが、Chat内の操作で状態を更新する場合はChatアプリを作ります。
threadKeyで同じ案件をまとめる
受信Webhookは、thread.threadKey と messageReplyOption を使ってスレッドを開始・返信できます。同じ障害、案件、バッチ実行を1つのスレッドへまとめると、スペースの流量を減らせます。
{
"text": "ALERT-2048: 応答時間が正常範囲へ戻りました",
"thread": {
"threadKey": "alert-2048"
}
}
Webhook URL側の messageReplyOption は、スレッドがない場合に新規作成するか、送信を失敗させるかを制御します。
| 設定 | 動作 | 向く用途 |
|---|---|---|
| REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD | 既存スレッドへ返信し、なければ新規作成 | 障害・案件の最初の通知と更新 |
| REPLY_MESSAGE_OR_FAIL | 既存スレッドへ返信し、なければ送信しない | 初回通知後だけ更新を許可したい処理 |
threadKey は通知文から毎回生成せず、アラートIDや案件IDから安定して作ります。キーが変わると、同じ事象が別スレッドへ分かれます。
Apps Scriptから送信する
Apps Scriptは、Gmail、Googleフォーム、スプレッドシート、Calendarなどを起点にWebhookへPOSTする実行基盤として使えます。
function notifyChat(message) {
const url = PropertiesService.getScriptProperties()
.getProperty("GOOGLE_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(`Google Chat webhook failed: HTTP ${status}`);
}
}
スクリプトプロパティはコード直書きより安全ですが、誰がプロジェクトとプロパティを閲覧・編集できるかも確認します。実行ログへURLや通知本文を不用意に出力しません。
URLを秘密情報として管理する
Webhook URLには key と token が含まれます。パスワードと同じように扱います。
| 管理項目 | 決めること |
|---|---|
| 所有者 | どの部署・担当者が管理するか |
| 用途 | どの送信元が何を投稿するか |
| 通知先 | 登録先スペースとメンバー |
| 保存場所 | 環境変数、シークレット管理、Script Propertiesなど |
| 利用システム | どのジョブ・サービスが参照するか |
| 発行・更新日 | いつ作成・交換したか |
| 停止手順 | 漏えい・廃止時に誰が削除するか |
Webhook URLを1本だけ作り、すべてのシステムで共有すると、漏えい時に影響元を特定できません。用途や送信元ごとに分けると、個別に停止できます。
レート制限と送信キュー
2026年6月28日時点のGoogle公式情報では、同じスペースへのメッセージ書き込みは原則1秒あたり1回で、受信Webhookには追加制限も適用されます。複数Webhookの送信量は同じスペースで共有されます。
| 発生状況 | 設計 |
|---|---|
| 短時間に大量イベント | キューで順番に送り、同種イベントを集約する |
| 429 Too Many Requests | 指数バックオフとランダムな待ち時間で再試行 |
| ネットワーク・500系 | 上限つきで再試行し、最終失敗を保存 |
| 400系 | 自動再試行せず、ペイロードを修正 |
| Webhook・スペース削除 | 停止扱いにし、管理者へ通知 |
すべてのイベントを即時に1件ずつ送るのではなく、緊急アラートは即時、定期結果は集約、回復通知は同じスレッドというように分けます。
再試行で重複投稿しない設計
送信元がタイムアウトした場合、Chat側では投稿済みでも、送信元は失敗と判断することがあります。無条件に再送すると同じ通知が増えます。
| 項目 | 内容 |
|---|---|
| イベントID | 元システムで一意のIDを発行する |
| 送信状態 | 未送信、送信中、成功、再試行、失敗を記録する |
| 試行回数 | 無限再試行を防ぐ |
| 最終HTTPコード | 原因分析に使う |
| threadKey | 同じ案件の更新先を固定する |
| 送信日時 | 遅延と再処理を確認する |
Webhookのレスポンスにはメッセージ全体が含まれず、name と thread.name が中心です。Webhookだけを正本にせず、送信元側にイベントと状態を残します。
通知疲れを防ぐルール
| 通知 | 推奨する扱い |
|---|---|
| 緊急障害 | 即時通知し、同じ障害はスレッドへ集約 |
| 警告 | 一定時間継続した場合やしきい値超過回数で通知 |
| 成功 | 重要ジョブだけ、または日次集約 |
| 件数レポート | 決まった時刻に1投稿へまとめる |
| 個人だけが対応する内容 | 広いスペースではなく正本や適切な通知先へ |
成功通知をすべて流すと、本当に見るべき失敗が埋もれます。通知件数ではなく、未対応、確認時間、誤通知を測ります。
WebhookからChatアプリへ移る基準
次の要件が出たら、Webhookへ機能を足すのではなくChatアプリを検討します。
- ユーザーのメッセージやメンションへ応答したい
- ボタンで担当引受、承認、差戻しを処理したい
- ダイアログで入力を受け付けたい
- 利用者ごとに権限を変えたい
- 動的に複数スペースやDMへ送信したい
- メッセージの更新・削除やメンバー管理が必要
Webhook・Chat API・Chatアプリ・Apps Scriptの全体像はGoogle Chat APIとは、対話型の設計はGoogle Chat Bot開発の設計パターンで解説しています。
導入手順
1. 通知専用でよいか確認する
ユーザー操作を受け取らず、通知先が固定スペースであることを確認します。承認や対話が必要ならChatアプリを選びます。
2. テスト用Webhookで送信する
本番スペースへ直接作らず、テストスペースでテキスト、カード、エラーを確認します。URLは最初からシークレット管理へ置きます。
3. イベントIDとメッセージ形式を決める
種別、イベントID、発生元、要点、状態、担当、期限、正本リンクを固定します。同じ事象をまとめるならthreadKeyも決めます。
4. キュー・再試行・重複防止を作る
429と一時障害は指数バックオフ、400系は停止、最終失敗は失敗キューへ残します。再送前にイベントIDの処理状態を確認します。
5. 漏えい・廃止時の停止手順を試す
Webhook削除、シークレット更新、送信元停止、スペース変更の手順を確認します。所有者不明のWebhookを作りません。
6. 指標を見て運用する
| 評価項目 | 見る内容 |
|---|---|
| 配信成功率 | 2xxで完了した通知の割合 |
| 通知遅延 | 元イベントからChat投稿までの時間 |
| 429・再試行 | 制限超過と回復状況 |
| 重複投稿 | 同じイベントIDが複数投稿された件数 |
| 最終失敗 | 再試行後も送れなかった件数 |
| 通知量 | スペース・種別・送信元ごとの件数 |
| 未対応 | 要対応通知の担当・状態が変わらない件数 |
| 不要Webhook | 送信元や所有者が不明なWebhook |
よくある失敗
| 失敗 | 起きること | 回避策 |
|---|---|---|
| Webhookで承認を実装する | クリック結果を受信できない | Chatアプリを使う |
| URLをコード・ログへ残す | 第三者に投稿される可能性がある | シークレット管理とログ除外 |
| 全システムでURLを共有する | 漏えい元と影響範囲を特定できない | 用途・送信元ごとに分ける |
| 大量通知を直接POSTする | 429と通知の連打が起きる | キュー、集約、スレッドを使う |
| 即時に連続再試行する | 制限超過を悪化させる | 指数バックオフと上限を設ける |
| タイムアウトを無条件再送する | 同じ通知が重複する | イベントIDと送信状態を持つ |
| 成功通知を全部流す | 重要な警告が埋もれる | 重要度と集約ルールを決める |
SakuraAIで支援できること
SakuraAIは、Google Chat Webhookの作成だけでなく、通知対象、メッセージ、スレッド、送信キュー、再試行、重複防止、シークレット管理、監視、停止手順まで設計します。
通知だけならWebhookで小さく始め、ユーザー操作や動的な権限が必要になった時点でChatアプリとChat APIへ移行します。Apps Script、既存システム、Cloud実行環境も要件に合わせて選びます。
Expert Q&A
最後に湯田へ確認
湯田英也SakuraAI株式会社 代表 / ソフトウェアエンジニアQ. Webhook導入が成功した状態とは?
A. 通知が届くだけでなく、重複せず、重要なものが埋もれず、担当者が正本へ移って対応でき、失敗時に再処理できる状態です。投稿件数の多さは成功指標ではありません。
Q. 1つのスペースへWebhookはいくつ作りますか?
A. 最低でも用途や送信元を識別できる単位に分けます。すべてを1本にすると漏えい時に全連携を止めることになります。ただし増やしすぎず、所有者と利用先を台帳で管理します。
Q. 本番前に最低限試すことは?
A. 正しい投稿、400、429、ネットワーク失敗、同一イベント再送、Webhook削除です。スレッドを使う場合は、既存キーと存在しないキーの動作も確認します。
よくある質問
Google ChatのWebhook作成に管理者権限は必要ですか?
Webhookを追加できるかは、Google Workspaceの管理者設定とスペースでの権限によります。アプリとインテグレーションにWebhook追加が表示されない場合は、組織の管理者へ利用可否を確認してください。
Webhookでボタン付きカードを送れますか?
カード形式のメッセージやリンクを開くボタンは送れます。ただしWebhookは一方向なので、ボタンクリックを接続先アプリへ返して状態を変更する承認処理はできません。双方向操作にはChatアプリを使います。
Webhookで同じ案件をスレッドにまとめられますか?
できます。メッセージ本文にthreadKeyを指定し、Webhook URLにmessageReplyOptionを設定すると、既存スレッドへ返信するか、新しいスレッドを開始するかを制御できます。案件IDやアラートIDを安定したthreadKeyとして使います。
Webhook URLが漏れた場合はどうしますか?
該当Webhookを削除・再作成し、送信元のシークレットを更新します。URLには秘密のkeyとtokenが含まれるため、公開リポジトリ、ログ、エラーメール、Chat本文へ貼らないでください。
Webhookの通知が多い場合はどうすればよいですか?
同じスペースへの書き込み制限を考慮し、送信キュー、日次集約、スレッド化、重要度による通知先の分離を行います。429が返った場合は即時連打せず、指数バックオフで再試行します。
参考・一次情報
開発相談
Google Chat Bot・Webhook開発を相談する
通知・承認・問い合わせ連携のBotとAPI実装を支援します。
開発を相談する