Google sheet 未更新自定义函数 return 值

Google sheet not updating custom function return value

我对 Google Apps Script(以及 JavaScript,就此而言)还是个新手,但我一直在尝试修改它以获得乐趣。

我尝试编写一个脚本来获取 Google 表格中的 API 价格数据,但我发现在同一单元格中重新评估脚本时返回的值没有更新。

下面是一个从 Coinbase API 获取比特币价格数据的脚本。该脚本解析请求的 JSON 响应,如 here 所述。

function getBTCPrice() {
  var url = "https://api.coinbase.com/v2/prices/BTC-USD/spot";
  var response = UrlFetchApp.fetch(url);

  var jsonSpotPrice = response.getContentText();
  var parseSpotPrice = JSON.parse(jsonSpotPrice);
  var price = "$" + parseSpotPrice.data.amount;

  return price
}  

现在,如果我在某个单元格中输入 =getBTCPrice(),然后稍后重新评估,我会得到相同的价格;但是,如果我在不同的单元格中评估脚本,我会得到不同的结果。

我已经阅读了一些关于 Google 在单元格中缓存值的内容,因此可能未评估脚本是因为单元格的值未更改。这是这里的情况吗?如果是这样,是否有解决方法?

非常感谢任何帮助!

Refresh data retrieved by a custom function in google spreadsheet 上查看此答案。

正如回答者所说,诀窍是

My solution was to add another parameter to my script, which I don't even use. Now, when you call the function with a parameter that is different than previous calls, it will have to rerun the script because the result for these parameters will not be in the cache.

维克

除了 Vikramaditya Gaonkar 的回答,您还可以使用可安装的触发器每分钟获得一个刷新结果。

function getBTCPrice(input) {  

  url = "https://api.coinbase.com/v2/prices/BTC-USD/spot";
  response = UrlFetchApp.fetch(url);

  var jsonSpotPrice = response.getContentText();
  var parseSpotPrice = JSON.parse(jsonSpotPrice);
  var price = "$" + parseSpotPrice.data.amount;

  return price

} 

function up(){

  SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());

}

在我的例子中,getBTCPrice 函数的参数是每分钟随机化的单元格 A1。为此,我在 up 函数

上创建了一个可安装的触发器

function up, time-driven, minute timer, every minute

我终于明白了!技巧是在脚本中调用函数,而不是尝试从实际的 sheet 单元格(显然存储缓存值)调用自定义函数。

使用我上面的脚本:

function getBTCPrice(url) {
  var response = UrlFetchApp.fetch(url);

  var jsonSpotPrice = response.getContentText();
  var parseSpotPrice = JSON.parse(jsonSpotPrice);
  var price = "$" + parseSpotPrice.data.amount;

  return price; 
}

然后您可以从另一个脚本调用此函数。具体来说,我希望将更新后的价格分配给一个单元格。下面是一个示例,它将价格分配给单元格 A1:

中的活动价差 sheet
function updatePrice(){
    var a = getBTCPrice("https://api.coinbase.com/v2/prices/BTC-USD/spot");
    SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(a);
}

然后您可以继续设置适当的时间触发器。仅此而已!

我也在尝试更新我的自定义函数,经过搜索我想出了以下函数:

function updateFormulas() {
  range = SpreadsheetApp.getActiveSpreadsheet().getDataRange();
  formulas = range.getFormulas();
  range.clear();
  SpreadsheetApp.flush();
  range.setValues(formulas);
}

上面的函数更新了点差的所有公式sheet。根据我进行自定义函数更新的经验,我必须更改它的值,所以我得到 sheet 的所有数据,然后我得到公式并将它们存储到一个变量中,然后我清除它们的值并应用它用 "flush" 更改,最后我用我存储的公式更新我刚刚清除的值。

我创建了这个函数,在我的例子中,我将触发器设置为 1 分钟来执行它,每分钟更新 table 的所有函数。

希望对您有所帮助。