2022.05.23
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
お久しぶりです。
JGです。
今回はgoogleスプレッドシートにある業務を行うか否かを、平日の決まった時間にチャットワーク通知させるものを紹介したいと思います。
準備するもの
下記画像のようなgoogleスプレッドシートを用意します。
仕様
今回作成したものは下記の仕様になります。
・平日の10時30分に通知
・A列の日付と本日の日付が一致した場合、C列の業務の有無とD列の備考を表示する
ソースコード
今回作成したソースコードです。
スプレッドシートを上から下に読み込み、A列の日付と 本日の日付が一致したら成功用のテキストを送信します。
一致しない場合は失敗用のテキストを送信します。
triggerに関する処理は後で説明します。
function myFunction() {
//アクティブなシートを取得
var sht = SpreadsheetApp.getActiveSheet();
//アクティブなセルを取得
var shtName = sht.getName();
var toList = ["[To:222]ccc", "[To:333]ddd"]; //TODO
var roomId = ''; //TODO
if (shtName == '管理シート') {
var date = new Date();
var today = Utilities.formatDate(date, "Asia/Tokyo", "yyyy/MM/dd");
var lastRow = sht.getLastRow();
for (var i = 2; i <= lastRow; i++) {
try {
var tmpDate = sht.getRange(i, 1).getValue();
var date = Utilities.formatDate(tmpDate, "Asia/Tokyo", "yyyy/MM/dd");
if (today == date) {
var chk = sht.getRange(i, 3).getValue();
var memo = sht.getRange(i, 4).getValue();
var body = createBodySucess(chk, memo, toList);
sendChatwork(body, roomId);
return;
}
} catch(error) {
break;
}
finally {
}
}
var body = createBodyFail(toList);
sendChatwork(body, roomId);
}
//チャットワークの成功の本文を作成
function createBodySucess(chk, memo, toList) {
var spsht = SpreadsheetApp.getActiveSpreadsheet();
var spshtUrl = spsht.getUrl();
var spshtId = spsht.getSheetId();
var ret = "";
for (i = 0; i <= toList.length - 1; i++) {
ret += toList[i] + "さん\n";
}
ret += "[info][title]本日の業務状況[/title]\n";
ret += "・業務有無\n";
ret += chk + "\n";
if (memo != '') {
ret += "・備考\n";
ret += memo + "\n";
}
ret += spshtUrl + "#gid=" + spshtId +"[/info]";
return ret;
}
//チャットワークの失敗の本文を作成
function createBodyFail(toList) {
var spsht = SpreadsheetApp.getActiveSpreadsheet();
var spshtUrl = spsht.getUrl();
var spshtId = spsht.getSheetId();
var ret = "";
for (i = 0; i <= toList.length - 1; i++) {
ret += toList[i] + "さん\n";
}
ret += "[info][title]本日の業務状況[/title]\n";
ret += "今日のデータが未登録か予期せぬエラーのため、スプレッドシートを確認して下さい。\n";
ret += spshtUrl + "#gid=" + spshtId +"[/info]";
return ret;
}
//チャットワークに送る
function sendChatwork(body, roomId) {
var token = ""; //TODO
//送信データ
var params = {
headers : {"X-ChatWorkToken" : token},
method : "post",
payload : {
body : body
}
};
var url = "https://api.chatwork.com/v2/rooms/" + roomId + "/messages";
UrlFetchApp.fetch(url, params);
}
}
function delete_trigger() {
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
if (allTriggers[i].getHandlerFunction() == "myFunction") {
ScriptApp.deleteTrigger(allTriggers[i]);
}
}
}
function add_trigger() {
delete_trigger();
//土日は通知しないため、トリガーを作成しない
var date = new Date();
var weekNum = date.getDay();
if (weekNum == 0 || weekNum == 6) {
return;
}
date.setHours(10);
date.setMinutes(30);
ScriptApp.newTrigger("myFunction").timeBased().at(date).create();
}
トリガーの設定
決まった日時に1回だけスクリプトを実行したい場合はスクリプトではなく、GUIから設定できますが、今回のような場合は下記画像のようにトリガーを設定し、かつスクリプトを書く必要があります。
add_triggerという関数を作成し、10時30分に実行させたいので、9時台にトリガーを設定します。
add_trigger関数では、トリガーを追加する前にdelete_triggerで過去のトリガーを削除します。
平日のみScriptApp.newTriggerでmyFunction関数のトリガーを10時30分に追加します。
こうすることで10時30分にmyFunction関数が実行され、チャットワーク通知がきます。
つまりトリガーが二つある状態で、 add_trigger関数でmyFunction関数のトリガーを10時30分に設定し、 myFunction関数で10時30分にチャットワーク通知を送信します。
最後に
多少内容は変えておりますが、実際にこのようなGASとチャットワーク通知の連携を業務で使っております。
今回のブログでGASについて少しでも興味を持っていただけると幸いです。