前回は管理シートの自動作成やWORKDAY関数について解説してきました。
ご確認されたい方は、以下の記事をご確認ください。
今回は前回に引き続きスクリプトの紹介です。今回はSlackが受け持つ、通知部分がメインです。
slackについては、tokenの払出方法については今回は説明していません。まだslack APIを利用したことがない方はググっていただくか、別途記事をお待ちください。
締め日当日にslack通知を対象チャネルに送る方法
まずは対象シートを再確認していきましょう。”どのデータ”が”どんな状態”になっていたら”どういう処理をする”かを考えるのがスクリプトの基本です。

やりたいことを言語化する
今回の場合は、以下のように、やりたいことを定義するとします
やりたいこと:締め日(予定)になったら、朝9時に、該当のSlackチャンネルに対象のタスクを通知する
これを、データ内容からスクリプトがかけるレベルに落とし込むと以下のようになります
どのデータが:カラムEの締め日予定日が
どんな状態に:本日と一致したら
どうする:朝9時に該当のSlackチャンネルに対象のタスクを通知する
どうするが、少し長いですね。分解してみましょう。
朝9時に:朝9時にトリガーを起動して関数を呼び出す 該当のSlackチャンネルに:①Slackボットを使う②該当のチャンネルを指定する 対象のタスクを:スプレッドシートから対象のタスクを選択して、データを作成する 通知する:Slack Botのchat/postMessage エンドポイントにデータを送る
実際のスクリプト紹介
さて、実際のスクリプトですが、スクリプトを組む際はできるだけ一つ一つの関数やクラスに受け持たせる機能を分割していくのがいいです。
一つの関数でかけるよって物でも、できるだけ分割していくことで、それぞれの機能をメンテナンスしていく際に手間が減ります。
function Main(){
//slack 投稿チャンネル設定
const channel = "#general";
//投稿内容取得
var body = checkDueTask();
Logger.log(body);
//投稿内容整形
//slack post.message処理
slack_mention(body);
}
function checkDueTask() {
//日付関係のデータ作成
var today = new Date();
var CurrentMonth = today.getMonth()+1;
//シートを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var task_sheet = ss.getSheetByName(CurrentMonth+"月_Tasks");
var datas = task_sheet.getDataRange().getValues();
//対象データを抽出
var found = datas.slice(1, datas.length).filter(function(row){
var dueDate = row[4];
return checkDate(dueDate) === checkDate(today);
});
return found;
}
function checkDate(date){
var now = new Date();
if(typeof(date) === typeof(now)){
var formatdate = Utilities.formatDate(date, "Asia/Tokyo", "YY/MM/DD");
}else{
var formatdate = "date objではないです";
}
return formatdate;
}
//mailで送る場合用、今回はslackのため未設定
function checkRecipient(name){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("member");
var datas = sheet.getDataRange().getValues();
var mailAdress = [];
for(var i=0; i< datas.length; i++){
if(datas[i][0] === name){
mailAdress.push(datas[i][1]);
}
}
return mailAdress[0];
}
function slack_mention(channel, datas){
const token = PropertiesService.getScriptProperties().getProperty("oauth_token");
const url = "https://slack.com/api/chat.postMessage";
var Data = {
"text": datas,
"channel":channel,
'token':token,
};
var option = {
"method" : "post",
"payload" : Data,
};
UrlFetchApp.fetch(url,option);
}スクリプトの問題点
今回のスクリプトは正直内容は微妙ですね。見る人が見れば直しようはいくらでもあると思います。
ぜひリファクタリングに挑戦してみてください。
また、スクリプト書いた時点がV8適用前だったので、旧ベース(Rhinoベース)になっています。それでもリファクタリングできることはありますが。。
まとめ
今回のシリーズはあくまで月次決算を安定化・早期化するために必要なことを解説するシリーズだったので、スクリプトは正直手抜きです。
ただ、この部分のスクリプトが完璧であっても月次決算が早期化・安定化するわけではないので、それよりもささっと作ってメンテナンスしたいときにメンテナンスしやすいように設計さえしておけば、あとは本来の目的に注力するのがいいと個人的には思っています。
GASを書くことは目的ではなく、あくまでも何かを実現するための手段であるということをお忘れなく。逆にGASを書かなくても実現できる・他の方法で実現できることも世の中には多くあります。
いろいろな情報に感度を持って接して、本来の目的を達成するために一番早い方法を模索して行って下さい。


