如何在 Google Apps 脚本中缓存对象

dus*_*der 8 google-apps-script

我正在 Google Drive 电子表格的脚本中从 JIRA 获取 JSON 数据。我有一个脚本可以很好地进行提取,而且我几乎只为该问题提取数据。我得到的是 JSON 文本字段,表示有关该特定 JIRA 问题的所有数据。

不是每次我想要来自特定 JIRA 问题的字段时都调用 UrlFetch 服务,而是想在第一次获取后缓存获取的 JSON 数据。

不幸的是,Google 的 Google Apps 脚本缓存服务只会缓存字符串格式的数据,并将字符串限制为 200 个字符。JIRA 返回的 JSON 文本数据远远超过 200 个字符。

是否有其他方法可以缓存 javascript 对象(如解析的 JSON 字符串)或在 Google Apps 脚本中缓存 200 多个字符的方法?

这是我在意识到数据存储为字符串之前尝试缓存数据的代码:

function _fetchJiraData(targetIssue) {
  Logger.log("Started fetching JIRA data for '%s'", targetIssue);

  var data = cache.get(targetIssue);
  if (data == null) {
    var options = {
      headers : {
        Authorization : "Basic " + Utilities.base64Encode('user:password')
      }
    };
    var url = Utilities.formatString(
      'https://rentrak.atlassian.net/rest/api/latest/issue/%s',
      targetIssue
    );
    var result = UrlFetchApp.fetch(url, options);
    var jsonText = result.getContentText();
    data = JSON.parse(jsonText);

    cache.put(targetIssue, data);
  }

  // TODO: validate data
  return data;
};
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Hen*_*reu 8

Apps Script Cache Service最多可为每个键缓存100KB,您应该不会遇到只有“200”个字符的问题。更严格的限制仅适用于 250 个字符的密钥。

我在您的代码中看到的主要问题是您正在尝试缓存解析的数据,而不是文本。除非你的键那么大(在这种情况下,我建议你使用 enconding 代替),这应该有效:

function _fetchJiraData(targetIssue) {
  var jsonText = cache.get(targetIssue);
  if (jsonText === null) {
    //...prepare your fetch
    var result = UrlFetchApp.fetch(url, options);
    jsonText = result.getContentText();
    cache.put(targetIssue, jsonText);
  }

  var data = JSON.parse(jsonText);
  return data;
}
Run Code Online (Sandbox Code Playgroud)