はじめに
社内でチャットワークの利用者が増え、窓もたくさん増えてきたことにより、
チャットで定期報告や、会議のリマインドなどを促すBOTが欲しいと思いました。
前提
- チャットワークAPIが使用可能であること。
- BOTメッセージ送信者のアカウントを、BOTを利用したい窓に招待すること。
- (できれば)BOT専用アカウントがあること。
- リマインドのBOTなので、普段使用者のアカウントを利用してしまうと、その人には通知が届かない為、専用のBOTアカウントを作成することが好ましいです。
画面と仕組み
利用者はスプレッドシートにアクセスし、送信内容と予約時刻を入力します。
下記に記載のプログラムを走らせることにより、
現在時刻が予約時刻を過ぎれば、チャットが送信される仕組みになっています。
また、ログの時刻と予約時刻が同一なら、送信しないようになっています。
これを、トリガーなどで回せば、自動で送信できるシステムの完成です。
コード
// シートを参照し、チャットを送信する
function chatwork_bot() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('シート1');
var values = sheet.getRange("A2:C").getValues()
var COL_MSG = 0 //A列
var COL_TIME = 1 //B列
var COL_LOG = 2 //C列
for (var i=0; i<values.length; i++){
var message = values[i][COL_MSG]
var now_time = new Date()
var send_time = values[i][COL_TIME]
var log_time = values[i][COL_LOG]
// メッセージが空白ならcontinue
if (message == ""){
continue
}
// 送信日時が空白ならcontinue
if (send_time == ""){
continue
}
// 日時が送信済み or 未達 or 時刻判定不可ならcontinue
try{
if (log_time != ""){
if (send_time.getTime() == log_time.getTime()){
continue
}
}
if (send_time.getTime() > now_time.getTime()){
continue
}
}catch(e){
continue
}
// 送信
sendMessage(
'abcdef1234567890',
0123456789,
message,
);
sheet.getRange(i + 2, COL_LOG + 1).setValue(send_time)
}
return
}
// 引数より、発言者(BOT)、部屋、メッセージ内容が指定できる
function sendMessage(token,room_id,body){
var params = {
headers : {"X-ChatWorkToken" : token},
method : "post",
payload : {
body : body
}
};
var url = "https://api.chatwork.com/v2/rooms/" + room_id + "/messages";
try{
UrlFetchApp.fetch(url, params);
return true;
}catch(e){
return false;
}
}
懸念点
- 利用者にトークンIDが見えてしまう
- 利用者で共通のシートを利用することになる
これらの問題があります。トークンIDが見えないようにするには、
別シートにimportし、プログラムを走らせることで回避できます。
さいごに
コードが長くなるので、要所のみを抑えたプログラムとなりますが、
today関数などを利用すれば、毎日送信することも可能ですし、
月初や月末、祝日など設定することも可能です。
ぜひ用途に合わせて使いやすい形に組み替えてみてください。