简体   繁体   中英

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. 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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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