异常:服务在一天内被调用太多次:urlfetch

Exception: Service invoked too many times for one day: urlfetch

我在 Google 表格中创建了一个脚本,它运行良好,但过了一会儿我收到以下错误: 异常:服务在一天内被调用太多次:urlfetch

我想我一天调用了这个函数大约200-300次,我检查过它应该低于限制。

我读到我们可以使用缓存来避免这个问题,但不确定如何在我的代码中使用它。

function scrapercache(url) {
    var result = [];
    var description;
    var options = {
        'muteHttpExceptions': true,
        'followRedirects': false,
    };
  
var cache = CacheService.getScriptCache();
var properties = PropertiesService.getScriptProperties();

try {  
  let res = cache.get(url);

  if (!res) {
    // trim url to prevent (rare) errors
    url.toString().trim();
    var r = UrlFetchApp.fetch(url, options);
    var c = r.getResponseCode();

    // check for meta refresh if 200 ok
    if (c == 200) {
      var html = r.getContentText();
      cache.put(url, "cached", 21600);
      properties.setProperty(url, html);

      var $ = Cheerio.load(html); // make sure this lib is added to your project!

      // meta description
      if ($('meta[name=description]').attr("content")) {
        description = $('meta[name=description]').attr("content").trim();
      }
    }
  
    result.push([description]);    
  }
} 
catch (error) {
  result.push(error.toString());
} 
finally {
  return result;
}
 
}

请问我如何使用这样的缓存来增强我的脚本?

var cache = CacheService.getScriptCache();
  var result = cache.get(url);
  if(!result) {
    var response = UrlFetchApp.fetch(url);
    result = response.getContentText();
    cache.put(url, result, 21600);

答案:

您可以同时实施 CacheServicePropertiesService,并且仅在指定的时间后再次检索 URL。

代码更改:

请注意,额外调用检索缓存和属性会减慢您的功能,尤其是,如果您这样做几百次。

由于缓存的值可以是 maximum of 100 KB,我们将使用 CacheService 来跟踪要检索的 URL,但是 PropertiesService存储数据。

您可以这样编辑您的 try 区块:

var cache = CacheService.getScriptCache();
var properties = PropertiesService.getScriptProperties();

try {  
  let res = cache.get(url);

  if (!res) {
    // trim url to prevent (rare) errors
    url.toString().trim();
    var r = UrlFetchApp.fetch(url, options);
    var c = r.getResponseCode();

    // check for meta refresh if 200 ok
    if (c == 200) {
      var html = r.getContentText();
      cache.put(url, "cached", 21600);
      properties.setProperty(url, html);

      var $ = Cheerio.load(html); // make sure this lib is added to your project!

      // meta description
      if ($('meta[name=description]').attr("content")) {
        description = $('meta[name=description]').attr("content").trim();
      }
    }
  
    result.push([description]);    
  }
} 
catch (error) {
  result.push(error.toString());
} 
finally {
  return result;
}

参考文献:

相关问题:

  • Service invoked too many times for one day: urlfetch