ADVERTISEMENT

【Googleドキュメント】Webhookで共有変更を通知!リアルタイム監視の設定

【Googleドキュメント】Webhookで共有変更を通知!リアルタイム監視の設定
🛡️ 超解決

Googleドキュメントの共有設定を変更したときに、リアルタイムで通知を受け取りたいと思ったことはありませんか。標準の通知機能だけではメールが見逃されたり、チーム全体で変更を追跡するのが難しい場合があります。そこで役立つのがWebhookとGoogle Apps Scriptを使った自動通知システムです。本記事では、共有変更を検知して任意のURLにPOSTリクエストを送信する方法を、手順を追って解説します。

この設定を完了すれば、ドキュメントの共有が変更されるたびにSlackやチャットツールに即座に通知を飛ばせます。コードの知識が少し必要ですが、コピー&ペーストで動くサンプルも用意します。

【要点】Google Apps ScriptのトリガーとUrlFetchAppで共有変更をWebhook通知

  • Google Apps Scriptのプロジェクト: ドキュメントに紐付けるか、独立したスクリプトで監視対象のファイルを指定してトリガーを設定します。
  • トリガー機能(onEdit等): 共有権限の変更は直接検知できないため、代わりに時間主導型トリガーで定期的にアクセス権限リストをチェックする方法を紹介します。
  • UrlFetchApp.fetch: 変更を検出したら、Webhook URLに対してJSONデータをPOST送信し、Slackや独自システムに通知を届けます。

ADVERTISEMENT

Webhook通知の仕組みと準備するもの

Googleドキュメント自体には共有変更をフックする機能はありません。そのため、Google Apps Script(GAS)を使って定期的にファイルのアクセス権限を確認し、差分があればWebhookを送信する仕組みを作ります。GASは無料で利用でき、Googleアカウントがあればすぐに始められます。事前に用意するのは、通知先のWebhook URL(Slack Incoming WebhookやMicrosoft Teamsのコネクタなど)と、監視対象のドキュメントのファイルIDです。

共有変更通知を実現する具体的な手順

1. Google Apps Scriptプロジェクトを作成する

  1. Googleドキュメントを開く
    監視したいドキュメントをブラウザで開きます。メニューから「拡張機能」->「Apps Script」を選択してスクリプトエディタを起動します。
  2. プロジェクトに名前を付ける
    左上の「無題のプロジェクト」をクリックし、わかりやすい名前(例:「共有監視Webhook」)に変更します。

2. アクセス権限を取得する関数を作成する

  1. コード.gsにサンプルコードを記述する
    以下のコードをコピー&ペーストします。この関数はドキュメントの編集者リストを取得し、JSON形式で返します。
  2. function getEditors() {
      var doc = DocumentApp.getActiveDocument();
      var editors = doc.getEditors();
      var result = [];
      for (var i = 0; i < editors.length; i++) {
        result.push(editors[i].getEmail());
      }
      return result;
    }
  3. 差分を検出するための前回状態を保存する
    PropertiesServiceを使って前回の編集者リストを保存します。以下の関数を追加します。
  4. function checkAndNotify() {
      var doc = DocumentApp.getActiveDocument();
      var editors = doc.getEditors().map(function(e) { return e.getEmail(); });
      var props = PropertiesService.getDocumentProperties();
      var previous = JSON.parse(props.getProperty('editors') || '[]');
      
      if (JSON.stringify(editors) !== JSON.stringify(previous)) {
        // 変更があった場合、Webhookを送信
        sendWebhook(editors, previous);
        props.setProperty('editors', JSON.stringify(editors));
      }
    }

3. Webhook送信関数を作成する

  1. sendWebhook関数を追加する
    以下のコードで指定したURLにPOSTリクエストを送信します。SlackのWebhook URLを使う例です。
  2. function sendWebhook(currentEditors, previousEditors) {
      var webhookUrl = 'https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZZ'; // 実際のURLに置き換え
      var message = {
        text: 'Googleドキュメントの共有が変更されました。\n現在の編集者: ' + currentEditors.join(', ') + '\n以前の編集者: ' + previousEditors.join(', ')
      };
      var options = {
        method: 'post',
        contentType: 'application/json',
        payload: JSON.stringify(message)
      };
      UrlFetchApp.fetch(webhookUrl, options);
    }
  3. Webhook URLを取得する
    Slackの場合はアプリ管理からIncoming Webhookを追加し、固有のURLをコピーします。Teamsの場合はコネクタからWebhook URLを取得します。

4. 時間主導型トリガーを設定する

  1. トリガーを追加する
    スクリプトエディタの左側メニューから「トリガー」(時計アイコン)をクリックし、「トリガーを追加」を選択します。
  2. トリガーの詳細を設定する
    「実行する関数」で「checkAndNotify」を選択します。「イベントのソース」は「時間主導型」にし、「時間の間隔」を任意の頻度(例:5分ごと)に設定します。通知のリアルタイム性を重視するなら間隔を短くしますが、1分未満にはできません。
  3. 承認する
    初回実行時に権限の承認を求められます。自分のGoogleアカウントで承認し、必要に応じて「このアプリは確認されていません」という画面が表示された場合は「詳細」から安全なページに進んで承認してください。

注意点とよくあるトラブル

トリガーの実行制限に注意する

Google Apps Scriptの無料アカウントには1日あたりの実行時間制限(合計90分)があります。5分間隔でトリガーを設定した場合、1日288回実行されますが、1回の処理が0.5秒程度なら問題ありません。ただし、大量の編集者リストを処理すると時間がかかる可能性があるので注意してください。

ドキュメントのプロパティはドキュメントごとに独立している

PropertiesService.getDocumentProperties()はそのドキュメント専用のストレージです。スクリプトを別のドキュメントで使う場合は、プロパティがリセットされるため、最初の実行時に前回の編集者リストが空になり、必ずWebhookが送信されます。初回だけ通知が来ることを許容するか、プロパティを事前に初期化する処理を追加してください。

Webhook URLが漏れないように管理する

コード内に直接URLを書くと、スクリプトを共有した場合にURLが第三者に見える可能性があります。URLはスクリプトプロパティに保存し、以下のように参照すると安全です。

var props = PropertiesService.getScriptProperties();
var webhookUrl = props.getProperty('SLACK_WEBHOOK');

スクリプトプロパティはメニューの「プロジェクトの設定」から設定できます。

変更を検出できないケース

getEditors()で取得できるのは編集者(編集権限)のみです。閲覧者やコメント権限の変更は取得できません。また、ドキュメントオーナーの変更も直接検知できません。すべての権限変更を監視したい場合は、Drive APIの変更通知を利用する方法もありますが、より複雑になります。

ADVERTISEMENT

代替方法の比較

方法 リアルタイム性 設定の容易さ 通知の種類
Google Apps Script + 時間トリガー 数分遅れ 比較的簡単 Webhook (Slack, Teams等)
Drive APIの変更通知 ほぼリアルタイム 高度な設定が必要 独自のPush通知
Googleドキュメント標準通知 即時 メールのみ メール

まとめ

Google Apps ScriptとWebhookを組み合わせることで、Googleドキュメントの共有変更を外部サービスにリアルタイムで通知できるようになります。時間主導型トリガーを使うため完全な即時性はありませんが、数分以内に変更を検出してSlackやTeamsに飛ばすことが可能です。コードのひな型を利用すれば、初心者でも30分程度で設定を完了できるでしょう。さらに高度な監視が必要な場合は、Drive APIのPush通知を検討してみてください。


ADVERTISEMENT

📄
Googleドキュメントトラブル完全解決データベースこの記事以外にも、書式・共有・Apps Script・引用など様々な困りごとへの解決策をまとめています。逆引きに活用してください。
この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。