google-apps-script - 加速电子表格的脚本(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});
而且我想知道如何加快这些过程,因为我学会了通过宏创建大多数东西,我最终也玩脚本,我知道没有必要使用它们,但我在调整和调整时有点困难删除不必要的东西。
解决方案
查看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 秒)。
推荐阅读
- visual-studio-code - Visual Studio 代码中没有语法高亮显示
- javascript - 这个 discord.js 命令如何违反 if 语句?
- android-studio - 我在改造和向服务器发送一些数据时遇到了一些问题
- python - python excel dataorganiser TypeError:'float'对象不可迭代
- python - 用于多处理同步的类似队列的对象
- ios - 更改 ViewController 并重新启动应用程序
- node.js - 节点和打字稿:调用路由时属性未定义
- tensorflow - GPU 在 fit 和使用 GradientTape 的自定义训练功能中的利用率非常不同
- plotly - Plotly Choropleth(python)背景颜色?
- python - 如何使用python将数据框中的每个行值与之前行中的每个值进行比较?