毎週会議の前の決まった時刻に Google Apps Script の時限設定を使って Slack で定期通知していたところ、別の会議で隔週で通知して欲しいという要望があり、トリガーのオプションに隔週の選択肢がなかったので、スクリプト内でなんとかした話。
この例では年末年始のような休暇時期は考慮していません
UNIX 時間
JavaScript では 1970 年 1 月 1 日 午前 0 時 0 分 0 秒から現在までカウントされている秒数を算出することができます。
console.log(Math.floor((new Date()).getTime()/1000));
// 実行時の出力: 1494333017
これを元に UNIX 時間で今現在、何週目かを割り出してみます。
UNIX 週を求める
UNIX 秒からさらに秒(60)、分(60)、時(24)、週(7)で割って、 UNIX 週を割り出します。
var ut = Math.floor((new Date()).getTime()/1000);
var week = ut / 60 / 60 / 24 / 7;
console.log(week);
// 実行時の出力: 2047
2047 が返ってきました。閏年などは考慮していない算出方法ではありますが、一応確認
// 年間の週数で割ってみる
var year = week / 52;
console.log(year);
// 実行時の出力: 47
// 週数の替わりに日数で割ってみる
var year = ut / 60 / 60 / 24 / 365;
console.log(year);
// 実行時の出力: 47 (同じ)
いずれも 47 が返ってくるので 1970 + 47 = 2017
で投稿時の年数と一致しています。
奇数と偶数を判別して実行する
やや、厳密ではないかもしれませんが、単に週数を求められればいいのでこの週数を元にして Google Apps Script に組み込んで参ります。
// 関数は毎週実行される
function biweeklyPost() {
var utw = Math.floor((new Date()).getTime() / 1000 / 60 / 60 / 24 / 7);
var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
var slackApp = SlackApp.create(token);
var props = {
channel: "#channel",
message: "<!channel|channel> 明日は、○○ MTGがありますので、○○ の入力お願いします。",
userName: "bot"
}
// 奇数と偶数を判別し、以下の例では奇数の週だけ Slack 側に通知を行う。
if(utw % 2 == 1) {
slackApp.postMessage(props.channel, props.message, {
username:props.userName
});
}
}
これで biweeklyPost()
自体は毎週実行されますが、 postMessage()
は実行されないので、隔週の通知が可能になりました。もっといい方法がきっとあるはずですが、この方法でしばらく様子を見てみます。