我有一个谷歌电子表格,在许多单元格中调用用户特定的功能。此函数获取3-4个特定的相对较短的网页并对其进行解析。页面每天只更改一次,但我不能/不知道如何强制我的电子表格每天只获取一次页面并使用缓存副本。 我相信在20次提取后刷新时会发生urlfetchapp错误。 “服务调用次数太多”。
我尝试找到解决此问题的方法。我认为这个错误是因为许多URL提取(即使是相同的URL,内容不变),而不是因为许多解析。
如果这是真的,怎么可以减少提取次数?例如,我可以在某处下载页面并在本地解析它们吗?我可以在谷歌电子表格中对网页使用某种缓存吗?如果我将这些文件的副本保存到我的电子表格所在的Google驱动器中会有帮助吗? 我可以增加URLfetchapp的限制吗? 还有其他想法吗?
答案 0 :(得分:2)
您应该考虑使用为此类用例创建的Cache service。 This blog post介绍该服务会显示一些基本用法。
答案 1 :(得分:1)
为了避免类似的问题,我实施了一种解决方法。它不是很优雅,但它的工作原理。它在循环中使用 Utilities.sleep():
function urlFetchWihtoutError(url) {
const NB_RETRY = 10;
var nbSecPause = 1.5;
var nbErr = 0;
while (nbErr < NB_RETRY) {
try {
if (nbErr > 0) SpreadsheetApp.getActiveSpreadsheet().toast("Here we go again.");
var res = UrlFetchApp.fetch(url).getContentText();
return res;
}
catch (error) {
nbErr++;
SpreadsheetApp.getActiveSpreadsheet().toast("Let's pause the system during " + nbSecPause + " seconds. Loop number: " + nbErr);
Utilities.sleep(nbSecPause * 1000)
nbSecPause += 0.5;
}
}
}
答案 2 :(得分:0)
添加缓存正是我所需要的。因此,我实现了一个使用缓存的fetch(url)函数,从而避免了重复调用。
function fetch(url) {
var cache = CacheService.getScriptCache();
var result = cache.get(url);
if(!result) {
var response = UrlFetchApp.fetch(url);
result = response.getContentText();
cache.put(url, result, 21600);
}
return result;
}