如何让Google Sheets中的getStockQuote()函数每5分钟更新数值?
解决Google Sheets自定义函数
getStockQuote()无法自动刷新的问题 问题原因
Google Sheets的单元格自定义函数(即直接通过=函数名()调用的方式)会默认缓存计算结果,即使请求头里加了no-cache也无法绕过这个机制,所以只会执行一次就不再更新。你之前尝试的时间触发器无效,是因为原函数仅返回值,触发器执行它时不会主动将结果写入单元格。
解决方案一:改用触发器+主动写入单元格(推荐)
修改函数逻辑,让它主动将获取到的股票报价写入指定单元格,再配合时间触发器实现每5分钟更新:
function getStockQuoteAndUpdate() { var url = 'SOME STOCK API SERVER'; var options = { 'method' : 'post', 'contentType': 'application/json', headers: { "Cache-Control": "no-cache" }, 'payload' : JSON.stringify({"columns":["QUOTE"],"ignore_unknown_fields":false,"symbols":{"query":{"types":[]},"tickers":["SPY"]}}) } var response = UrlFetchApp.fetch(url, options); var quote = JSON.parse(response).data[0].d[0]; // 修改Sheet名称和单元格位置,指定要写入的目标 var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); targetSheet.getRange('A1').setValue(quote); }
设置时间触发器步骤:
- 打开Google Sheets,点击顶部菜单栏「扩展程序」→「Apps Script」进入脚本编辑器
- 点击左侧面板的时钟图标(触发器)
- 点击「添加触发器」,按以下配置:
- 选择运行的函数:
getStockQuoteAndUpdate - 事件源:时间驱动
- 时间类型:分钟计时器
- 间隔:每5分钟
- 选择运行的函数:
- 点击「保存」,按提示完成权限授权即可。
解决方案二:通过参数规避自定义函数缓存(不推荐,易触发API限制)
如果坚持要用单元格函数调用的方式,可以给函数加一个无意义的动态参数,让Sheets认为每次调用都是新请求,从而绕过缓存:
function getStockQuote(forceRefresh) { var url = 'SOME STOCK API SERVER'; var options = { 'method' : 'post', 'contentType': 'application/json', headers: { "Cache-Control": "no-cache" }, 'payload' : JSON.stringify({"columns":["QUOTE"],"ignore_unknown_fields":false,"symbols":{"query":{"types":[]},"tickers":["SPY"]}}) } var response = UrlFetchApp.fetch(url, options); return JSON.parse(response).data[0].d[0]; }
在单元格中调用时使用:=getStockQuote(NOW()),NOW()会实时返回当前时间,让函数每次都重新执行。但这种方式会在Sheets每次重算时都请求API,容易触发API调用频率限制,不适合高频刷新场景。
内容的提问来源于stack exchange,提问作者kensplanet
相关产品推荐
相关产品推荐

