在Google电子表格中刷新由自定义函数检索的数据

我已经写了一个自定义的谷歌应用程序脚本,将收到一个ID和从Web服务(价格)获取信息。 我在电子表格中使用这个脚本,它工作得很好。

我的问题是,这些价格变化,我的电子表格并没有得到更新。 我如何强制它重新运行脚本并更新单元格(而不需要手动检查每个单元格)?

好吧,我的问题似乎是,谷歌的行为是一个奇怪的方式 – 它不会重新运行脚本只要脚本参数是相似的,它使用来自以前的运行caching的结果。 因此,它不会重新连接到API,也不会重新获取价格,只会返回caching的以前的脚本结果。

在此处查看更多信息: https : //code.google.com/p/google-apps-script-issues/issues/detail?id = 888

并在这里: 脚本来总结数据不更新

我的解决scheme是添加另一个参数到我的脚本,我什至不使用。 现在,当您使用与以前的调用不同的参数调用函数时,必须重新运行该脚本,因为这些参数的结果将不在caching中。

所以无论何时我调用函数,为额外的parameter passing“$ A $ 1”。 我还创build了一个名为refresh的菜单项,当我运行它时,它将当前的date和时间放在A1中,因此所有对$ A $ 1作为第二个参数的脚本的调用都需要重新计算。 以下是我的脚本中的一些代码:

function onOpen() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var entries = [{ name : "Refresh", functionName : "refreshLastUpdate" }]; sheet.addMenu("Refresh", entries); }; function refreshLastUpdate() { SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString()); } function getPrice(itemId, datetime) { var headers = { "method" : "get", "contentType" : "application/json", headers : {'Cache-Control' : 'max-age=0'} }; var jsonResponse = UrlFetchApp.fetch("http://someURL?item_id=" + itemId, headers); var jsonObj = eval( '(' + jsonResponse + ')' ); return jsonObj.Price; SpreadsheetApp.flush(); } 

当我想把ID为5的项目的价格放在一个单元格中时,我使用下面的公式:

 =getPrice(5, $A$1) 

当我想刷新价格时,只需点击“刷新” – >“刷新”菜单项。 请记住,在更改onOpen()脚本之后,您需要重新加载电子表格。

我知道这是一个老问题。 但是这种方法除了做出改变之外不需要任何用户操作。

我做的和tbkn23类似。

我想重新评估的函数有一个额外的未使用的参数,$ A $ 1。 所以函数调用是

 =myFunction(firstParam, $A$1) 

但是在函数签名的代码中

 function myFunction(firstParam) 

我没有使用Refresh函数,而是使用了onEdit(e)函数

 function onEdit(e) { SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random()); } 

只要编辑电子表格中的任何单元格,都会触发此function。 所以现在你编辑一个单元格,随机数字被放置在A1,这刷新参数列表tbkn23build议,导致自定义函数被重新评估。

这是非常晚,我不知道这将是有益的,但实际上有设置在这里,你可以使NOW()自动更新

在这里输入图像描述

如果您是自定义函数在特定列内,只需按该列sorting电子表格即可。

该sorting强制刷新一次为该列的所有行调用自定义函数的数据。

这可能是一个超级老的线程,但可能会有人试图做到这一点,就像我刚才那样。

对Lexi的脚本的工作原来是这样的,现在的Sheets似乎不再工作,但是如果我将虚拟variables作为参数添加到我的函数中(不需要在函数内部实际使用它),它确实强制谷歌表单再次刷新页面。

所以,像这样的声明:函数myFunction(firstParam,dummy),然后调用它将会像build议的那样。 这对我有效。

另外,如果在编辑的所有工作表上出现随机variables是一件麻烦的事情,那么限制在一张工作表上的简单补救措施如下:

 function onEdit(e) { e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random()); } 

如果您已经编写了自定义函数并将其作为公式用于电子表格中,则每次打开电子表格或修改任何引用单元格时,都会重新计算公式。

如果您只想继续关注电子表格并希望更改其值,则可以考虑添加更新单元格的定时触发器。 在这里阅读更多关于触发器