週末は死なない

主にゲーム日記を書き殴ってみる。ネタバレありまくり。

GASでGoogleCalendarの更新をLineで通知する

Line Notifyが終了しちゃう

今まではGoogleClaendarに予定追加されたらIFTTT使ってLineNotifyで通知してたんだけど、2025年3月いっぱいで終了しちゃうとのことで、乗り換えなきゃ!ってことで色々調べてGAS使って通知するようにしてみた。

参考にさせてもらったサイト

【GAS】Googleカレンダーの変更をLINEに通知する #JavaScript - Qiita 上記サイトでGAS使ってLineNotifyで通知するやり方が書いてあるので、ほぼそのまま使わせていただいている。

変更したところ

LineNotifyで通知するところを、以下のメソッドを追加して、LineMessageAPIでメッセージをPush送信する処理に置き換え。

// LINEへ通知メッセージを送るAPI
const LINE_PUSHPOINT_API = 'https://api.line.me/v2/bot/message/push';

// 通知したいLineのグループID
const ABENOTIFY_ID='グループID';

//
// メッセージ送信
// to      : 送信先ID
// message : 送信メッセージ内容
//
function pushLineMessage(to, message) {
  console.log("pushLineMessage start");
  UrlFetchApp.fetch(LINE_PUSHPOINT_API, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'method': 'post',
    'muteHttpExceptions': true,
    'payload': JSON.stringify({
      'to': to,
      'messages': [{
        'type': 'text',
        'text': message,
      }],
    }),
  });  
  console.log("pushLineMessage end");
}

あと、GoogleCalendarのAPI使ってるので、そのAPIを有効にする必要があった。 Googleカレンダー:予定が登録されたらLINEへ通知

終日だと日時が表示されない問題

参考サイトの処理だと、終日の予定を入れると開始日時/終了日時に「Invalid Date」が表示されちゃう。どうも終日だとevents.startのプロパティがdateにしか入らないらしいので以下で判定するようにしてみた。

if (e.start.dateTime == undefined) {
    // dateTimeが定義されていなければ終日なのでdateを取得(yyyy-MM-dd)
    startDateTime = Utilities.formatDate(new Date(e.start.date), 'Asia/Tokyo', 'yyyy-MM-dd');
    endDateTime   = Utilities.formatDate(new Date(e.end.date), 'Asia/Tokyo', 'yyyy-MM-dd');
} else {
    // dateTimeが定義されていれば終日じゃないのでdateTimeを取得(yyyy-MM-dd hh:mm)
    startDateTime = Utilities.formatDate(new Date(e.start.dateTime), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm')
    endDateTime   = Utilities.formatDate(new Date(e.end.dateTime), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm')
}

終日問題もう一個(解決)

終日の予定の終了日付が翌日になっちゃう。これをどう解決すればいいのかはわからん……。終日の予定から-1日できればいいんだろうけどなー。

解決

やはり終日から-1日すればよかった。

// 作業用領域に終了日をDateで格納
tempEndDate = new Date(e.end.date);
// 1日引いた日付を設定
tempEndDate.setDate(new Date(e.end.date).getDate()-1);
// フォーマットを成型して表示
endDateTime   = Utilities.formatDate(tempEndDate, 'Asia/Tokyo', 'yyyy-MM-dd');