Gg / 透過LINE Notify推播Google行事曆的每日提醒

這個練習結合了之前的LINE Notify,以及Google Apps Script的Calendar功能

為了避免跟之前的文章推播混淆

申請了新的LINE Notify token

而Google Calendar的部分使用了getEventsForDay(date)

來取得特定日期的所有活動

因為是所有活動的資料,也就是陣列型態的資料,所以透過 For loop的方式逐一取出資料

補充說明註解掉的程式內容

//var twoHoursFromNow = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000); //日 時 分 秒 毫秒
//var events = cal.getEvents(now, twoHoursFromNow);

這原本是Google的範例,使用了getEvents(startTime, endTime)來取得特定時間範圍內的事件

而變數 twoHoursFromNow則是透過new Date()設定時間範圍

也就是當下時間的變數 now,利用getTime()取得毫秒數,再加上要間隔的時間毫秒數

另外,比較需要注意的是,Google Apps Script的時區不是台北時間

因此必須重新設定時間格式

 Utilities.formatDate(new Date(),"GMT+8","yyyy/MM/dd HH:mm")

透過變數now取得當下的台北時間,因為Utilities.formatDate()回傳的是字串型態

於是再透過new Date()將字串轉為日期時間型態

var now = Utilities.formatDate(new Date(),"GMT+8","yyyy/MM/dd HH:mm");
now=new Date(now);

整體的程式分為兩部分

myCalendar()處理Google Calendar的資料,再傳到sendMessage()執行推播功能

因為sendMessage()是直接取用之前的版本

如果不需要傳出圖片的話,在myCalendar()就可以不用傳出pictureURL

當然如果要傳插圖的話,也可以設定傳出的插圖參數

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
function myCalendar() {

var cal = CalendarApp.getCalendarById("************************");

var now = Utilities.formatDate(new Date(),"GMT+8","yyyy/MM/dd HH:mm");

now=new Date(now);

Logger.log(now);
//var twoHoursFromNow = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000); //日 時 分 秒 毫秒
//var events = cal.getEvents(now, twoHoursFromNow);

var events =cal.getEventsForDay(now);

//Logger.log(events.length);

for (var i = 0; i < events.length; i++) {
  Logger.log("Event: " + events[i].getTitle() + "\n"
            +"Event Start Time: " + Utilities.formatDate(events[i].getStartTime(),"GMT+8","yyyy/MM/dd HH:mm") + "\n" 
            +"Event End Time: " + Utilities.formatDate(events[i].getEndTime(),"GMT+8","yyyy/MM/dd HH:mm") + "\n"
            +"Event Location: " + events[i].getLocation()
    );
  var message = "\n" 
              +"Event: " + events[i].getTitle() + "\n" 
              +"Event Start Time: " + Utilities.formatDate(events[i].getStartTime(),"GMT+8","yyyy/MM/dd HH:mm") + "\n" 
              +"Event End Time: " + Utilities.formatDate(events[i].getEndTime(),"GMT+8","yyyy/MM/dd HH:mm") + "\n" 
              +"Event Location: " + events[i].getLocation();

  var pictureURL= "https://i2.kknews.cc/SIG=1hsq8os/ctp-vzntr/r3sn77r39o364q46nps4n57pop734q35.jpg";
  sendMessage(message, pictureURL);
  }
}

function sendMessage(message, pictureURL){
  var Token = "******************************************";
  var URL = "https://notify-api.line.me/api/notify";

  var payload = 
      {
        'message' : message,
        //'imageThumbnail': pictureURL,
        //'imageFullsize': pictureURL
      };
  
  var header =
      {
        'Content-Type':'application/x-www-form-urlencoded',
        'Authorization' : 'Bearer ' + Token        
      }
  
  var options =
      {
        'method'  : 'post',
        'payload' : payload,
        'headers' : header
      }; 

  var response = UrlFetchApp.fetch(URL, options);
  Logger.log(response);
}

 

因為要達成每日的推播提醒

所以在觸發條件是設定成時間型觸發條件類型的日計時器

這樣就可以在每天的特定時間內觸發程式