社内ヘルプ担当者をランダムで決めるbotをJS(GAS)で動かしてることとその工夫
現職、社内管理画面とかもろもろのサポートするのに、エンジニアのサポートが必要だったりしてて、
それをバックエンドエンジニア4名で回している。
↓こんな感じ。
問い合わせは全部slackで(当然だが)公開チャンネルでやっている。
ランダムでその日の担当を決めることにより、
- (ローテじゃないことによる)気軽さ、ゆるさ
- それによる属人性の排除
が生まれるような気がしている。
数日連続で指名されてしまうこともあるけど。
このやりかたは、わりと気に入っている。
bot
私の要件としては
- ランダム性
- 1日1回、朝動いてほしい
- 会社の営業日だけ動いてほしい。祝日判定もほしい(休日にメンションしてほしくない)
ということがあった。
1.と2.はslackの機能だけでできるけど、
3.の機能がほしかったので、自分でGAS用のスクリプトを書いた。
2.の機能はGASの定時実行機能でやればよい。
だいたいこんなようなコード。
わかりやすくコメントを追記した。
// 🤖
const main = () => {
const date = new Date();
date.setTime(date.getTime() + 1000*60*60*9);
if (isWeekend(date) || isCompanyHoliday(date) || isJapanHoliday(date)) return false;
const sample = () => {
const strings = [
"今日engineer-helpを担当するバックエンドエンジニアは xxさん <@xxxx>",
"今日engineer-helpを担当するバックエンドエンジニアは yyさん <@yyyy>",
"今日engineer-helpを担当するバックエンドエンジニアは zzさん <@zzzz>"
];
return strings[Math.floor(Math.random() * strings.length)];
}
const post_data = {
"text": sample(),
"channel": "#engineer-help",
"username": "ガラピコ",
"icon_emoji" : ":garapiko:",
"attachments": [
{
"fallback": "くじ",
"color": "#36afff",
// ここにGASのスクリプトのURLを貼ると他の人も編集できて超絶べんり
"footer": "改造する場合は <https://script.google.com/a/smarby.jp/d/xxxxxxxxxxxxxxxxxxxx/edit|🤖こちら🤖>"
}
]
};
const url = "https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const payload = JSON.stringify(post_data);
const headers = {"Accept":"application/json"}
const options = {
"method":"POST",
"headers": headers,
"payload": payload
};
UrlFetchApp.fetch(url, options);
return false;
}
// 土日
const isWeekend = (date) => {
return(date.getDay() >= 6 || date.getDay() == 0);
}
// 会社の休日。年末年始。
const isCompanyHoliday = (date) => {
const mm_dd = date.toJSON().slice(5, 10);
const arr = [
"12-29",
"12-30",
"12-31",
"01-01",
"01-02",
"01-03"
];
return arr.includes(mm_dd);
}
// 日本の祝日。
// https://raw.githubusercontent.com/holiday-jp/holiday_jp-ruby/master/holidays.yml
const isJapanHoliday = (date) => {
const yy_mm_dd = date.toJSON().slice(0, 10);
const arr = [
"2019-11-23",
"2020-01-01",
"2020-01-13",
"2020-02-11",
"2020-02-23",
"2020-02-24",
"2020-03-20",
"2020-04-29",
"2020-05-03",
"2020-05-04",
"2020-05-05",
"2020-05-06",
"2020-07-23",
"2020-07-24",
"2020-08-10",
"2020-09-21",
"2020-09-22",
"2020-11-03",
"2020-11-23",
"2021-01-01",
"2021-01-11",
"2021-02-11",
"2021-02-23",
"2021-03-20",
"2021-04-29",
//....snip...
];
return arr.includes(yy_mm_dd);
工夫したポイント
自分のスクリプトのURLのリンクを貼っている
「こちら」のところからGASのコードに飛ぶことができる。
「このslack通知、どのGASで送ってるんだっけ?」が発生しなくて良い。
V8使ってみた
最近V8が使えるようになってて、以下のことを導入して書き直した。
const
Array.prototype.includes
- アロー関数式
✎まとめ
- 祝日考慮したコードってめんどいですね。
- GASはトランスパイルしなくてもそこそこ新し目のJS使えるようになった。