繁体   English   中英

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

[英]Google email extraction script - Exceeded maximum execution time (No matter what)

我正在使用以下脚本根据一些搜索条件从gmail提取电子邮件地址,并将它们输出到Google电子表格。 从功能上讲,该脚本可以工作,并且可以完成我想要的工作。

但是,当我运行脚本时,由于gmail脚本的最大执行时间似乎是五分钟,所以我不断收到“超过最大执行时间”。 我已经在gmail中使用了较小的标签(带有少量电子邮件)进行了测试,脚本成功运行并按预期输出电子邮件。 但是,当我尝试以更多的电子邮件批量提取任何内容时,脚本无法完成。

该脚本与我在网络上发现的其他内容有关。 我试图通过在try块中添加for循环来修正此超时问题,但该异常会被捕获并发送到睡眠状态,以便脚本可以暂停执行并且不超过时间限制,但是这不起作用。 我还尝试了其他方法来将脚本发送到睡眠状态,以防止发生超时,但是这些方法均成功。

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

编辑:我修改了代码,添加了建议,但是,如果没有达到执行时间限制,它仍然无法完成。 有什么想法为什么脚本不会暂停? 我还尝试使用GmailApp.search(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);

}

我有两个简单的想法,我没有详细研究它,并且不太了解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[][])建立更大的单元格数组以进行更改并一次将其全部设置

抱歉,这些只是一眼的想法。

暂无
暂无

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

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