私の仕事的にこの時間になったらこの作業をするという定型業務が曜日ごとに担当者ごと変わるので時報通知のグループを作成して通知するように設定しました。 作業に集中しているとついつい時間になってもその作業をするのを忘れてしまいがちになると、忘れっぽい僕みたいな状況にある人は作成する価値が少しはあるかもしれません。 いわゆるリマインダーの方法は様々あるかと思いますが、メインでチャットワークを使用している自分として業務中はチャットワーク上で通知が上がってるくれるほうが気付きやすいのでこの方法を採用いたしました。
対象者
チャットワークをメインに仕事をしていて、
時間になったら特定のチャットワークグループに時報通知したい方
使用サービス
ChatWork
Google Apps Script
当初考えた方法
当初考えていた通知方法
Google Apps Scriptには「トリガー」という素晴らしいものがあるので、チャットワークに通知するような関数だけだけつくって、あとはトリガーでその時間帯にそのメソッドが発火するようなものだけだと考えていました。しかし、トリガーを確認すると………
単発であれば特定の時間に発火させるようなトリガー(以下 単発特定トリガーと呼びます。)があるけど、”毎日”特定の時間に発火させるようなものはありませんでした。
一番近いトリガーで何時から何時の間に発火させるというものだけでした。最初このトリガーで設定して試してみましたが、設定した1時間の時間帯の間にランダム発火されるようになってました。なんで毎日特定の時間帯に発火させるようなトリガーないねんと思いましたが仕方ないので別の方法を模索しました。ありがたいことに以下の記事にたどり着きましたので参考にさせてもらいました。
改めてその記事を探してみましたががどれだったか見当たらなかったので発見でき次第URL載せます。
おおまかな流れ
①夜中 or 早朝 に単発トリガーを作成する。 ようにトリガーをセットする。
②①でのセットによりその日の単発トリガーが発火する。
③夜中に①で作成したトリガーを削除する。
上記だけでは、なかなか説明が難しいですが上記を念頭に実際の方法を記載します。
まずは、単発トリガーが作成されるようにコードを書きます。
その前に最終的に僕が使用しているコードを載せた方がいいと思いますので、載せた後に細かく見ていきます。
全体のコードはこちらです。
改善の余地しかないくそみたいなコードですが、ご参考ください。
function setTrigger(){
var date = new Date();
var day_num = date.getDay();
if(day_num== 0 || day_num== 6){
exit;
}
const startTime = new Date();
startTime.setHours(9);
startTime.setMinutes(0);
ScriptApp.newTrigger('onDutyMessage').timeBased().at(startTime).create();
const restTime1 = new Date();
restTime1.setHours(11);
restTime1.setMinutes(30);
ScriptApp.newTrigger('restTimeMessage1').timeBased().at(restTime1).create();
const restTime2 = new Date();
restTime2.setHours(12);
restTime2.setMinutes(30);
ScriptApp.newTrigger('restTimeMessage2').timeBased().at(restTime2).create();
}
function delTrigger() {
const triggers = ScriptApp.getProjectTriggers();
for(const trigger of triggers){
if(trigger.getHandlerFunction() == "onDutyMessage"){
ScriptApp.deleteTrigger(trigger);
} else if (trigger.getHandlerFunction() == "restTimeMessage1"){
ScriptApp.deleteTrigger(trigger);
} else if (trigger.getHandlerFunction() == "restTimeMessage2"){
ScriptApp.deleteTrigger(trigger);
}
}
}
function onDutyMessage() {
var date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
var msg1 = '本日は' + year + '年' + month + '月' + day + '日';
var msg2 = '';
var day_num = date.getDay();
switch (day_num) {
case 1:
msg2 = '[月]です。何とか作業がありまっせ。当番の方はよろしくお願いします。';
break;
case 2:
msg2 = '[火]です。何とか作業がありまっせ。当番の方はよろしくお願いします。';
break;
case 3:
msg2 = '[水]です。何とか作業がありまっせ。当番の方はよろしくお願いします。';
break;
case 4:
msg2 = '[木]です。何とか作業がありまっせ。当番の方はよろしくお願いします。';
break;
case 5:
msg2 = '[金]です。何とか作業がありまっせ。当番の方はよろしくお願いします。';
break;
default:
msg2 = '';
}
var msg_join = msg1 + msg2;
if(msg2!='') {
var client = ChatWorkClient.factory({token: '適宜変えてね'});
client.sendMessage({room_id:適宜変えてね, body: msg_join})
}
}
function restTimeMessage1(){
var client = ChatWorkClient.factory({token: '適宜変えてね'});
client.sendMessage({room_id:適宜変えてね, body: 'お疲れ様です。11時半になりましたので、前半休憩の方は適宜休憩をとってください。'});
}
function restTimeMessage2(){
var client = ChatWorkClient.factory({token: '適宜変えてね'});
client.sendMessage({room_id:適宜変えてね, body: 'お疲れ様です。12時半になりましたので、後半休憩の方は適宜休憩をとってください。'});
}
まずはこのコードとトリガーの設定でできる完成系としては、
毎日 月曜日~金曜日 午前11時半に前半休憩の方へのリマインド通知 午後12時半に 後半休憩の 方へのリマインド通知
毎日 月曜日~金曜日 午前9時に特定作業のリマインド通知
です。
そのままこの通りこのコードが必要になる人はいないかと思いますが、適宜修正して自分好みにカスタマイズしてください。
それでは、上記コードの詳細を確認します。
まずこれ
function setTrigger(){
var date = new Date();
var day_num = date.getDay();
if(day_num== 0 || day_num== 6){
exit;
}
const startTime = new Date();
startTime.setHours(9);
startTime.setMinutes(0);
ScriptApp.newTrigger('onDutyMessage').timeBased().at(startTime).create();
const restTime1 = new Date();
restTime1.setHours(11);
restTime1.setMinutes(30);
ScriptApp.newTrigger('restTimeMessage1').timeBased().at(restTime1).create();
const restTime2 = new Date();
restTime2.setHours(12);
restTime2.setMinutes(30);
ScriptApp.newTrigger('restTimeMessage2').timeBased().at(restTime2).create();
}
setTrigger を発火させることにより
午前9時に onDutyMessage 関数が発火するような単発トリガーを作成
午前11時半に restTimeMessage1 関数が発火するような単発トリガーを作成
午前12時半に restTimeMessage2 関数が発火するような単発トリガーを作成
です。ちょっとこの説明じゃややこしいですよね。
これは、上記に記載した ①夜中 or 早朝 に単発トリガーを作成する。 ようにトリガーをセットする。
という部分の話です。
意味不明な人もとりあえず、上記画像を見てください。
僕のトリガー設定では、 setTrigger 関数を毎日午前5時~6時の間に発火させるよう設定してます。
これで、毎日午前5時~6時に
午前9時に onDutyMessage 関数が発火するような単発トリガーを作成
午前11時半に restTimeMessage1 関数が発火するような単発トリガーを作成
午前12時半に restTimeMessage2 関数が発火するような単発トリガーを作成
しているわけです。
var date = new Date();
var day_num = date.getDay();
if(day_num== 0 || day_num== 6){
exit;
}
の部分は、月~金のみトリガーを作成したかったので、土日の場合は、exitで呼び出されたその場で終了させています。
const startTime = new Date();
startTime.setHours(9);
startTime.setMinutes(0);
ScriptApp.newTrigger('onDutyMessage').timeBased().at(startTime).create();
の部分は、 onDutyMessage 関数を9時に発火させるような単発トリガーを作成しています。
function onDutyMessage() {
var date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
var msg1 = '本日は' + year + '年' + month + '月' + day + '日';
var msg2 = '';
var day_num = date.getDay();
switch (day_num) {
case 1:
msg2 = '[月]です。何とか作業がありまっせ。当番の方はよろしくお願いします。';
break;
case 2:
msg2 = '[火]です。何とか作業がありまっせ。当番の方はよろしくお願いします。';
break;
case 3:
msg2 = '[水]です。何とか作業がありまっせ。当番の方はよろしくお願いします。';
break;
case 4:
msg2 = '[木]です。何とか作業がありまっせ。当番の方はよろしくお願いします。';
break;
case 5:
msg2 = '[金]です。何とか作業がありまっせ。当番の方はよろしくお願いします。';
break;
default:
msg2 = '';
}
var msg_join = msg1 + msg2;
if(msg2!='') {
var client = ChatWorkClient.factory({token: '適宜変えてね'});
client.sendMessage({room_id:適宜変えてね, body: msg_join})
}
}
で実際に、午前9時になったら、上記 onDutyMessage が発火されて
var client = ChatWorkClient.factory({token: '適宜変えてね'});
client.sendMessage({room_id:適宜変えてね, body: msg_join})
上記により、その日が月曜日だったら、「●月●日 [月]です。何とか作業がありまっせ。当番の方はよろしくお願いします。 」とチャットワークに通知されるわけです。
今考えたら、 if(msg2!=”) { } で
var client = ChatWorkClient.factory({token: ‘適宜変えてね’});
client.sendMessage({room_id:適宜変えてね, body: msg_join})
を囲む必要はないかもしれないですね。その辺はおまかせします。
function delTrigger() {
const triggers = ScriptApp.getProjectTriggers();
for(const trigger of triggers){
if(trigger.getHandlerFunction() == "onDutyMessage"){
ScriptApp.deleteTrigger(trigger);
} else if (trigger.getHandlerFunction() == "restTimeMessage1"){
ScriptApp.deleteTrigger(trigger);
} else if (trigger.getHandlerFunction() == "restTimeMessage2"){
ScriptApp.deleteTrigger(trigger);
}
}
}
それで、単発トリガーは毎日作成されてしまうので、その日の夜中とかに delTrigger を発火させて単発トリガーを削除するという流れになります。
チャットワークへの連携については過去に作成したこちらをご参考ください。
誰かしらの参考になれば幸いです。
コメント