2017-03-24 62 views
2

我希望我不必重新發布這個問題,但是我的老闆把這個問題推到了最高優先級,我需要幫助來解決這個問題。我正嘗試使用GAS腳本從我的GSuite域上的地址(目前,我正在測試我的地址)中提取發佈/訂閱通知。基本上,我要完成的任務是在所有這些材料中描述:需要幫助爲SpreadsheetApp(Google Appscript)創建GMAIL Pub/Sub Notification服務

1)Great Github Project from Spencer Easton(Instructional Video)

2) pubsub API for GMAIL

3) Notification Help

4) Real-time notifications

5)Endpoint documentation

我創建在我的Google雲端硬盤工作域中的參考文獻1中記錄的GAS項目中添加了PUB/SUB API和庫,連接到具有Gmail服務帳戶權限的Pub/Sub Cloud服務,並創建了必要的主題/訂閱。我運行了enrollEmail並取回了一個有效的history_Id,我可以使用API​​瀏覽器查找並確認該文件可以寫入Drive上指定的電子表格。但doPost方法決不會像我希望的那樣觸發事件在電子表格上書寫。有人可以幫我找出爲什麼這段代碼不適用於我的域名嗎?我沒有明確的錯誤消息,因爲我試圖運行郵政服務。

這裏是我的代碼:

function doPost(e) { 
 
    var ss = SpreadsheetApp.open(DriveApp.getFilesByName('Episode_Log').next()).getSheets()[0]; 
 
    ss.appendRow(['Push was recieved'+ new Date()]); 
 
    try{ 
 
var message = JSON.parse(e.postData.getDataAsString()).message; 
 
    var data = Utilities.newBlob(Utilities.base64Decode(message.data)).getDataAsString(); 
 
    ss.appendRow([new Date(), message.message_id, data]); 
 
    } 
 
    catch(e){ss.appendRow(['failure', e]); } 
 
    
 
    return 200; 
 
} 
 

 

 

 
function enrollEmail() { 
 
    var EMAIL = Session.getActiveUser().toString(); 
 
    var watchRes = Gmail.newWatchRequest(); 
 
    watchRes.labelIds = ["INBOX"]; 
 
    watchRes.labelFilterAction = 'include'; 
 
    watchRes.topicName = 'projects/project-id-3596301251382091354/topics/eWarning'; 
 
    
 
    var response = Gmail.Users.watch(watchRes, EMAIL); 
 
    
 
    Logger.log(response); 
 
    
 
    var ss = SpreadsheetApp.open(DriveApp.getFilesByName('Episode_Log').next()).getSheets()[0]; 
 
ss.appendRow(['Manual Test']); //This works 
 
} 
 

 
function checkHistory(){ 
 
var EMAIL = Session.getActiveUser().toString(); 
 
Logger.log(Gmail.Users.History.list(EMAIL, {startHistoryId: '****'})); //works with a valid ID 
 
}

謝謝你們這麼多!

* PS我沒有明確啓用Google Cloud帳戶的帳單。有誰知道我是否需要爲此功能計費?

回答

1

對於像我這樣需要在Google Appscript中創建監控服務並且需要快速的東西的人,我想出了一個快速腳本來檢查特定標籤的電子郵件。通過GmailApp,您也可以按主題查看消息。這是下面的代碼:

var EMAILID = Session.getActiveUser().getEmail(); 
 
function getMessages() { 
 
    var expLabel = GmailApp.getUserLabelByName('Episode Expiration'); 
 
    var threads = expLabel.getThreads(); 
 
    
 
    for(var t = 0; t < threads.length; t++) 
 
    { 
 
    var messages = threads[t].getMessages(); 
 
    for(var m = 0; m < messages.length; m++) 
 
    { 
 
     var email = {from: messages[m].getFrom().toString(), 
 
        body: messages[m].getPlainBody().toString(), 
 
        subject: messages[m].getSubject().toString()}; 
 
     
 
     Logger.log(email.subject.indexOf('Expiration')); 
 
     if(/*(email.from.toString().includes('[email protected]'))&&(*/email.subject.indexOf('Expiration') > 0)//) 
 
     { 
 
     var startInd = email.body.indexOf('Start')+12; 
 
     var endInd = email.body.indexOf('End')+12; 
 
     var pasInd = email.body.indexOf('Number')+8; 
 
     var qualInd = email.subject.indexOf('Q'); 
 
     
 
     var qualco = email.subject.substring(qualInd, qualInd+17); 
 
     var warning = email.body.substring(email.body.indexOf('Episode Expires in'),email.body.indexOf('days')+4); 
 
     var startDate = email.body.substring(startInd, startInd+12); 
 
     var endDate = email.body.substring(endInd , endInd+11); 
 
     var priorAuthNumber = email.body.substring(pasInd , pasInd+13); 
 
     
 
     var ss = SpreadsheetApp.openById('mysheetID').getSheets()[0]; 
 
     ss.appendRow([qualco, priorAuthNumber, startDate, endDate, warning]); 
 
     } 
 
     messages[m].moveToTrash(); 
 
    } 
 
    } 
 
}

在這一點上,我實際上並不需要PubSub的到了運行,但如果開發商想記錄一個,我會離開這個主題開放回應原來的問題。多謝你們!