用于扫描gmail收件箱并写入电子表格的Google Script太慢了

时间:2017-11-07 21:46:31

标签: javascript email google-apps-script

提前感谢您的帮助。

我最近发现了Google Script,并且一直在尝试编写一个脚本,每天扫描收件箱中最近的500封电子邮件,审核每封电子邮件主题的内容,然后将每封电子邮件的发件人与电子表格中的电子邮件地址。如果发件人与电子表格中的电子邮件地址匹配,则脚本应输入“是”。以下是我能够在下面提出的代码。我遇到的问题是代码非常慢,在它通过大约100行数据后,它会超时。

我想知道专家是否知道我哪里出错了?我确信我的代码存在很大缺陷。但是,我无法弄清楚如何改进它。

function getMail(){
    var thread = GmailApp.getInboxThreads(0,500);
    var sheet = SpreadsheetApp.getActiveSheet();
    var startRow = 2;  
    var numRows = 300;   // Number of rows to process
    var dataRange = sheet.getRange(startRow, 1, numRows, 10); // 
    var data = dataRange.getValues();  
    var target = "Sales Email"
    for (var b = 0; b < data.length; ++b){
      var row = data[b];
      var leadEmail = row[4];
      for (var i = 0; i < thread.length; ++i){  
        var message = thread[i].getMessages();
        for(var c = 0; c < message.length; ++c){
          var currentMessage = message[c];
          var subject = currentMessage.getSubject();
          if(subject.indexOf(target) !== -1) {        
            var sender = currentMessage.getFrom().replace(/^.+<([^>]+)>$/, "$1");
            if(sender == leadEmail){
              sheet.getRange(startRow + b, 7).setValue("yes");
              SpreadsheetApp.flush();
              break;
             
            } 
          }
        
        }
    
       }
      }
    }

1 个答案:

答案 0 :(得分:0)

我设法使代码更快。没有必要为每一行一遍又一遍地从所有线程中获取所有消息。只需获取一次并将发送者写入数组。

function getMail(){
  var senders = [],
      threads = GmailApp.getInboxThreads(0,500),
      target = "Sales Email";

  for (var i = 0; i < threads.length; ++i) {
    var messages = threads[i].getMessages();
    for(var j = 0; j < messages.length; j++) {
      var currentMessage = messages[j],
          subject = currentMessage.getSubject(),
          sender = currentMessage.getFrom().replace(/^.+<([^>]+)>$/, "$1");
      if(subject.indexOf(target) !== -1) senders[sender] = true;
    }
  }

  var sheet = SpreadsheetApp.getActiveSheet(),
      startRow = 2,
      numRows = 300,
      dataRange = sheet.getRange(startRow, 1, numRows, 10),
      data = dataRange.getValues();

  for (var b = 0; b < data.length; ++b) {
    var row = data[b],
        leadEmail = row[4];

    if(senders[leadEmail]) {
      sheet.getRange(startRow + b, 7).setValue("yes");
    } 
  }
}