我编写了一个自定义Google Apps脚本,该脚本id
将从Web服务接收价格并从中获取信息(价格)。
我在电子表格中使用了此脚本,并且效果很好。我的问题是这些价格在变化,我的电子表格没有更新。
如何强制它重新运行脚本并更新单元(无需手动遍历每个单元)?
我编写了一个自定义Google Apps脚本,该脚本id
将从Web服务接收价格并从中获取信息(价格)。
我在电子表格中使用了此脚本,并且效果很好。我的问题是这些价格在变化,我的电子表格没有更新。
如何强制它重新运行脚本并更新单元(无需手动遍历每个单元)?
Answers:
好的,看来我的问题是google的行为很奇怪-只要脚本参数相似,它就不会重新运行脚本,它会使用以前运行的缓存结果。因此,它不会重新连接到API,也不会重新获取价格,它只会返回先前缓存的脚本结果。
在此处查看更多信息:https : //code.google.com/p/google-apps-script-issues/issues/detail?id=888
此处:总结数据的脚本未更新
我的解决方案是在脚本中添加另一个参数,我什至没有使用。现在,当您使用与先前调用不同的参数来调用该函数时,由于这些参数的结果将不在缓存中,因此必须重新运行脚本。
因此,每当我调用该函数时,对于额外的参数,我都会传递“ $ A $ 1”。我还创建了一个名为refresh的菜单项,当我运行它时,它将当前日期和时间放在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());
}
每当编辑电子表格中的任何单元格时,都会触发此功能。因此,现在您编辑一个单元格,在A1中放置一个随机数,这将按照tbkn23的建议刷新参数列表,从而导致重新评估自定义函数。
NOW()
是内置函数,而不是自定义函数。
这可能是一个超旧的线程,但对尝试这样做的人可能很有用,就像我刚才一样。
按照Lexi的脚本原样工作,它似乎不适用于当前的Sheets,但是如果我将哑变量作为参数添加到函数中(无需在函数内部实际使用),它将确实强制Google表格再次刷新页面。
因此,像这样的声明:function myFunction(firstParam,dummy)然后再调用它就像建议的那样。那对我有用。
另外,如果随机变量出现在您编辑的所有工作表上很麻烦,则限制为一张工作表的简单补救措施如下:
function onEdit(e)
{
e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random());
}
/*@customfunction*/
function sheetNames(e) {
return SpreadsheetApp.getActive()
.getSheets()
.map(function(sheet) {
return sheet.getName();
});
}
/*Create a installable trigger to listen to grid changes on the sheet*/
function onChange(e) {
if (!/GRID/.test(e.changeType)) return; //Listen only to grid change
SpreadsheetApp.getActive()
.createTextFinder('=SHEETNAMES\\([^)]*\\)')
.matchFormulaText(true)
.matchCase(false)
.useRegularExpression(true)
.replaceAllWith(
'=SHEETNAMES(' + (Math.floor(Math.random() * 500) + 1) + ')'
);
}
如果编写了自定义函数并将其在电子表格中用作公式,则每次打开电子表格或修改任何引用单元格时,都会重新计算公式。
如果您只想盯着电子表格并希望更改其值,则可以考虑添加定时触发器以更新单元格。在此处阅读有关触发器的更多信息