最佳做法

本文档列出了可帮助您提高性能的 脚本的特点。

尽可能减少对其他服务的调用

在脚本中使用 JavaScript 操作要比在脚本中使用 JavaScript 快得多 调用其他服务。可通过 Google Apps 脚本完成的任何操作 这要比执行需要从中提取数据的调用要快得多 Google 的服务器或外部服务器(例如对 Google 表格、Google 文档、 协作平台、翻译、UrlFetch 等。如果可以,您的脚本将运行得更快 找到方法来尽可能减少脚本对这些服务的调用。

考虑通过共享云端硬盘开展协作

如果您正在与其他开发者一起处理一个脚本项目,可以 借助共享云端硬盘协作处理 Apps 脚本项目。 共享云端硬盘中的文件归群组(而非个人)所有。这个 让项目的开发和维护更加轻松。

使用批量操作

脚本通常需要从电子表格读取数据、执行计算 然后将数据结果写入电子表格中。Google 应用 脚本已经有一些内置优化功能,例如使用先行缓存 来检索脚本可能会获得的内容,并编写缓存来保存 可能设置的值。

您可以编写脚本以最大限度地利用内置缓存,方法是 最大限度地减少读写次数。交替读取和写入命令 运行缓慢。为了加快脚本的运行速度,可以使用一个命令将所有数据读入一个数组, 对数组中的数据执行任意操作,并使用 一条命令

下面举例说明,您不应关注或使用。脚本 使用以下代码设置 100 x 100 电子表格网格。它用作名称为 getColorFromCoordinates()(此处未显示),用于确定要使用的颜色 每个单元格:

  // 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();
  }

该脚本效率低下:它会遍历 100 行和 100 列, 连续插入 10,000 个单元格。Google Apps 脚本回写缓存可以提供以下帮助: 因为它会在每行末尾使用 flush 强制进行回写。因为 则只有 100 次对电子表格的调用。

不过,通过批量处理调用可以大幅提高代码的效率。这里有 rewrite ,其中将单元格范围读入名为“colors”(颜色)的数组中。 赋值操作是对数组中的数据执行,且 将数组写出到电子表格中:

  // 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).setBackgroundColors(colors);

低效的代码需要大约 70 秒才能运行完毕。高效代码在 只需 1 秒!

避免在界面密集型脚本中使用库

是重复使用代码的一种便捷方式, 但会略微增加脚本的启动时间。本次延误 对于运行时间相对较长的脚本(如实用程序脚本 也可以清理自己的 Google 云端硬盘文件 HTML 服务界面,其中提供了重复的、 短期运行 google.script.run 调用,延迟将影响每次调用。由于这个问题,库应 在插件中谨慎使用,并且您可能希望 避免在进行大量 google.script.run 调用的非插件脚本中使用。

使用缓存服务

您可以使用缓存服务 在脚本执行之间缓存资源。通过缓存数据,您可以 提取数据的次数或频率 设想一下您的 example.com 上的 RSS Feed 需要 20 并且您希望加快平均请求的访问速度。通过 下面的示例显示了如何使用缓存服务来加快对此内容的访问, 数据。

  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 秒, 后续访问将非常快,直到项从缓存中清除 25 分钟内完成。