谷歌脚本性能下降

时间:2013-10-01 15:29:22

标签: javascript performance google-apps-script google-sheets google-spreadsheet-api

我是Google脚本的新手。

任何人都可以提供一些如何提高编码性能的建议?如果numOfEmail变量是一个非常大的数字,那么性能会变慢。

for (var i = 0; i < numOfEmail; i++)
  {
  var messages=threads[i].getMessages();  
  for (var j = 0; j < messages.length; j++) 
    {                   
    sheet.getRange("A"+(lastEntry+i)).setValue(messages[j].getId());
    sheet.getRange("B"+(lastEntry+i)).setValue(messages[j].getDate());
    sheet.getRange("C"+(lastEntry+i)).setValue(messages[j].getFrom());
    sheet.getRange("D"+(lastEntry+i)).setValue(messages[j].getSubject());
    sheet.getRange("E"+(lastEntry+i)).setValue(messages[j].getTo());
    sheet.getRange("F"+(lastEntry+i)).setValue(messages[j].getCc());
    sheet.getRange("G"+(lastEntry+i)).setValue(messages[j].getBcc());                  

    if(i/numOfEmail*100-oldPercentage>4)
      {
      oldPercentage=i/numOfEmail*100;
      sheet.toast(i/numOfEmail*100+"% completed", "In Progress", 3);
      }
    } 
  }

我确实问了谷歌,我发现a answer如何加快脚本速度,但我不知道如何修改代码。请劝告。

其实我想尝试将我的Gmail导出到电子表格。我使用的示例代码来自此link。目前的示例代码只能导出200封电子邮件,但我将其更改为1000,因为我的gmail acc中有大约500封++电子邮件。当我尝试运行代码时,运行脚本需要很长时间,并且永远不会结束运行。看起来像程序挂在代码中的某些位置。我想知道为什么。并且当每次脚本更新大约5-10行数据时至少需要20-30秒。

1 个答案:

答案 0 :(得分:2)

您引用的最佳做法的规则1是“最小化对服务的调用”。这意味着您应该将尽可能多的功能移动到常规JavaScript中,并且不那么频繁地调用Google服务。你在循环中做的任何事情都是这种优化的主要目标。例如:

sheet.getRange("A"+(lastEntry+i)).setValue(messages[j].getId());
sheet.getRange("B"+(lastEntry+i)).setValue(messages[j].getDate());
sheet.getRange("C"+(lastEntry+i)).setValue(messages[j].getFrom());
sheet.getRange("D"+(lastEntry+i)).setValue(messages[j].getSubject());
sheet.getRange("E"+(lastEntry+i)).setValue(messages[j].getTo());
sheet.getRange("F"+(lastEntry+i)).setValue(messages[j].getCc());
sheet.getRange("G"+(lastEntry+i)).setValue(messages[j].getBcc()); 

变为

var values = [[messages[j].getId(),
              messages[j].getDate(),
              messages[j].getFrom(),
              messages[j].getSubject(),
              messages[j].getTo(),
              messages[j].getCc(),
              messages[j].getBcc()]]; 

sheet.getRange("A"+(lastEntry+i)+":G"+(lastEntry+i)).setValues(values); 

将每行12个服务调用更改为2个。