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