Hike News
Hike News

用 Line Notify 通知行事曆行程

正好看到有 Line Notify 這方便的工具,若是能用 Line 通知當天的行程或是提前 1 小時前通知,對我常健忘的人來說真的是幫大忙了,所以現在就來 DIY 一下

工具

流程

  • 搜尋 Google Apps Scripts 並安裝

    • 雲端硬碟 建立 Google Apps Script 檔案

    • 在檔案內設定左上角的 專案名稱

    • 設定時區為台北 : 在 檔案 > 專案屬性

    20200411-010319.png

    20200411-010202.png

    • 寫好程式碼後,執行時會需要 核對權限 > 選擇使用的帳戶

    20200411-011236.png

    • 和確認是否使用按 進階 > 前往「 自訂專案名稱 」(不安全)

    20200411-011358.png

    • 了解允許存取的風險按 允許 就會收到 Line 通知了

    20200411-011422.png

Google Apps Script 程式碼

1
2
const NotifyToken = 'abcdefg...';   // Line Notify 權杖
const CalendarID = "ABCDEFG...@gmail.com"; // 月曆 ID
  • 自已的 google 月曆 ID = google 信箱

  • 他人建立的 google 公開月曆 ID 是 亂數@group.calendar.google.com

Line Notify 權杖

  • LINE Notify 右上 登入
  • 登入帳號 > 個人頁面
  • 滑到最下面點擊 發行存取權杖(開發人員用)的 發行權杖

月曆 ID

1
const calendar = CalendarApp.getCalendarById(CalendarID);

CalendarID 是上方的 google 月曆 ID

又或者是抓取自已的行事曆也是可以直接使用、不使用變數

設定時間

用 javascript 通知當天的行程

1
2
3
4
const Now = new Date();
const Start = new Date(new Date().setHours(0, 0, 0, 0));
const End = new Date(new Date().setHours(23, 59, 59, 999));
const calendarData = calendar.getEvents(Start, End);

關於取得月曆事件的相關資訊

提醒次數

在上方工具列的 現有專案的起動程序 設定在每天固定時間提醒

另外重複提醒的方式還有 recurrence-rule

排定規則可以用串連的方式連接多個函式

1
recurrence.addDailyRule().times(3).interval(2).addWeeklyExclusion().times(2);

通知內容

可以用 google apps script 的函式

1
2
3
4
getTitle()  // 活動標題
getStartTime() // 開始時間
getEndTime() // 結束時間
getEvents() // 取得時間內發生的所有事件

calendarData 得到當日的所有行程後依序取得內容

1
2
3
4
5
6
7
8
9
10
11
function Notify() {
var Contents = '';
calendarData.forEach(item =>{ // 取得時間內的所有事件並依序執行
if (Now <= item.getStartTime()) {
NotifyContents += (item.getTitle() != "") ? ("\n\n" + item.getTitle() + "\n") : ("\n\n空標題\n");
NotifyContents += (item.getDescription() != "") ? item.getDescription() : "";
}
}
)
// Line Notify 傳送訊息
}

Line Notify 傳送訊息

1
2
3
4
5
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", {
"method" : "post",
"payload" : {"message" : NotifyContents},
"headers" : {"Authorization" : "Bearer " + LineNotifyToken}
});

要傳送通知的屬性都是使用物件包著,只需要 3 個屬性和值再加上網址就可以傳出通知了

完整程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const NotifyToken = 'abcdefg...';   // Line Notify 權杖
const CalendarID = "ABCDEFG...@gmail.com"; // 月曆 ID
const calendar = CalendarApp.getCalendarById(CalendarID);

const Now = new Date();
const Start = new Date(new Date().setHours(0, 0, 0, 0));
const End = new Date(new Date().setHours(23, 59, 59, 999));
const calendarData = calendar.getEvents(Start, End);

function Notify() {
var Contents = '';
calendarData.forEach(item =>{
if (Now <= item.getStartTime()) {
NotifyContents += (item.getTitle() != "") ? ("\n\n" + item.getTitle() + "\n") : ("\n\n空標題\n");
NotifyContents += (item.getDescription() != "") ? item.getDescription() : "";
}
}
)
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", {
"method" : "post",
"payload" : {"message" : NotifyContents},
"headers" : {"Authorization" : "Bearer " + LineNotifyToken}
});
}

參考文件

我懶得看行事曆,LINE你可以通知我嗎?

讓Line提醒你google 日曆的活動

LINE Notify API Document

Script Services 參考資料