#用途
Googleカレンダーの今日の予定を元に、ユーザへ10分前通知を送る。
(以前作ったQiitaの内容は「今日の予定は何があったかな?」レベルのリマインダーとしていた)
事前に必要なものは下記にて記載済みなので省略。
https://qiita.com/watarimaycry2/items/acf90142b32aa1fd8ba1
#コーディング
remind.gs
var calenderSpreadSheet = SpreadsheetApp.openById("ここにスプレッドシートのIDを入れてね");
var calenderSheet = calenderSpreadSheet.getSheetByName("シート1");
//1日に1回、今日の予定を取得、スプレッドシートのセルへ登録
function dailyCalenderCheck(){
var myCal = CalendarApp.getCalendarById("ここにGoogleカレンダーのIDを入れてね");
var myEvents = myCal.getEventsForDay(new Date());
//セルに追加する用。A列:時刻、B列:タイトルが入る
var addCellList = [];
for(var i = 0; i < myEvents.length; i++){
var title = myEvents[i].getTitle();
var startTime = Utilities.formatDate(myEvents[i].getStartTime(),'JST','HH:mm');
if(startTime != "00:00"){
//明示的に開始時刻が決められてるものだけ取ってくる
addCellList.push([startTime, title]);
}
}
//複数のカレンダーIDを使ってリマインダーを作ろうとすると時刻の順番が正しく並ばないので、ソートしてやるよ
addCellList.sort(function(a, b){
var aTime = a[0].split(":");
var bTime = b[0].split(":");
if(parseInt(aTime[0]) == parseInt(bTime[0])){
//分を見てソート
return parseInt(aTime[1]) - parseInt(bTime[1]);
}else{
//時を見てソート
return parseInt(aTime[0]) - parseInt(bTime[0]);
}
});
var addRange = calenderSheet.getRange("A1:B" + addCellList.length);
addRange.setValues(addCellList);
}
//1分に1回実行
//「実行時の時刻の10分後(hh:mm)」とA1セルの値が同じであればメッセージをLINEに送る
function sendRemind(){
var range = calenderSheet.getRange("A1:B1");
var schedule = range.getValues();
var time = schedule[0][0];
var title = schedule[0][1];
var tmpDate = new Date();
tmpDate.setMinutes(tmpDate.getMinutes() + 10);
var hour = tmpDate.getHours();
if(hour < 10){
hour = "0" + hour;
}
var minute = tmpDate.getMinutes();
if(minute < 10){
minute = "0" + minute;
}
var triggeredTime = hour + ":" + minute;
if(time == "" || time != triggeredTime){
return;
}
var sendText = "そろそろ予定が始まるよ\n" + time + ":" + title;
sendLineMessage(sendText);
//送信完了した予定のセルは消す(セルの一番上がなくなるので、「上方向に削除」を行う)
range.deleteCells(SpreadsheetApp.Dimension.ROWS);
}
//LINEへメッセージを送信する
function sendLineMessage(sendText){
var token = "ここにLINE notifyトークンを入れてね";
var opt = {
"method" : "POST",
"payload" : "message=" + sendText,
"headers" : {
"Authorization" : "Bearer " + token
}
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", opt);
}
#備考
1日1回のカレンダーチェックの都合上、「0時0分~0時10分」の予定をリマインドすることはできないので注意。
予定に一定のパターンがあれば、「このタイプの予定は20分前に、他は10分前に」とかのアレンジはできると思う。
#終わりに
本当はTriggerBuilderというクラスを使って、1分ごとの処理を使わないようにしようと思ってた。しかし、トリガー実行時に、どのトリガーIDを使っているのかを取得できなかったので諦めた。