Clicky

Google Apps Scriptで案件ステータスの変更をSlackに自動通知する方法

GAS(GoogleAppsScript)
GAS(GoogleAppsScript)
この記事は約6分で読めます。

※記事中に広告情報を含みます。

スキルを手に入れた時、人は強くなれる。
Youtubeでスキルアップを始める 電子書籍でスキルアップを始める
\ワードプレスのスキルアップはこちら!/ WordPress入門読本

案件管理において、ステータスの変更をリアルタイムでチームに通知できれば、業務の効率は大きく向上します。本記事では、Googleスプレッドシートで管理している案件の「ステータス列」が変更されたタイミングで、Slackに通知を送る仕組みをGoogle Apps Script(GAS)を使って構築する方法を解説します。

GASとSlackの連携でできること

GASとSlackの連携を行うことで、次のような自動化が可能になります。

  • ステータスが「対応中」→「完了」などに変わったときにSlackに自動通知
  • 通知メッセージに案件名、担当者、ステータス内容などを含める
  • チーム内での即時共有による対応の迅速化

Slack通知はWebhookを使って実現します。


必要な準備:Googleスプレッドシートの構成

以下のような構成を想定しています。

案件ID案件名担当者ステータス
001サイト制作山田対応中

「ステータス列(例:D列)」の変更をトリガーにSlackへ通知します。

Slackのチャンネルを作成

通知用のチャンネルを作っておきます。

SlackのIncoming Webhookを作成

  1. Slackのワークスペースにログイン
  2. Incoming Webhooksの設定ページにアクセス
    https://api.slack.com/messaging/webhooks
  3. 「Incoming Webhooksを追加」し、通知させたいチャンネルを選択
  4. 発行されたWebhook URLを控えておきます

Create an Appからアプリを作成します。

From scratchから空のアプリを作成します。

Incoming WebhooksからWebhooksを取得できます。


Botユーザーの設定

Botユーザーがないとエラーが出ます。

Botユーザーの設定をしておきます。

① Slack APIにアクセス

https://api.slack.com/apps
アプリ一覧が表示されます。対象アプリをクリック。

② Botユーザーの設定

  • 左メニューの「App Home」をクリック
  • Bot User」を追加(まだ追加していない場合)
  • 名前を設定して保存

③ 権限スコープの設定

  • 左メニュー「OAuth & Permissions」へ
  • chat:writechannels:readchat:write.public などの必要なスコープを Bot Token Scopes に追加

※不要な場合もあります。

④ アプリのインストール

  • 同じ画面の上部にある「Install to Workspace」ボタンをクリック
  • ワークスペースに再インストールし、ボットの権限を付与

これで、Webhook URLs for Your WorkspaceにWebhook URLが発行されます。

※取り扱い注意

GASスクリプトの実装

以下のコードをGoogleスプレッドシートのスクリプトエディタに貼り付けます。

const SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/XXXXXX/XXXXXX/XXXXXX'; // 自分のWebhook URLを入れる

function onEdit(e) {
const sheet = e.source.getActiveSheet();
const range = e.range;

const statusColumn = 4; // D列
const row = range.getRow();
const col = range.getColumn();

if (col !== statusColumn || row === 1) return; // 見出し行はスキップ

const newValue = range.getValue();
const oldValue = e.oldValue || '(empty)';

if (newValue !== oldValue) {
const projectId = sheet.getRange(row, 1).getValue();
const projectName = sheet.getRange(row, 2).getValue();
const assignee = sheet.getRange(row, 3).getValue();

const message = `:memo: *Project status has been updated*\n`
+ `*Project ID:* ${projectId}\n`
+ `*Project Name:* ${projectName}\n`
+ `*Assignee:* ${assignee}\n`
+ `*Status:* ${oldValue} → ${newValue}`;

postToSlack(message);
}
}

function postToSlack(text) {
const payload = JSON.stringify({ text });

UrlFetchApp.fetch(SLACK_WEBHOOK_URL, {
method: 'post',
contentType: 'application/json',
payload: payload
});
}

※内容は適宜修正ください。


トリガーの設定

このスクリプトは、onEditという関数名で記述しているため、手動での編集時には自動で実行されます。onEdit(e) は認証が不要な処理(例えばセルの書き換えやログ記録など)には便利です。

ただし、UrlFetchApp.fetch() のように 外部APIとの通信がある場合(Slack通知など)は 単純トリガーでは動作しません。この場合は インストール型トリガー(編集時) を手動で設定する必要があります。

  1. スクリプトエディタのメニューから「時計アイコン(トリガー)」をクリック
  2. onEditを選択し、イベントの種類を「スプレッドシート → 編集時」に設定
  3. 保存して完了

※トリガーは1日の実行回数に制限があるので注意しましょう。今回はインストール型トリガー(編集時)を直に試していますが、実際の使用時には実行回数の上限を超えないように工夫が必要です。


これで、ステータスが変更された際にSlackに通知が届くようになります。

通知メッセージのカスタマイズ例

Slack通知はテキスト以外にも以下のような工夫が可能です。

  • 絵文字で状態を表す(例::white_check_mark: 完了、:construction: 対応中)
  • リンクを貼って案件シートを開けるようにする
  • 担当者をメンション(Slack IDを取得しておく必要あり)

よくあるエラーと対処法

  • Slack通知が送られない
     → Webhook URLが正しいか確認
     → GASのトリガーが正しく設定されているかチェック
  • onEditが動作しない
     → 編集がGASやAPI経由で行われた場合は、onEditが反応しないことがあります。その場合はonChangeなどのトリガーに切り替えを検討してください

まとめ

GASとSlackを組み合わせることで、案件のステータス変更を自動的に共有できる仕組みを簡単に構築できます。手間のかかる連絡作業を自動化し、チームの対応力を一段階高めてみてください。

続きは、また。