getMessageById()减慢速度

时间:2015-10-22 12:27:40

标签: google-apps-script gmail gmail-api

我正在处理一个使用电子邮件的脚本,它需要获取电子邮件的时间戳,发件人,收件人和主题。 Google脚本项目在单独的脚本文件中有几个函数,所以我不会在这里列出所有内容,但主要是main函数执行查询并将其传递给一个获取数据的函数:

queriedMessages = Gmail.Users.Messages.list(authUsr.mail, {'q':query, 'pageToken':pageToken});
dataOutput_double(sSheet, queriedMessages.messages, queriedMessages.messages.length);

所以这会将一个对象发送到函数 dataOutput_double 和数组的大小(如果我试图在输出数据的函数内获取数组的大小我收到一个错误,这就是为什么这里传递的原因)。输出数据的函数如下所示:

function dataOutput_double(sSheet, messageInfo, aLenght) {
  var sheet = sSheet.getSheets()[0],
      message,
      dataArray = new Array(),
      row = 2;
  var i, dateCheck = new Date;
  dateCheck.setDate(dateCheck.getDate()-1);

  for (i=aLenght-1; i>=0; i--) {
    message = GmailApp.getMessageById(messageInfo[i].id);
    if (message.getDate().getDate() == dateCheck.getDate()) {
      sheet.insertRowBefore(2);
      sheet.getRange(row, 1).setValue(message.getDate());
      sheet.getRange(row, 2).setValue(message.getFrom());
      sheet.getRange(row, 3).setValue(message.getTo());
      sheet.getRange(row, 4).setValue(message.getSubject());
    }
  }

  return; 
};

这些代码中的一部分将被删除,因为其他类型的处理剩余部分。

我注意到的问题是,有些消息需要花费很长时间才能获得getMessageById()方法(确切地说大约需要4秒),并且当脚本每天处理大约1500封邮件时,这会使其拖动很长一段时间迫使谷歌停止剧本,因为它花了太长时间。

关于如何解决这个问题的任何想法,或者这只是我必须忍受的事情?

1 个答案:

答案 0 :(得分:0)

这是我掀起的事情:

function processEmails() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
  var messages = Gmail.Users.Messages.list('me', {maxResults:200, q:"newer_than:1d AND label:INBOX NOT label:PROCESSED"}).messages,

      headers,
      headersFields = ["Date","From","To","Subject"],
      outputValue=[],thisRowValue = [],
      message
  if(messages.length > 0){
    for(var i in messages){
      message = Gmail.Users.Messages.get('me', messages[i].id);
     Gmail.Users.Messages.modify( {addLabelIds:["Label_4"]},'me',messages[i].id);
      headers = message.payload.headers
      for(var ii in headers){
        if(headersFields.indexOf(headers[ii].name) != -1){
          thisRowValue.push(headers[ii].value);
        } 
      }           
      outputValue.push(thisRowValue)
      thisRowValue = [];
    }
    var range =  ss.getRange(ss.getLastRow()+1, ss.getLastColumn()+1, outputValue.length, outputValue[0].length);

    range.setValues(outputValue);
  }


}

注意:这是作为触发器运行的。这将在200条消息中批量触发调用。您需要将标签PROCESSED添加到gmail。同样在线:

Gmail.Users.Messages.modify( {addLabelIds:["Label_4"]},'me',messages[i].id);  

显示Label_4。在我的Gmail帐户中,“已处理”是我的第四个自定义标签。