GASでSlack通知を自動化する基本パターン

Google Apps Script(GAS)とSlackを連携させることで、スプレッドシートの更新やフォームの送信を自動でSlackに通知できます。

Slackはビジネスの情報共有ツールとして広く使われていますが、手動での通知作業は意外と手間がかかります。締め切りが近いタスクを毎日チャンネルに書き込む、新しい依頼が来るたびに担当者にメンションする――こういった繰り返し作業はGASで自動化できます。

この記事では、GASからSlackにメッセージを送る基本パターンから、スプレッドシートのデータを定期通知する応用例まで、実際に動くコードで解説します。Incoming Webhookを使うので、Slack APIの深い知識は不要です。

この記事でできること

  • GASからSlackの指定チャンネルにメッセージを送信する
  • スプレッドシートの内容を毎朝自動でSlackに通知する
  • フォーム送信時にリアルタイムでSlack通知を飛ばす
  • メンション(@channel、@here、個人)を含んだ通知を送る

事前準備

SlackのIncoming Webhookを有効にする必要があります。Slackの管理画面から「アプリを管理」→「カスタムインテグレーション」→「Incoming Webhook」を開き、通知を送りたいチャンネルを選んでWebhook URLを発行してください。URLは「https://hooks.slack.com/services/」で始まる文字列です。このURLは外部に漏らさないよう注意してください。

GAS側の準備はとくに不要です。Googleアカウントがあれば、スクリプトエディタを開くだけで始められます。

STEP1: 基本のSlack送信関数を作る

まずはGASからSlackにメッセージを送る最小構成のコードです。スクリプトエディタ(script.google.com)を開いて、以下のコードを貼り付けてください。

function sendSlackMessage(message) {
  const WEBHOOK_URL = "https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ";

  const payload = {
    text: message
  };

  const options = {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(WEBHOOK_URL, options);
}

function testSend() {
  sendSlackMessage("GASからのテストメッセージです!");
}

WEBHOOK_URLを自分のものに書き換えてから、testSend関数を実行してください。Slackの指定チャンネルにメッセージが届けば成功です。初回実行時は「外部サービスへのアクセスを許可しますか?」という確認ダイアログが表示されるので、「許可」をクリックしてください。

STEP2: スプレッドシートのデータを通知する

次に、スプレッドシートの内容を読み取ってSlackに送信する関数を作ります。例として、タスク管理シートの「期限が今日のタスク」を朝に通知する仕組みを作ります。A列:タスク名、B列:担当者、C列:期限 の構成を想定しています。

function notifyTodayTasks() {
  const WEBHOOK_URL = "https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ";
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("タスク");
  const today = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd");

  const data = sheet.getDataRange().getValues();
  const todayTasks = [];

  for (let i = 1; i < data.length; i++) {
    const taskName = data[i][0];
    const assignee = data[i][1];
    const dueDate = Utilities.formatDate(new Date(data[i][2]), "Asia/Tokyo", "yyyy/MM/dd");

    if (dueDate === today && taskName !== "") {
      todayTasks.push("・" + taskName + "(担当: " + assignee + ")");
    }
  }

  if (todayTasks.length === 0) {
    return;
  }

  const message = "*本日締め切りのタスク(" + today + ")*
" + todayTasks.join("
");
  const payload = { text: message };
  const options = {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(WEBHOOK_URL, options);
}

シート名やカラム順は実際のスプレッドシートに合わせて変更してください。

STEP3: 毎朝自動実行するトリガーを設定する

GASのトリガー機能を使って、毎朝決まった時間に自動通知する設定にします。スクリプトエディタの左メニューから「トリガー」(時計のアイコン)をクリックし、「トリガーを追加」ボタンを押してください。

設定内容は以下の通りです。

  • 実行する関数: notifyTodayTasks
  • イベントのソース: 時間主導型
  • 時間ベースのトリガーのタイプ: 日付ベースのタイマー
  • 時刻: 午前8時〜9時(業務開始前を選ぶ)

これで毎朝8〜9時の間に自動的にnotifyTodayTasks関数が実行され、当日締め切りのタスクがSlackに通知されます。

STEP4: フォーム送信時にリアルタイム通知する

Googleフォームと連携させると、フォームが送信されるたびにリアルタイムでSlack通知を飛ばせます。フォームに紐付いたスプレッドシートのスクリプトエディタに、以下のコードを追加します。

function onFormSubmit(e) {
  const WEBHOOK_URL = "https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ";

  const responses = e.values;
  const timestamp = responses[0];
  const name = responses[1];
  const content = responses[2];

  const message = "*新しいフォーム送信がありました*
" +
    "受付時刻: " + timestamp + "
" +
    "名前: " + name + "
" +
    "内容: " + content;

  const payload = {
    text: message,
    username: "フォーム通知Bot",
    icon_emoji: ":mailbox_with_mail:"
  };

  const options = {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(WEBHOOK_URL, options);
}

このコードを保存したあと、トリガーを追加します。今度は「フォーム送信時」のトリガーを選択し、関数にonFormSubmitを指定してください。フォームが送信されるたびにSlackに通知が届くようになります。

STEP5: メンションを入れた通知を送る

特定の人や全員にメンションしたい場合は、メッセージテキストに特定の文字列を含めます。

// @channel(チャンネル全員に通知)
const message = "緊急連絡です!本日16時からミーティングがあります。";
// Slackでは <!channel> と記述することでチャンネル全員に通知

// @here(現在オンラインのメンバーに通知)
// Slackでは <!here> と記述することでオンラインメンバーに通知

// 個人へのメンション(メンバーIDが必要)
const userId = "U01XXXXXXXX";
// Slackでは <@メンバーID> の形式で個人メンションが可能

個人のメンバーIDはSlackのプロフィール画面から確認できます。プロフィールの「…」メニューから「メンバーIDをコピー」を選択してください。実際のコードでは変数に格納したIDを動的に埋め込むことも可能です。

うまくいかないときのチェックリスト

  • Webhook URLが正しいか確認する(スペースや改行が混入していないか)
  • GASの実行ログ(表示→ログ)でエラーメッセージを確認する
  • 「外部サービスへのアクセス」の許可が完了しているか確認する
  • Slackのチャンネルが存在し、Webhookがそのチャンネルに設定されているか確認する
  • スプレッドシートの日付フォーマットが「yyyy/MM/dd」と一致しているか確認する
  • トリガーの実行時間帯がズレていないか確認する(タイムゾーンをAsia/Tokyoに設定する)

応用・発展

基本のパターンを組み合わせることで、さらに高度な自動化が実現できます。例えば、Slackのメッセージをボタン付きにする場合はBlock Kit形式のペイロードを使います。また、複数チャンネルに同時通知したい場合は複数のWebhook URLに対してループ処理すればOKです。

さらに発展させるなら、Slack APIのchat.postMessageメソッドを使うことで、スレッド返信や既存メッセージの更新、ファイルのアップロードなども可能になります。その場合はSlack AppとOAuthトークンが必要になりますが、Incoming Webhookで物足りなくなったタイミングで移行を検討してみてください。

まとめ

  • GASからSlackへの通知はIncoming WebhookとUrlFetchApp.fetch()で実現できる
  • スプレッドシートのデータを読み取り、条件に合う情報だけを通知することが可能
  • 時間トリガーを使えば定期通知、フォーム送信トリガーを使えばリアルタイム通知ができる
  • @channelや@hereのメンションも特定の記法を埋め込むだけで対応できる
  • 基本パターンを覚えれば、あらゆる業務通知の自動化に応用できる

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA