首页 > 解决方案 > 加速电子表格的脚本(GAS - Google App Script & Google Sheets)

问题描述

我有一个很长的脚本,并总结了我在脚本中多次使用的命令,它们有以下类型:

  var spreadsheet = SpreadsheetApp.getActive();

  spreadsheet.getRange('Page 1!A1').activate();
  spreadsheet.getCurrentCell().setFormula('=UNIQUE(H2:H)');

  spreadsheet.getRange('Page 2!P1:P').activate();
  spreadsheet.getRange('Page 3!A1:A').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  spreadsheet.getRange('Page 3!A1').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true}); 

  //----------------------------------------------

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var page = ss.getSheets()[0];
  var range = page.getRange('Page 4!A2:R51');
  range.sort({column:8, ascending:false});

而且我想知道如何加快这些过程,因为我学会了通过宏创建大多数东西,我最终也玩脚本,我知道没有必要使用它们,但我在调整和调整时有点困难删除不必要的东西。

标签: google-apps-scriptgoogle-sheets

解决方案


查看Best Practices,尤其是关于最小化对其他服务的调用的部分。这是一种过度简化,但基本上每次调用电子表格服务方法 ( .doSomething()) 时,都会减慢脚本的速度。

  var ss = SpreadsheetApp.getActive();

  ss.getRange('Page 1!A1').setFormula('=UNIQUE(H2:H)');
  ss.getRange('Page 3!A1:A').copyTo(ss.getRange('Page 2!P1:P'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  ss.getRange('Page 3!A1').clear({contentsOnly: true, skipFilteredRows: true}); 

  //----------------------------------------------

  ss.getRange('Page 4!A2:R51').sort({column:8, ascending:false});

改进:

  • SpreadsheetApp.getActive()并且 SpreadsheetApp.getActiveSpreadsheet()是相同的。只调用一次。
  • 无需获取范围然后激活它。激活基本上只是为了与用户选择进行交互,但这似乎不是您需要的。你这样做的方式是调用电子表格服务 4 次:(1) 获取范围,(2) 激活范围,(3) 获取激活的范围,(4) 对激活的范围做一些事情。您可以通过简单地获取范围来将这些调用减半,然后对其执行您需要的任何操作。
  • 您在.getRange('Page 4!A2:R51')通话中指定页面,因此无需进行ss.getSheets()通话。

可能还有很多其他改进可以进行,但这可能需要对您的代码进行完整的重构。这对你来说可能是一个很好的锻炼。如果您查看最佳实践中的批处理操作部分,您可能会了解可以在多大程度上提高性能(他们的示例代码从 70 秒缩短到仅 1 秒)。


推荐阅读