本文档列出了可提升脚本性能的最佳实践。
尽量减少对其他服务的调用
在脚本中使用 JavaScript 操作比调用其他服务更快。在 Google Apps 脚本本身中完成的任何操作都比从 Google 服务器或外部服务器(例如对 Google 表格、Google 文档、Google 协作平台、Google 翻译和 UrlFetch 的请求)提取数据更快。如果您尽量减少服务调用,脚本的运行速度会更快。
通过共享云端硬盘展开协作
如果您与其他开发者一起处理脚本项目,请使用共享云端硬盘进行协作。 共享云端硬盘中的文件归群组(而非个人)所有,因此可以更轻松地进行项目开发和维护。
使用批量操作
脚本通常从电子表格中读取数据、执行计算,并将结果写回电子表格。Apps 脚本使用内置的优化功能,例如预读和写入缓存。
通过尽量减少读取和写入操作,最大限度地利用内置缓存。交替执行读取和写入命令的速度较慢。如需加快脚本运行速度,请使用一个命令将所有数据读入数组,对数组数据执行操作,然后使用一个命令将数据写出。
避免交替执行读取和写入操作,如以下低效示例所示:
// DO NOT USE THIS CODE. It is an example of SLOW, INEFFICIENT code.
// FOR DEMONSTRATION ONLY
var cell = sheet.getRange('a1');
for (var y = 0; y < 100; y++) {
xcoord = xmin;
for (var x = 0; x < 100; x++) {
var c = getColorFromCoordinates(xcoord, ycoord);
cell.offset(y, x).setBackgroundColor(c);
xcoord += xincrement;
}
ycoord -= yincrement;
SpreadsheetApp.flush();
}
此脚本效率低下,因为它会循环遍历 10,000 个单元格并连续写入。虽然回写缓存有所帮助,但批量调用效率更高:
// OKAY TO USE THIS EXAMPLE or code based on it.
var cell = sheet.getRange('a1');
var colors = new Array(100);
for (var y = 0; y < 100; y++) {
xcoord = xmin;
colors[y] = new Array(100);
for (var x = 0; x < 100; x++) {
colors[y][x] = getColorFromCoordinates(xcoord, ycoord);
xcoord += xincrement;
}
ycoord -= yincrement;
}
sheet.getRange(1, 1, 100, 100).setBackgrounds(colors);
低效代码大约需要 70 秒才能运行完毕,而高效代码只需 1 秒即可运行完毕。
避免在界面繁重的脚本中使用库
库便于重复使用代码,但会增加脚本启动时间。在反复进行短时间运行的 google.script.run 调用的客户端 HTML 服务界面中,此延迟非常明显。在插件中谨慎使用库,并避免在进行多次 google.script.run 调用的脚本中使用库。
使用 Cache 服务
使用 Cache 服务可在脚本执行之间缓存资源。缓存可降低数据提取频率。 以下示例展示了如何使用 Cache 服务来加快对慢速 RSS Feed 的访问速度。
function getRssFeed() {
var cache = CacheService.getScriptCache();
var cached = cache.get("rss-feed-contents");
if (cached != null) {
return cached;
}
// This fetch takes 20 seconds:
var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml");
var contents = result.getContentText();
cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
return contents;
}
虽然如果商品不在缓存中,您仍需等待 20 秒,但后续访问速度很快,直到商品过期为止。