LoginSignup
6
4

More than 5 years have passed since last update.

[Google Apps Script] 時限設定を隔週にする

Last updated at Posted at 2017-05-09

毎週会議の前の決まった時刻に 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 に組み込んで参ります。

postMessage.gs
// 関数は毎週実行される
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() は実行されないので、隔週の通知が可能になりました。もっといい方法がきっとあるはずですが、この方法でしばらく様子を見てみます。

参考リンク

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4