見出し画像

掃除当番をGASを使ってSlackに自動通知させる

弊社ではオフィスの掃除は当番制で持ち回りとなっています。そこでGoogle apps scriptを使って、Slackに掃除当番を自動通知するbotを作成してみましたので、その方法をご紹介します。

以下目次です。

目次
・はじめに
・今回使うもの
・手順
 1.事前準備
 2.SlackのIncoming WebHooksの登録
 3.カレンダーIDの取得
 4.GASの制作
 5.投稿の実行
・参考記事
・最後に


はじめに

今回はタイトルのように、Google apps script(以下省略:GAS)を使ってGoogleカレンダーに登録されている掃除当番の予定をSlackに自動通知させます。

本記事では、Googleカレンダーに掃除当番の予定が入っていることを前提に進めます。また、予定に担当者をゲストとして招待しておくことを前提とします。

今回使うもの

・GAS
・SlackのIncoming WebHooks
上記2つを使って、連携・自動通知を行います。

手順

1.事前準備
Googleスプレッドシートで以下のようなデータを用意します。

email          slackId
hoge@hoge.co.jp   sonicjam01
fuga@fuga.co.jp     sonicjam02
 
ちなみに弊社は1Fと2Fで当番場所が分かれているので、下記のようなGoogleカレンダーの2つの予定を元に通知をさせます。

2.SlackのIncoming WebHooksの登録

次にSlackでIncoming WebHooksを登録します。

I. 自動通知用のチャンネルを作成。
Slackでチャンネルを作成します。

Ⅱ. Incoming WebHooksを設定。
下記のIncoming WebHooksの設定ページへ飛びます。
https://slack.com/apps/A0F7XDUAZ--web-
「Add Configuration」ボタンを選択し、 投稿したいチャンネルを選択して「Add Incoming WebHooks integration」ボタンを押します。
作成完了後、「Webhook URL」の項目に出てくるURLを後で使用するので、メモしておきましょう。

3. カレンダーIDの取得

今回は掃除用当番用のカレンダーから情報を取得します。
Googleカレンダーの「オーバーフローメニュー>共有と設定」から、必要なカレンダーの「カレンダーID」をメモしておきます。

4. GASの制作

Googleスプレッドシートを開いて、「ツール>スクリプトエディタ」を選択します。
スクリプトエディタが開くので、そこに記述していきます。JavaScriptのコードは以下になります。


function main(){
  var list = "";
  var item;

  item = listupEvent("xxx.calendar.google.com"); // GoogleカレンダーのID
  if (item != "")  list += item;

  if (list != "") {
    var payload = {
      "text" : "おはよう!!今日も頑張って行こう!!!!!!\n===============================\n■今日の掃除当番は\n" + list, // メッセージの本文
      "channel" : "#xxx", // チャネルの指定
      "icon_url" : "https://xxx.jpg", // アイコン画像
      "username" : "お掃除○造", // Botの名前
    };

    postSlack(payload);
  }
}

// 予定をリストアップ
function listupEvent(calenderId){
  var list = "";
  var cal = CalendarApp.getCalendarById(calenderId);

  var date = new Date();

  var events = cal.getEventsForDay(date);
  var floor01 = "";
  var floor02 = "";
  for(var i = 0; i < events.length; i++){
    item = "";
    var guests = events[i].getGuestList();
    for(var j = 0; j < guests.length; j++){
      var mailAddress = guests[j].getEmail();
      item += " <@" + getSlackId(mailAddress, i) + ">";
    }
    item += "\n";

    if (events[i].isAllDayEvent()) {
      item += Utilities.formatDate(events[i].getStartTime(),"GMT+0900","MM/dd");
    }

    var title = events[i].getTitle();
    if (title.indexOf('1F') != -1) {
      floor01 = item += events[i].getTitle() + "\n";
    }else{
      floor02 = item += events[i].getTitle() + "\n";
    }
  }

  if(floor01 != "" && floor02 != ""){
    list += floor01 + floor02 + "になります!\n===============================\nできる!できる!君ならできる:fire::fire::fire:";
  }
  return list;
}

// 担当者のslackのidを取得
function getSlackId(mailAddress, floor){
  var slackId = "";
  var url = "https://xxx"; // スプレッドシートのURL
  var spreadsheet = SpreadsheetApp.openByUrl(url);
  var sheets = spreadsheet.getSheets();
  var startRow = 2;
  var memberMailCol = 1; // スプレッドシートのemailの列番号
  var memberSlackCol = 2; // スプレッドシートのslackIdの列番号

  for (var i in sheets){
   var lastRow = sheets[i].getLastRow();
     for(var j = startRow; j <= lastRow; j++){
       var memberMail = sheets[i].getRange(j, memberMailCol).getValue();
       if(memberMail == mailAddress){
         slackId = sheets[i].getRange(j, memberSlackCol).getValue();
       }
     }
  }
  return slackId;
}

// slackへポスト
function postSlack(payload){
  var options = {
    "method" : "POST",
    "payload" : JSON.stringify(payload)
  }

  // アクセス先
  var url = "https://xxx"; // Webhook URL
  // POSTリクエスト
  var response = UrlFetchApp.fetch(url, options);
  // HTML結果を取得
  var content = response.getContentText("UTF-8");
}

Googleカレンダーのゲストを取得する際には、getGuestList()を使用します。今回はgetEmail()でゲストのメールアドレスを取得していますが、他にもゲストの出欠ステータスなども取得できます。

5. 投稿の実行

画面上部の実行ボタンを押すことで、コードを実行できます。
初回実行時は実行の許可を求められるので、許可します。

トリガーを設定して自動投稿させる場合
画面上部の「編集>現在のプロジェクトのトリガー」を押し、「トリガーが設定されていません。今すぐ追加するにはここをクリックしてください。」のリンクをクリックします。

「現在のプロジェクトのトリガー」のウィンドウが開いたら、Slackに通知させたい時間を選択します。
この設定で、指定した時間内にこのスクリプトが実行され、Slackに投稿されるようになります。

※細かい時間指定をしたい場合は、スクリプト側で記述する必要がありますが、今回は割愛します。

完成イメージは下記のようになります。

こんな感じで熱く掃除当番をリマインドしてくれるbotができました。

参考記事

・Slack Bot:毎朝Googleカレンダーの予定を通知してくる秘書ねこBotの作り方
https://designmemo.jp/creative/bot-googlecalendar-slack.html
・Calendar Service | Apps Script | Google Developers
https://developers.google.com/apps-script/reference/calendar/

最後に

GASはサーバーなしでプログラムが動くので、導入もしやすく、気軽に手を付けられます
すでに試している方も多く、導入記事なども豊富にあるので、エンジニア以外の人でも触りやすいかなと思います。
また、Slack apiのOutgoing WebHooksを使うとSlackの投稿を取得して、それに反応させることもできるので、機能拡張したりするのも良いかなと思いました。

この記事が気に入ったらサポートをしてみませんか?