ブログ

Blog

承認依頼が来たらGoogleChatに通知するGoogleAppsScriptを作成する

承認依頼が来たらGoogleChatに通知するGoogleAppsScriptを作成する

はじめに

みなさんこんにちは
株式会社BTMでグループ長をしている島田です

突然ですがみなさんの会社でも勤怠管理やワークフロー、経費精算等々で申請を行い、上長に確認してもらう機会は多いのではないでしょうか
確認する上長からするとメンバーから来た申請類は遅れなく承認したいのですが、未承認の申請があるかどうかを複数サービスに頻繁に見に行けるわけではありません
タイミングを逃してしまうと承認が遅れてしまう可能性があるため、複数サービスの承認依頼そこそこ迅速に気づける仕組みをGoogleAppsScriptを使って構築しようと思います

処理の大枠の流れ

大体のサービスで申請が来るとメールが飛んでくるかと思います
このメールを元に、GoogleChatに通知する構想です

  1. Gmailのフィルターで承認依頼メールに自動でラベルと重要マークを付与
  2. 1時間に1回GASを実行し、特定ラベルかつ重要マークのメールを検索
  3. 条件に合致するメールがあれば件名をGoogleChatに投稿し、重要マークを外す

上記の流れで実現しました。それぞれ詳細を以下で説明します。

Gmailのフィルター機能設定

Gmailの設定で特定条件に合致するメールに自動でラベルと重要マークをつけるフィルターを作成します

  1. ラベルを作成(例:「承認依頼」)
  2. 設定→すべての設定を表示→フィルターとブロック中のアドレス→新しいフィルター
  3. 件名に以下を設定

    "[サービスA] 承認依頼" OR "[サービスB] 承認依頼" OR "【サービスC】経費精算"
  4. 「ラベルを付ける」にチェックし、作成したラベルを選択
  5. 「常に重要マークを付ける」にチェックし、フィルタを作成

通知先のスペース作成・webhook発行

GoogleChatでスペースを作成し、アプリと統合→Webhookを追加

Webhook名は任意。保存後に発行されるURLにHTTPリクエストを送るとメッセージが投下されます。

Google Apps Scriptの作成

Googleが提供する無料のスクリプトプラットフォームで、GmailやChatなどGoogleサービスと連携できます。

  1. Driveで「その他」→「Google Apps Script」を作成
  2. 以下コードを貼り付け、WEBHOOK_URLとラベル名を設定

const WEBHOOK_URL = 'https://chat.googleapis.com/v1/spaces/・・・・・';

function checkMail() {
  const query = 'label:承認依頼 is:important';
  const threads = GmailApp.search(query, 0, 100);

  if (threads.length === 0) {
    Logger.log('通知対象無し');
    return;
  }

  const notificationSubjects = threads.map(thread => thread.getFirstMessageSubject());

  const data = {
    text: '承認依頼が来ています。\n' + notificationSubjects.join('\n')
  };
  const options = {
    method: 'post',
    headers: { 'Content-Type': 'application/json; charset=UTF-8' },
    payload: JSON.stringify(data)
  };
  const response = UrlFetchApp.fetch(WEBHOOK_URL, options);

  if (response.getResponseCode() === 200) {
    Logger.log(`${notificationSubjects.length}件通知成功`);
    threads.forEach(thread => GmailApp.markThreadUnimportant(thread));
  } else {
    Logger.log(`送信失敗: ${response.getResponseCode()}`);
  }
}
  1. 保存して実行し、Chatに通知されることを確認
  2. トリガー→トリガーを追加→1時間ごとにcheckMailを実行

処理詳細

Gmail検索処理

GmailApp.search(query, 0, 100)でラベル+重要マークのスレッドを取得。

通知対象件名取得処理

threads.map(thread => thread.getFirstMessageSubject())で件名を配列化。

GoogleChat投稿処理

Webhook URLにPOSTすることでメッセージ投下。

ステータス確認・重要マーク解除

200なら重要マークを外し、再通知を防止。

おわりに

これだけのコードで承認依頼が来たらGoogleChatに通知できる仕組みができました。GASは手軽に色々な自動化ができるので、ぜひ活用してみてください。

株式会社BTMではエンジニアの採用をしております。ご興味がある方はぜひコチラをご覧ください。

  • SNS
  • 投稿日
  • カテゴリー

    BTM Useful