LoginSignup
2
2

More than 3 years have passed since last update.

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

Posted at

用途

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を使っているのかを取得できなかったので諦めた。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2