简体   繁体   English

Google脚本扫描gmail收件箱并写入电子表格,速度太慢

[英]Google Script to scan gmail inbox and write to spreadsheet, too slow

Thanks in advance for your help. 在此先感谢您的帮助。

I discovered Google Script recently and have been trying to write a script that scans the most recent 500 emails in my inbox a few times a day, reviews the content of each email thread, and then compares the sender of each email, with email addresses in a spreadsheet. 我最近发现了Google Script,并且一直试图编写一个脚本,每天扫描收件箱中的最近500封电子邮件,查看每个电子邮件线程的内容,然后将每个电子邮件的发件人与电子邮件地址进行比较。电子表格。 If a sender matches an email address in the spreadsheet, the script should enter "yes". 如果发件人与电子表格中的电子邮件地址匹配,则脚本应输入“是”。 Here is the code I have been able to come up with below. 这是我下面能够提供的代码。 The problem I am having is that the code is very slow, and after it gets through about 100 rows of data, it times out. 我遇到的问题是代码非常慢,并且在通过大约100行数据后,它超时了。

I am wondering if an expert has an idea on where I am going wrong? 我想知道专家是否对我要去哪儿有想法吗? I am sure my code is very flawed. 我确信我的代码有很大缺陷。 However, I'm unable to figure out how to improve it. 但是,我不知道如何改进它。

 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; } } } } } } 

I managed to make the code a lot faster. 我设法使代码更快。 It isn't necessary to fetch all messages from all threads over and over again for each row. 不必为每一行一遍又一遍地从所有线程中获取所有消息。 Just fetch them once and write the sender into an array. 只需提取一次,然后将发送方写入数组。

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");
    } 
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM