防止在Google Spreadsheets Google Apps脚本中执行自定义功能

时间:2018-02-10 19:40:41

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

编写要在电子表格单元格中使用的自定义函数时,工作表的默认行为是在编辑时重新计算,即添加列或行将导致自定义函数更新。

如果自定义函数调用付费API并使用信用,则会出现问题,用户将自动使用API​​信用。

我无法找到防止这种情况的方法,因此我决定使用UserCache将结果缓存任意25分钟,如果他们碰巧重复相同的话,则将其提供给用户功能调用。它绝对不是防弹的,但它比我想的更好。显然是cache can hold 10mb,但这是正确的做法吗?我可以更聪明地做点什么吗?

  var _ROOT = {

  cache : CacheService.getUserCache(),
  cacheDefaultTime: 1500,

  // Step 1 -- Construct a unique name for function call storage using the 
  // function name and arguments passed to the function
  // example: function getPaidApi(1,2,3) becomes "getPaidApi123"

  stringifyFunctionArguments : function(functionName,argumentsPassed) {
    var argstring = ''
    for (var i = 0; i < argumentsPassed.length; i++) {
      argstring += argumentsPassed[i]
    }

    return functionName+argstring

  },

  //Step 2 -- when a user calls a function that uses a paid api, we want to 
  //cache the results for 25 minutes

  addToCache : function (encoded, returnedValues) { 

    var values = {
      returnValues : returnedValues
    }
    Logger.log(encoded)
    this.cache.put(encoded, JSON.stringify(values), this.cacheDefaultTime)

  }

  //Step 3 -- if the user repeats the exact same function call with the same 
  //arguments, we give them the cached result
  //this way, we don't consume API credits as easily. 

  checkCache : function(encoded) {

    var cached = this.cache.get(encoded);

    try {
      cached = JSON.parse(cached)
      return cached.returnValues
    } catch (e) {
      return false;
    }
  }

}

1 个答案:

答案 0 :(得分:1)

Google表格已经缓存了自定义函数的值,并且只有在a)函数的输入发生变化或b)电子表格在长时间关闭后打开时才会再次运行它们。我无法复制添加和删除列时提到的重新计算。这是我用来测试的简单示例函数:

Out Put
 DATE         QTYA             QTYB
 Jan1           5               6
 Jan2           10
 Jan3                           10

您使用额外缓存进行昂贵查询的方法通常很好。我建议使用function rng() { return Math.random(); } 而不是DocumentCache,因为文档的所有用户都可以并且应该看到相同的单元格值。

我还建议使用更强大的函数签名编码,因为您当前的实现能够区分参数UserCache[1, 2]。您可以对输入进行字符串化,然后对其进行base64编码以实现紧凑性:

[12]