Slackに追加された新機能 Status
が API を使って更新できるみたいなので、
Google App Script を使って Google Calendar と同期してみました。
概要
当日のイベントを全て取得し、開始時間と終了時間と現在時刻を比較して、
現在の予定を取得。
取得した予定名を見て特定の文字列が含まれているかどうかで
予定の種類を判別し以下のemojiを設定しています。
休暇(:kyuuka:) | 会議中(:kaigi_tyu:) | 外出中(:gaishutsu_tyu:) | その他(:nankashitemasu:) |
---|---|---|---|
休暇のみ、終日イベントで設定することが多いので
終日イベントかつ休暇の文字が含まれているかで判定しています。
絵文字は以下のサイトで作成しました(下記サイトにはかなりお世話になってます!)
絵文字ジェネレーター
コード
var calendarId = "Calendar ID を入力";
var slackToken = "Slack API Token を入力"
function onTrigger() {
var event = getCurrentEvent(calendarId);
updateSlackStatus(event);
}
/*
* 指定のカレンダーから現在時刻のイベントを取得する
*/
function getCurrentEvent(calendarId) {
var now = new Date();
var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(now);
Logger.log(events)
var currentEvent = {
emoji: ":smile:",
text: ""
};
if (events && events.length > 0) {
for (var i = 0; i < events.length; i++) {
var event = events[i];
if (event.isAllDayEvent()) {
// 終日イベントの場合
if(/休暇/.test(event.getTitle())){
// 休暇 が含まれている場合
currentEvent.text = event.getTitle();
currentEvent.emoji = ":kyuuka:"
break;
}
} else {
var start = new Date(event.getStartTime())
var end = new Date(event.getEndTime())
if(start < now && now < end){
// 現在時刻がイベント中の場合
var title = event.getTitle();
var emoji = "";
if(/(会議|MTG|mtg|打ち合わせ|定例)/.test(title)){
// 会議中 の絵文字を設定
emoji = ":kaigi_tyu:";
}else if(/(外出|訪問)/.test(title)){
// 外出中 の絵文字を設定
emoji = ":gaishutsu_tyu:";
}else{
// なんかしてます の絵文字を設定
emoji = ":nankashitemasu:";
}
currentEvent.text = title;
currentEvent.emoji = emoji;
break;
}
}
}
} else {
Logger.log('No events found.');
}
return currentEvent;
}
function updateSlackStatus(event){
try {
var profile = {
"status_emoji": event.emoji,
"status_text": event.text
}
// Slack APIの仕様に従ってURL enociding する
var encodedProfile = encodeURIComponent(JSON.stringify(profile))
// Slack API を叩いてprofileを更新する
var result = UrlFetchApp.fetch("https://slack.com/api/users.profile.set?token=" + slackToken + "&profile=" + encodedProfile);
Logger.log(result)
} catch(ex) {
Logger.log(ex)
}
}
Slack APIを叩くところ、POSTで叩きたかったが何故かうまくいかず。。。。
使用方法
適当なGASプロジェクトを作成し、上記コードを貼り付け、
編集 > 現在のプロジェクトのトリガー から onTrigger を 1分ごとに実行するように設定すれば動くと思います。。。
https://api.slack.com/custom-integrations/legacy-tokens
Slack API を叩くのに必要なtokenは上記URLから生成することができます
Google Calendar ID は普通に Google アカウントのメールアドレスでOKです
参考にしたものとか
Slack の Status emoji を API で変更する
Slackのリアクションで使うテキスト絵文字を作成する