GoogleAppsScript
LineNotify

GASを使ってGoogleカレンダーの内容をLINEに送る方法(10分前通知編)


用途

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);
}



テスト結果

qiita7.jpg


備考

1日1回のカレンダーチェックの都合上、「0時0分~0時10分」の予定をリマインドすることはできないので注意。

予定に一定のパターンがあれば、「このタイプの予定は20分前に、他は10分前に」とかのアレンジはできると思う。


終わりに

本当はTriggerBuilderというクラスを使って、1分ごとの処理を使わないようにしようと思ってた。しかし、トリガー実行時に、どのトリガーIDを使っているのかを取得できなかったので諦めた。