掃除当番を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の投稿を取得して、それに反応させることもできるので、機能拡張したりするのも良いかなと思いました。
この記事が気に入ったらサポートをしてみませんか?