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

时间:2014-12-17 14:20:00

标签: caching google-apps-script google-sheets

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

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

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

然而,出于某种原因,这意味着什么是二维数组现在被视为一维数组。因此,当在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');
}

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

2 个答案:

答案 0 :(得分:4)

CacheService存储字符串,因此诸如二维数组之类的对象将被强制转换为字符串,这可能无法满足您的需求。

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

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

...

var cachedObj = JSON.parse( myCache.get( 'tag' ) );

答案 1 :(得分:2)

缓存过期。 put方法没有 expirationInSeconds 参数将在10分钟后到期。如果您需要将数据保持活动超过10分钟,则需要指定 expirationInSeconds ,最长为6小时。因此,如果您特别不需要数据到期,缓存可能不是最佳用途。

您可以使用缓存来控制用户登录的时间。

您也可以尝试使用全局变量,有些人会告诉您永远不要使用它。要声明全局变量,请在任何函数之外定义变量。