0

我是 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);
      }
    } 
  }

我确实问过谷歌,我找到了如何加速脚本的答案,但我不知道如何修改代码。请多多指教。

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

4

1 回答 1

3

您引用的最佳实践中的规则 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 个。

于 2013-12-26T14:34:21.677 回答