【Slack】「Googleカレンダー」の特定の予定を15分前に通知するbotを作成してみた!

SlackへGoogleカレンダーの予定を通知するには、「Google Calendar」アプリを追加するだけで、簡単に実装できますがカスタマイズに制限があったりして、使い勝手の悪い部分があります。

今回は課題を解決するため、Goolg Apps Script(GAS)を利用して「開始時刻の15分前にSlackへ通知を行う方法」についてまとめました。(15分に限らず、10分前、5分前など調整が可能です!)

目次

Slack APIでbotAppを作成

まず、Slack APIで利用するSlackアプリを作成します。

1. Slack アプリ の作成

  • Slack APIのページ の「Create an app」ボタンをクリックします。
Screenshot
  • 「Create an app」画面に遷移するので、1.Creating an App 内の「Go to Your Apps」をクリックします。

「Your Apps」の画面に遷移するので、「Create App」ボタンを押し、

ポップアップで表示される中から、「Form Scratch」をクリックします。

わかりやすいアプリ名を入力し、アプリを利用するワークスペースを選び、「Create App」をクリックします。

2.  Slackアプリへの権限設定

作成したSlackアプリでできる権限を設定します。
・「chat:write」チャンネルへの投稿やメンバーへのDMが可能な
・「chat:write.public」パブリックチャンネルに許可なしで書き込める
・「chat:write.customize」ボットのアイコン画像や名前を書き換えられる
の3つを設定します。設定方法は以下の通りです。

  • Basic Informationの画面に遷移したら、左側のメニューから「OAuth & Permissions」メニューをクリックします。

OAuth & Permissionsページの下の方にある、Scopes > Bot Token Scopes の「Add an OAuth Scope」ボタンを押下し、「chat:write」、「chat:write.public」、「chat:write.customize」を選択して追加します。
追加後は、以下のようになります。

3. Slack Botの作成とインストール

続いて、ボットを作成して導入するSlackワークスペースにインストールを行います。

左側のメニューから「App Home」メニューをクリック。
「Your App’s Presence in Slack」内「App Display Name」の「Edit」ボタンをクリックします。

Screenshot
  • ボットの表示名(日本語可)であるDisplayNameと、デフォルトのユーザー名(半角英数字のみ)DefaultNameを入力し、「Add」ボタンをクリック。

※ 表示名は後から変更可能

DisplayName

Botが追加されると画面上部に「Bot user added!」と表示されます。表示されたら左側のメニューから「Install App」メニューをクリックします。

先ほど作成したAppがSlack Workspaceにアクセスする権限をリクエストする画面に遷移しますので、「許可する」ボタンをクリックします。

Installed App Settingsページへ遷移したら、「Bot User OAuth Token」の値をコピーしておきます。
※ 値はこの後「Google App Script」で使用します。

Slackチャンネルの作成とアプリの追加

アプリが作成できたら、Slack上に連携させたいチャンネルを作成します。
その後、作成したチャンネルの「詳細設定」から「インテグレーション」を開き、「アプリを追加する」を開き

以下のように作成したアプリ名で表示されるので追加するをクリックしてチャンネルに連携させます。
(※ 以下の画像ではすでに追加済みのため、表示すると表記されています)

これで、Slackアプリの設定は完了です!続いてGASの実装に進みます。

GASの実装

1. Slack App のライブラリを導入

https://script.google.com/home」にアクセスし、新規のプロジェクトを作成します。
GASからSlackに通知を行うには、SlackのAPIを使用します。その準備としてGASにSlack Appのライブラリを追加します。

  • 「ライブラリの追加」画面が表示されたら、スクリプトIDに、SlackAppのスクリプトIDである「1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq」を入力し検索します。このIDは固定となっています。
  • Slack Appの最新バージョン(一番大きい数字)を選択してライブラリを追加します。
ライブラリの追加

2. GASでSlack通知を行う処理を記載

.gs に下記のコードを貼り付けます。

function informCalendarToSlack() {
  let slackToken = 'xoxb-などで始まる値'; 
  let slackApp = SlackApp.create(slackToken);
  let channelId = 'チャンネル名';

  let myCalendar = CalendarApp.getCalendarById("カレンダーID");
  let calDate = new Date();
  let myEvent = myCalendar.getEventsForDay(calDate);
  
  let message;
  let startTime;
  let title;
  let description;
  const excludeEmail = '除外するアドレスがあれば'; // 除外するメールアドレス

  // プロパティストアを使用(通知済みイベントの保存)
  let scriptProperties = PropertiesService.getScriptProperties();

  for (let i = 0; i < myEvent.length; i++) {
    let eventId = myEvent[i].getId(); // イベントの一意のIDを取得

    // すでに通知済みならスキップ
    if (scriptProperties.getProperty(eventId) === 'true') {
      continue;
    }

    if (myEvent[i].getTitle()) {
      startTime = myEvent[i].getStartTime();
      let minutesBefore = startTime.getTime() - 15 * 60 * 1000;
      let now = new Date();

      // 予定の15分前を過ぎたら通知
      if (minutesBefore < now) {
        // 通知済みとして保存
        scriptProperties.setProperty(eventId, 'true');

        let guests = myEvent[i].getGuestList().filter(guest => guest.getEmail() !== excludeEmail);
        let guestList = guests.map(guest => {
          let guestName = guest.getName();
          let guestEmail = guest.getEmail();
          return `・${guestName ? guestName : guestEmail} (${guestEmail})`;
        }).join("\n");

        let location = myEvent[i].getLocation() || '未設定';

        title = myEvent[i].getTitle();
        description = myEvent[i].getDescription() || '説明なし';
        
        // HTMLタグを削除
        description = description.replace(/<br>/g, '\n').replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, '');
        startTime = Utilities.formatDate(startTime, 'JST', 'yyyy-MM-dd HH:mm:ss');

        message = `<!channel>\n\n`
                + `📌【通知】会議開始の15分前になりました\n\n`
                + `タイトル:${title}\n`
                + `開始時間:${startTime}\n`
                + `会議室:${location}\n`
                + `参加者:\n${guestList || 'なし'}\n\n`
                + `詳細:${description}\n`;

        slackApp.postMessage(channelId, message);
      }
    }
  }
}

各設定の説明

  • slackToken・・・コピーしておいた「Bot User OAuth Token」の値
  • channelId・・・メッセージを投稿するチャンネル名(#で始まるチャンネル名で#は抜く)

※ 個人のDMに投稿する場合は、該当者のプロフィール画面の三点リーダーメニューからメンバーIDをコピーしてそのIDを使用します。

  • myCalender・・・対象のGoogleカレンダーのカレンダーID

<参考> カレンダーIDの取得方法

①Googleカレンダーのマイカレンダーから対象のカレンダーを選択し、三点リーダーメニューから「設定と共有」を選択

②下の方にある「カレンダーの統合」にカレンダーIDが表示されるのでそれを使用します。

3. トリガー設定を行う

トリガーは毎分おきに設定します。

GASのスクリプト内で、一度Slack通知したスケジュールは「通知済」のタグ付けを行っているので、毎分おきにGASが実行されても、同じスケジュール内容が重複して通知される心配はありません。

トリガー

カレンダーにスケジュールを登録する

Googleカレンダーに、Slack通知したい予定を入力しておきます

テスト

トリガー実行を待ち、予定の15分前に以下のように通知が届きます!
通知を確認できれば動作テスト完了です。

まとめ

以上、Slack APIを利用し、Google App Scriptで「Googleカレンダー」のスケジュールをリマインド通知する方法でした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次