通过缓存电子表格值提高脚本性能

Luk*_*uke 5 caching google-sheets google-apps-script

我正在尝试使用 Google Apps 脚本开发一个 web 应用程序以嵌入到 Google 站点中,该站点仅显示 Google 表格的内容并使用一些简单的参数对其进行过滤。至少目前是这样。稍后我可能会添加更多功能。

我有一个功能强大的应用程序,但发现过滤通常需要一段时间,因为客户端有时必须等待最多 5 秒才能收到来自服务器的响应。我认为这很可能是因为每次调用电子表格时我都使用 SpreadsheetApp 类按 ID 加载电子表格。

我决定doGet使用 CacheService在我的函数中缓存电子表格值,而是每次都从缓存中检索数据。

然而,出于某种原因,这意味着二维数组现在被视为一维数组。因此,当在 HTML 表格中显示数据时,我最终得到一列,每个单元格都被一个字符占据。

这就是我实现缓存的方式;据我从 API 参考中得知,我没有做错任何事情:

function doGet() {
  CacheService.getScriptCache().put('data', SpreadsheetApp
                                  .openById('####')
                                  .getActiveSheet()
                                  .getDataRange()
                                  .getValues());

  return HtmlService
      .createTemplateFromFile('index')
      .evaluate()
      .setSandboxMode(HtmlService.SandboxMode.IFRAME);
}

function getData() {
  return CacheService.getScriptCache().get('data');
}
Run Code Online (Sandbox Code Playgroud)

这是我第一次使用 GAS 开发合适的应用程序(我之前在 Sheets 中使用过它)。有什么很明显的我遗漏了吗?我在 CacheService 参考页面上没有看到任何类型限制...

Mog*_*dad 5

CacheService 存储的是Strings,所以你的二维数组等对象会被强制为Strings,这可能不符合你的需求。

使用 JSON 实用程序控制结果。

myCache.put( 'tag', JSON.stringify( myObj ) );

...

var cachedObj = JSON.parse( myCache.get( 'tag' ) );
Run Code Online (Sandbox Code Playgroud)

  • 是的,异步加载会缩短初始加载。新的“IFRAME”沙箱类型也应该有所帮助,但请注意它目前 [在 IE 中损坏](https://code.google.com/p/google-apps-script-issues/issues/detail?id=4611) . (2认同)