📅

【15分で完成】GASで作る平日限定のGoogleカレンダー自動通知SlackBot

2024/11/11に公開
1

はじめに

毎朝の定例MTGの予定確認や、その日のスケジュール共有など、チームの予定管理は重要なタスクの1つです。この記事では、Google Apps Script (GAS) を使用して、決まった時間帯に自動的にGoogleカレンダーの予定を特定のSlackチャンネルに通知するBotを作成する方法を解説します。

導入背景

Googleカレンダーの予定をSlackに通知する方法として、SlackのGoogle Calendar Appを利用できますが、特定の時刻に特定のチャンネルにメッセージを送信することはできません。

以前は「Google Calendar for Team Events」というSlackアプリでこの機能を実現できましたが、2024年9月10日に廃止されたようです。

https://slack.com/intl/ja-jp/help/articles/4426294050451-Slack-機能の廃止#01HTQJTJP7JJRCK0TN58DCHTHD

そのため、特定のチャンネルに通知を送るBotを自作することにしました。このBotは、エンジニアでない方でも簡単に設定できるように設計しています。チームの予定管理をより効率的に行うための参考にしていただければ幸いです。

手順

1. Slack Appの作成

事前準備

  1. ブラウザでSlackアカウントにログインし、Slack Appsページにアクセスします。

Slack App(チャットボットアプリ)を作成する

  1. 「Create New App」ボタンをクリックします。
  2. 「From Scratch」を選択し、任意のApp Nameを入力、導入したいSlackのワークスペースを選択して「Create App」ボタンを押下します。
  3. 「Basic Information」ページに遷移後、サイドバーから「OAuth & Permissions」を選択します。
  4. Scopes > Bot Token Scopesで以下のスコープを設定します:
    • chat:write
    • chat:write.public
    • chat:write.customize

Webhook URLを取得する

  1. サイドバーの「Incoming Webhooks」を選択し、トグルをONにします。
  2. 「Add New Webhook to Workspace」ボタンをクリックし、投稿先のチャンネルを設定します。
  3. 設定後、「Incoming Webhooks」ページの「Webhook URL」をコピーします。

※ このURLは公開しないよう注意してください

チャットボットのアイコン画像を設定したい場合(任意)

  • Slack Appページの「Basic Information」内の「Display Information」でbotのアイコンを設定できます。512×512px以上の正方形の画像を使用してください。

2. GASプロジェクトの作成

事前準備

  1. Googleアカウントにログインし、Google Apps Scriptを開きます。
  2. 「新しいプロジェクト」をクリックします。

コードの実装

  1. コード.gsに以下のコードを貼り付けます。
  2. コード.gs内のここにGoogleカレンダーのIDを入れるに、通知したいGoogleカレンダーのIDを入力します。
  3. コード.gs内のここにSlackのWebhook URLを入れるに、上記手順で取得したSlackのWebhook URLを入力します。
  4. 画面右上の「デプロイ」をクリックします。

※ GoogleカレンダーのIDはGoogleカレンダーIDの調べ方をご参照ください。

コード.gs
/**
 * メインの処理を行う関数
 * 毎日の予定をSlackに通知します
 */
function sendCalendarEventsToSlack() {
  // システムから今日の日付を取得します
  const today = new Date();

  // もし今日が土日祝日だった場合は、ここで処理を終了します
  if (isHoliday(today)) {
    return;
  }

  // 指定したGoogleカレンダーを取得します
  // このIDは実際のカレンダーを特定するための固有の文字列です
  const calendarId = "ここにGoogleカレンダーのIDを入れる";
  const calendar = CalendarApp.getCalendarById(calendarId);

  // 今日の予定をカレンダーから全て取得します
  const events = calendar.getEventsForDay(today);

  // 予定が1つもない場合は、ここで処理を終了します
  if (events.length === 0) {
    return;
  }

  // Slackに送信するメッセージを作成します
  // yyyy/MM/dd の形式で日付を表示します(例:2024/03/14)
  let message = `*本日(${Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy/MM/dd')})の予定をお知らせします📅*\n`;

  // 予定の有無によってメッセージを変更します
  if (events.length === 0) {
    message += '予定はありません🤲🏻\n';
  } else {
    // 予定が1つ以上ある場合、全ての予定を箇条書きで追加します
    events.forEach(event => {
      message += `${event.getTitle()}\n`;
    });
  }

  // 作成したメッセージをSlackに送信します
  sendToSlack(message);
}

/**
 * 定された日付が休日(土日祝)かどうかを判定する関数
 * @param {Date} date - チェックしたい日付
 * @returns {boolean} - 休日の場合はtrue、平日の場合はfalse
 */
function isHoliday(date) {
  // 日付から曜日を取得します(0:日曜、1:月曜、...、6:土曜)
  const dayOfWeek = date.getDay();

  // 土曜日か日曜日の場合は休日と判定
  if (dayOfWeek === 0 || dayOfWeek === 6) {
    return true;
  }

  // Googleが提供している日本の祝日カレンダーを取得
  // その日に祝日が登録されているかをチェックします
  const calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  const events = calendar.getEventsForDay(date);
  return events.length > 0;  // 祝日がある場合はtrue、ない場合はfalse
}

/**
 * メッセージをSlackに送信する関数
 * @param {string} message - Slackに送信したいメッセージ
 */
function sendToSlack(message) {
  // SlackのWebhook URL
  // このURLは、Slackの特定のチャンネルにメッセージを送るための専用のアドレスです
  const webhookUrl = 'ここにSlackのWebhook URLを入れる';

  // Slackに送信するデータの形式を設定
  const payload = {
    'text': message
  };

  // HTTP通信の設定
  const options = {
    'method': 'post',  // POSTメソッドでデータを送信
    'contentType': 'application/json',  // JSONフォーマットでデータを送信
    'payload': JSON.stringify(payload)  // データをJSON形式の文字列に変換
  };

  // 実際にSlackにデータを送信
  UrlFetchApp.fetch(webhookUrl, options);
}

3. トリガーの設定

  1. GASの「トリガー」メニューを開きます。
  2. 「トリガーを追加」ボタンをクリックします。
  3. 次の設定を行います:
    • 実行する関数sendCalendarEventsToSlack
    • イベントのソース:「時間主導型」
    • 時間の種類:「日付ベースのタイマー」
    • 時刻:「午前9時〜10時」(任意)

動作確認

  1. GASの「エディター」メニューを開き、画面上部中央の「実行」ボタンをクリックします。
  2. 必要な認証を行います。
  3. 設定したSlackチャンネルに通知が届くことを確認します。

そうすることで、作成したSlack Appが設定したチャンネルにメッセージを送信できることが確認できます。

まとめ

GASとSlack Webhookを組み合わせることで、シンプルながら便利なカレンダー通知Botを作成できました。チームの予定共有をより効率的に行うためにぜひ活用してください。

参考文献

GitHubで編集を提案
LCL Engineers

Discussion