繁体   English   中英

Google表格未更新自定义函数返回值

[英]Google sheet not updating custom function return value

我对Google Apps脚本(以及JavaScript)非常陌生,但我一直在尝试修补它以获得乐趣。

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

以下是从Coinbase API获取比特币价格数据的脚本。 脚本解析请求的JSON响应,如描述在这里

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缓存单元格值的内容,因此可能不会评估脚本,因为单元格的值没有改变。 这是这种情况吗? 如果是这样,有解决方法吗?

任何帮助是极大的赞赏!

请查看有关Google电子表格中自定义函数检索到的刷新数据的答案。

正如回答者所说,诀窍是

我的解决方案是在我的脚本中添加另一个参数,我甚至不使用它。 现在,当您使用与先前调用不同的参数调用该函数时,它将不得不重新运行该脚本,因为这些参数的结果将不在缓存中。

维克

除了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 getBTCPrice(url) {
  var response = UrlFetchApp.fetch(url);

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

  return price; 
}

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

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);
}

上面的函数更新了电子表格的所有公式。 根据我制作自定义函数更新的经验,我不得不更改其值,因此我获取了工作表的所有数据,然后我获取公式并将它们存储到变量中,然后我清除它们的值并将此更改应用于“flush” “,最后我用我存储的公式更新了刚刚清除的值。

我创建了这个函数,在我的情况下,我设置了1分钟的触发器来执行它,每一分钟都会更新表的所有函数。

我希望这可以帮助你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM