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

时间:2014-08-26 17:36:38

标签: google-apps-script

我在Google云端硬盘中的电子表格脚本中从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;
};

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

应用脚本Cache Service最多可以缓存100KB per key,您不应该只遇到“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;
}