我对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缓存值的内容,因此可能没有对脚本进行评估,因为单元格的值没有改变。这是这种情况吗?如果是,是否有解决方法?
非常感谢任何帮助!
答案 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函数
上创建了一个可安装的触发器功能上升,时间驱动,分钟计时器,每分钟
答案 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分钟的触发器来执行它,每一分钟都会更新表的所有函数。
我希望这会对你有所帮助。