Google电子邮件提取脚本 - 超过最长执行时间(无论如何)

时间:2016-11-18 22:33:23

标签: javascript timeout gmail

我使用以下脚本根据某些搜索条件从gmail中提取电子邮件地址,并将其输出到Google电子表格。从功能上讲,脚本可以正常工作并完成我想做的事情。

但是,当我运行脚本时,我不断得到“超过最长执行时间”,因为gmail脚本的最长执行时间似乎是五分钟。我在gmail中用一个较小的标签测试了这个,并附带了一些电子邮件,脚本成功运行并按预期输出电子邮件。但是,当我尝试使用更多电子邮件提取更大批量的任何内容时,脚本无法完成。

这个脚本与我在网上找到的其他东西混在一起。我试图通过在try块中添加for循环来修改此超时问题,异常被捕获并发送到睡眠状态,以便脚本可以暂停执行而不超过时间限制,但是这不起作用。我还尝试了其他方法将脚本发送到睡眠状态,以防止发生超时,但这些方法不成功。

有人可以帮助我防止发生超时,或者使用更有效的方式搜索电子邮件线程来抓取电子邮件吗?

编辑:我已经修改了添加了建议的代码,但是如果没有达到执行时间限制,它仍然无法完成。任何想法为什么脚本没有暂停?我还尝试使用GmailApp.search(搜索,0,1)搜索一条消息,但是当我搜索我的收件箱时,脚本将无法完成。

function extractEmailAddresses() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();   
  var userInputSheet = ss.getSheets()[0];

  var labelName = userInputSheet.getRange("B2").getValue();
  var keyword = userInputSheet.getRange("C2").getValue();

  var sheetName = "Label: " + labelName;
  var sheet = ss.getSheetByName (sheetName) || ss.insertSheet (sheetName, ss.getSheets().length);
  sheet.clear();

  var messageData = [];

  var search = "label:" + label + "is:unread " + keyword;

  // Process 50 Gmail threads in a batch to prevent script execution errors
  var threads = GmailApp.search(search, 1, 1);      

  var messages, from, email, subject, mailDate;

  try {

    for (var x=0; x<threads.length; x++) {

      var message = threads[x].getMessages()[0]; //Get message for thread
      from = message.getFrom();
      mailDate = message.getDate();
      from = from.match(/\S+@\S+\.\S+/g);   

      if ( from.length ) {            

        email = from[0];
        email = email.replace(">", "");
        email = email.replace("<", "");       

        //push emails to array
        messageData.push ([email, mailDate]);
      }
    }
  }

  catch (e) {
    //Pause script to prevent exceeded timeout error
    Logger.log(e.toString());
    Utilities.sleep(5000);
  }

  //Adding our emails to the spreadsheet
  sheet.getRange (1, 1, messageData.length, 2).setValues (messageData);

}

1 个答案:

答案 0 :(得分:0)

两个简单的想法,我没有仔细研究它,也不太了解API:

  1. 请勿拨打getMessages两次:

    替换:

    from = threads[x].getMessages()[0].getFrom();
    mailDate = threads[x].getMessages()[0].getDate();
    

    使用:

    var message = threads[x].getMessages()[0];
    from = message.getFrom();
    mailDate = message.getDate();
    
  2. 避免在每次迭代时使用setValue:电子表格的单个单元格更新速度很慢,因为每次都需要与Sheets基础架构进行通信并提交值。相反,使用setValues(Object[][])

  3. 构建更大的单元格值数组以进行更改并一次设置所有单元格值

    这些只是快速浏览的想法,对不起。