嘗試將Gmail裡特定的未讀信件透過LINE Notify來推播
程式可以分為2個部分
第1個部分是LINE Notify推播
除了Token之外,基本上這個程式是可以共用的
必須要留意的部分是“Bearer “,r後面有1個空格
1 2 3 4 5 6 7 8 9 10 |
function send_line(gm) { var lineToken ='**********************************************'; var payload = { 'message': gm }; var options = { "method": "post", "payload": payload, "headers": { "Authorization": "Bearer " + lineToken } }; UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options); } |
第2個部分就是串接Gmai
由於是透過Google Apps Script串接Gmail資料,因此直接使用內建的函式庫即可
主要流程是將搜尋的關鍵字串,例如:關鍵字、標籤、已讀、未讀、時間範圍等等,
如果有相對應的結果,會回傳GmailThread[]資料
每個Thread都是1個信件( GmailMessage[])組合
可以用GmailApp.getMessagesForThreads()取出其中所有的Message
又,因為未讀信件是最新/最後的一筆資料
因此透過slice(-1)[0]取得
(備註:slice()取得的是陣列資料,因為也只有一筆,所以用[0]取出)
特定的Message,可以用getPlainBody()取得信件內容、getSubject()取得信件主旨
其他的內容可以參考Class GmailMessage的說明
其中必須要注意的是搜尋字串內的時間範圍
如果用文字格式,例如:2021/11/2,最小單位就只能指定到「日」
如果用 UNIX epoch time格式,就可以指定到「時分秒」的時間範圍
UNIX epoch time是自 1970/01/01 以来的秒數
getTime()取得的是自 1970/01/01 以来的毫秒數
所以在程式碼必須進行轉換
備註:傳入的UNIX epoch time必須是整數值,所以毫秒數/1000之後,必須用Math.floor()取得小於給定數值的最大整數值
以下是不同時間格式的程式碼
版本1-時間範圍 年/月/日
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 |
function time_termBy_day() { var now_time = new Date().getTime(); //getTime()取得的是自 1970/01/01 以来的毫秒數 Logger.log(new Date(now_time)); var time_term = now_time - ( 1000 * 60 * 60 * 24 * 3 ); //間隔3天 //var time_term = now_time - ( 60*1000*60*3 ); Logger.log(new Date(time_term)); var yyyy = new Date(time_term).getFullYear(); var mm = new Date(time_term).getMonth()+1; var dd =new Date(time_term).getDay(); var afterTime =yyyy+'/'+ mm +'/'+ dd; var strTerms = '(is:unread '+words+' after:'+afterTime+')' ; Logger.log(strTerms); var myThreads = GmailApp.search(strTerms); //Logger.log(myThreads); if(myThreads.length !== ''){ var myMsgs = GmailApp.getMessagesForThreads(myThreads); for (var i = 0; i < myMsgs.length; i++) { Logger.log(myMsgs[i].length); Logger.log(myMsgs[i].slice(-1).length); Logger.log(myMsgs[i].slice(-1)[0].getPlainBody()); Logger.log(myMsgs[i].slice(-1)[0].getSubject()); //執行send_line() send_line('\n'+myMsgs[i].slice(-1)[0].getSubject()); //send_line('\n\n'+myMsgs[i].slice(-1)[0].getPlainBody()); //for(var j = 0; j < myMsgs[i].length; j++){ //Logger.log(myMsgs[i][j].getPlainBody()); //} } } } |
版本2-時間範圍 UNIX epoch time格式
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 |
function time_termBy_millisecond() { var now_time = new Date().getTime(); //getTime()取得的是自 1970/01/01 以来的毫秒數 Logger.log(now_time); var time_term = now_time - ( 1000*60*60*5 ); //間隔5小時=5*60分鐘*60秒*1000毫秒 Logger.log(time_term); var strTerms = '(is:unread '+words+' after:'+ Math.floor(time_term / 1000) +')' ; Logger.log(strTerms); var myThreads = GmailApp.search(strTerms); var myMsgs = GmailApp.getMessagesForThreads(myThreads); for (var i = 0; i < myMsgs.length; i++) { Logger.log(myMsgs[i].length); Logger.log(myMsgs[i].slice(-1)[0].getPlainBody()); Logger.log(myMsgs[i].slice(-1)[0].getSubject()); //執行send_line() send_line('\n'+myMsgs[i].slice(-1)[0].getSubject()); //for(var j = 0; j < myMsgs[i].length; j++){ //Logger.log(myMsgs[i][j].getPlainBody()); //} } } |
版本3-時間範圍 UNIX epoch time格式,外部程式處理UNIX epoch time
使用setHours(hoursValue, minutesValue, secondsValue) 設定UNIX epoch time的時 分 秒
再將新的時間傳入外部程序secondsSinceEpoch轉換成UNIX epoch time格式
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 |
//-----------------------------------------------------------------------------外部程序處理UNIX epoch time時間 function secondsSinceEpoch(date){ return Math.floor(date.getTime() / 1000); //getTime()取得的是自 1970/01/01 以来的毫秒數 } function time_termBy_millisecond_2() { var before = new Date(); var before_hh = before.getHours(); var before_mm = before.getMinutes(); var before_ss = before.getSeconds(); var after =new Date(); after.setHours(before_hh-10, before_mm, before_ss, 0); //間隔10小時 var strTerms = '(is:read '+words+' after:'+secondsSinceEpoch(after)+')' ; //執行外部程序 secondsSinceEpoch 處理UNIX epoch time時間 Logger.log(strTerms); var myThreads = GmailApp.search(strTerms); var myMsgs = GmailApp.getMessagesForThreads(myThreads); for (var i = 0; i < myMsgs.length; i++) { Logger.log(myMsgs[i].length); Logger.log(myMsgs[i].slice(-1)[0].getPlainBody()); Logger.log(myMsgs[i].slice(-1)[0].getSubject()); //執行send_line() send_line('\n'+myMsgs[i].slice(-1)[0].getSubject()); //for(var j = 0; j < myMsgs[i].length; j++){ //Logger.log(myMsgs[i][j].getPlainBody()); //} } } |
程式完成之後,接下來就是依據時間設定自動觸發