【问题标题】:Custom Function re-running itself periodically自定义函数定期重新运行
【发布时间】:2017-02-09 08:41:25
【问题描述】:

我创建了一个谷歌电子表格,它使用自定义函数来调用付费 API 服务并根据一些输入参数解析结果。我可以使用激活按钮成功调用和解析数据(A1 是一个单元格,如果其值为“ON”,则调用脚本)。

我的问题是,如果我通过将激活按钮“打开”来保留解析的数据,自定义函数会自行重新运行。如果我要更改输入参数,我会理解它会重新运行,但我可以坐在那里盯着屏幕,它会再次显示“正在加载...”并再次解析数据,就好像我已经设置了再次将按钮设置为“OFF”和“ON”。这似乎是随机发生的 - 可能是 5 分钟或 2 小时。

我附上下面的函数,以及电子表格的逻辑

///  This function injects the variables into the HTTP service and if the data can be parsed returns an array.
function getCategory (category,key){
  var apiurl = "https://SERVICE/"+category+"/Country?Format=JSON&id="+key
  var result = []
  try {
    var category_data = parse(apiurl)
    var data_dictionary = category_data.TopCountryShares
    for (var i in data_dictionary){
      result.push(data_dictionary[i].CountryCode)
    } 
  }
  catch(e) {
    result.push("No Data")
  }
  return result
}

////  This is the function that parses the data above
  function parse(url){
    var parsing_url = url
    var fetchapi = UrlFetchApp.fetch(parsing_url)
    Utilities.sleep(2000)
    var data=JSON.parse(fetchapi)
    return data
  }

在电子表格中,我将 A1 作为开/关按钮,将 A5 作为单独的类别(即 A5 = 游戏、A6 = 购物等)。将使用以下 excel 公式:

B5 将是 =IF(AND($A$1="ON",ISBLANK(A5)=FALSE),TRANSPOSE(getCategory(A5,'API KEY'!$B$6)),"")

B6 将是 =IF(AND($A$1="ON",ISBLANK(A6)=FALSE),TRANSPOSE(getCategory(A6,'API KEY'!$B$6)),"")

如果我没有正确解释,情况如下:

  1. 按钮设置为关闭
  2. 我在 A5:A25 中输入了 20 个类别
  3. 我打开按钮
  4. 加载中...
  5. 从 B-F 为每个类别解析数据
  6. 我没有触及文档中的任何其他内容,有时我会在脚本重新运行时再次看到“正在加载...”

数字 6 似乎是随机发生的,我可以确认“重新计算”设置为“更改时”(在文件 -> 电子表格设置 -> 计算中找到)

以上是一个示例脚本,但真正的脚本返回的 JSON 可能非常大,因此根据我对当前限制的了解,缓存不是一个选项。

任何帮助将不胜感激 - 我正在努力解决这个问题!

【问题讨论】:

  • 您可能想尝试optimizing your custom functions,方法是修改函数,使其接受二维数组形式的范围作为输入,然后返回一个二维数组可以溢出到适当的单元格中。例如,只调用一次DOUBLE(),但让它同时计算大量单元格。
  • 我尝试过类似的方法,但最终发生的情况是,如果我将多个 URLFetches 组合成一个函数,则需要超过 30 秒并产生错误“执行自定义函数的内部错误”

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


【解决方案1】:

我假设如果您将按钮设置为关闭不刷新?是否可以选择在脚本末尾添加一行代码以在脚本完成后将按钮设置为关闭?

sheet.getRange('A1').setValue('OFF');

【讨论】:

  • 如果我将按钮设置为“关闭”,数据就会消失,如果我想保持数据显示,这不太理想。我现在正在做的是查询数据,将值复制/粘贴到本地 excel 文件,然后将按钮设置为“关闭”以减少不需要的调用。理想情况下,我希望能够将其保持“开启”状态,以便在多个用户之间共享工作表。
猜你喜欢
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
相关资源
最近更新 更多