getMessageById() 变慢

getMessageById() slows down

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

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 封邮件时,这使得它拖了很长一段时间,迫使 google 停止脚本,因为它花费的时间太长了。

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

这是我突然想到的东西:

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 帐户中 "PROCESSED" 是我的第 4 个自定义标签。