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

时间:2017-06-27 07:55:29

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

我对Google Apps脚本(以及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缓存值的内容,因此可能没有对脚本进行评估,因为单元格的值没有改变。这是这种情况吗?如果是,是否有解决方法?

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:2)

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

正如回答者所说,诀窍是

  

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

维克

答案 1 :(得分:1)

除了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函数

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

enter image description here

  

功能上升,时间驱动,分钟计时器,每分钟

答案 2 :(得分:1)

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

使用我的上述脚本:

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

然后,您可以继续设置适当的时间触发器。这就是它的全部内容!

答案 3 :(得分:-1)

我也试图让我的自定义功能更新,搜索后我想出了以下功能:

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

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

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

我希望这会对你有所帮助。