今回は、Azure FunctionsGoogle Apps Scriptを利用してSlack Statusを操作してみようと思います。


まずは、Slackでトークンを取得する必要があります。今回はテスト用としてLegacy tokensを取得します。


トークンが取得できたら次に、Azure Functionsで定期的にSlack Statusを実行してみます。
Azure Functionsの操作方法は「Try #005 – Node.jsとAzure FunctionsでSlack botを作ってみた」を参考にしてみてください。

開発 → コードに下記のようなスクリプトを記述します。

index.js


module.exports = function (context, myTimer) {
var timeStamp = new Date().toISOString();

if(myTimer.isPastDue)
{
context.log('JavaScript is running late!');
}
var timestamp = require('date-utils');
var request = require('request');

var dt = new Date();
var formatted = dt.toFormat("YYYYMMDDHH24MISS");

context.log('formatted: '+ formatted);

var emoji = ":rice:";
var textadd = "食事中";

var options = {
url: 'https://slack.com/api/users.profile.set',
method: 'POST',
json: true,
form: {
"token": "取得したトークン",
"profile": JSON.stringify({
"status_text": textadd ,
"status_emoji": emoji
})
}
};

request.post(options, function(error, response, body){
if (!error && response.statusCode == 200) {

context.log('run!');

} else {

context.log('error: '+ response.statusCode + body);

}
});

context.done();
};


token:に取得したトークンを記述
emojiに表示したいアイコンを記述
textaddに表示したいテキストを記述


タイマーも設定しておきます。


スクリプトを保存して実行してみます。タイマーで設定した時間にStatusが変更されるのが確認できます。


最後に、Google Apps ScriptでGoogleカレンダーとSlack Statusを同期してみたいと思います。事前に同期させたいGoogleカレンダーのカレンダーIDを取得しておきます。

新規にファイルを作成して、下記のようなスクリプトを記述します。

script.gs


var cdid = "カレンダーID";

function onTrigger() {

var event = getCurrentEvent(cdid);
updateSlackStatus(event);

}

function getCurrentEvent(cdid) {

var now = new Date();
var events = CalendarApp.getCalendarById(cdid).getEventsForDay(now);

var currentEvent = {
emoji: "",
text: ""
};

if (events && events.length > 0) {
for (var i = 0; i < events.length; i++) {

var event = events[i];

if (event.isAllDayEvent()) {

currentEvent.text = "出張中";
currentEvent.emoji = ":airplane:"

}
}
}

return currentEvent;

}

function updateSlackStatus(event){
try {

var profile = {
"status_emoji": event.emoji,
"status_text": event.text
};

var slackToken = "取得したトークン";
var encodedProfile = encodeURIComponent(JSON.stringify(profile));
var result = UrlFetchApp.fetch("https://slack.com/api/users.profile.set?token=" + slackToken + "&profile=" + encodedProfile);

} catch(ex) {

}
}


cdidに取得したカレンダーIDを記述
slackTokenに取得したトークンを記述
currentEvent.textに表示したいテキストを記述
currentEvent.emojiに表示したいアイコンを記述


今回はカレンダーに全日予定で当日登録されている場合、Slack Statusを設定するスクリプトの記述としましたが、スクリプトを書き換えると時間単位予定や予定の内容の表示なども指定も可能です。


スクリプトを記述したら、トリガーの設定をします。トリガーを設定するとAzure Functionsのタイマーのように定期的にスクリプトを実行することが可能です。1分おきや5分おきで設定することでGoogleカレンダーの監視が可能です。


スクリプトを保存して実行してみます。GoogleカレンダーとSlackのStatusが同期されるのが確認できます。


GitHub


Azure FunctionsやGoogle Apps ScriptでSlack Statusを手軽に操作できることが確認できました。これで現在会議中などの状況を可視化できますね!







Q&A