需要帮助创建GMAIL发布/订阅通知服务到SpreadsheetApp(Google Appscript)

时间:2017-03-24 23:49:53

标签: google-apps-script google-cloud-pubsub

我希望我没有重新发布这个问题,但是我的老板把这个问题推到了高优先级,我需要帮助来解决这个问题。我正在尝试使用GAS脚本从我的GSuite域上的地址中提取发布/订阅通知(目前,我正在测试我的)。基本上,我正在努力完成所有这些材料中描述的内容:

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项目,作为草稿发布到Chrome商店,添加了PUB / SUB API和库,连接到Pub / Sub Cloud服务并具有Gmail服务帐户的权限,并创建了必要的主题/订阅。我已经运行了enrollEmail并找回了一个有效的history_Id,我可以使用API​​资源管理器查找并确认该文件可以写入Drive上的指定电子表格。但doPost方法永远不会像我希望的那样在电子表格上触发事件。有人可以帮我找出为什么这段代码不能在我的域上运行?我没有明确的错误消息,因为我正在尝试运行post服务。

这是我的代码:

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 个答案:

答案 0 :(得分: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('info@mydomain.com'))&&(*/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运行,但如果开发人员想要记录对原始问题的响应,我将保持此线程处于打开状态。谢谢,伙计们!