#はじめに
前回投稿した毎日のごはんを楽に記録する Part2の続きです。
今回は***「最近何食べた?」とSlackに書き込むと、過去2週間の夕食で食べたものリストを
botが返してくれる機能***を作ります。
#動作フロー
- slackで「最近何食べた?」などの特定フレーズをOutgoing webhookでGAS(Google Apps Script)へ通知する。
- Part2で作成したスプレッドシートの内容から、晩ごはんのリストを抽出する。
- Slackに投稿するときに見やすい形にする。
- Slackへ投稿する。
#できるようになったこと
slackで「最近何食べた?」とつぶやくと、過去2週間の晩ごはんリストをbotが返答してくれる。
#関連箇所のコード抜粋
main.gs
//リスト出力要請があったらSlackへ出力
function ansEatList(){
//必要情報の取得
var today = new Date(); //現在日付を取得
var currentday = Utilities.formatDate(today,"JST","yyyy/MM/dd"); //日付を切り出し
//listシートを指定
var url = "https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXX/edit#gid=0";
var SpreadSheet_Input = SpreadsheetApp.openByUrl(url);
var Sheet_Input = SpreadSheet_Input.getSheetByName("list");
//最終行取得
var lastrow = Sheet_Input.getLastRow();
//さかのぼる期間を設定(とりあえず2週間)
var startday = new Date(today.getYear(), today.getMonth(), today.getDate() - 14);
//startdayからcurrentdayまでの晩御飯を取得して配列に格納する
//格納用配列宣言
var array = []; //date, menu
for(var i = 2; i <= lastrow; i++){
//まずD列の日付を見て対象期間かを判断する
var setday = Sheet_Input.getRange(i, 4).getValue();
if(setday >= startday){
//F列の分類を見て晩御飯かを判断する
var setmenutype = Sheet_Input.getRange(i, 6).getValue();
//晩御飯と判断して日付とメニューを配列へ格納する
if(setmenutype.match(/晩/) || setmenutype.match(/夜/) || setmenutype.match(/夕/)){
var setmenu = Sheet_Input.getRange(i, 2).getValue();
var setday2 = Utilities.formatDate(setday,"JST","MM/dd");
var content = [setday2, setmenu];
array.push(content);
}else{
//晩御飯でなければ何もしない
}
}else{
//対象期間外なので何もしない
}
}
//配列の中身を整えてSlackへ投稿
var ret = "直近2週間の晩ごはんリストです。\n" + array.join("\n");
postSlack(ret);
}
#得た知識
- Outgoing webhookからの投稿は、トークンで見分けることができる。
参考サイト:SlackのOutgoing WebHooksとGoogleAppsScriptで簡単な会話botを作ってみた - 2次元配列の連結にはarray.joinが便利
- 日付の比較にも演算子が使える
- 2週間前の日付を取得するには、以下のように書けばよい。
date.gs
var startday = new Date(today.getYear(), today.getMonth(), today.getDate() - 14);
#追記
Part4はこちらです。