fetchAll() 答案:研究:结论:参考:

问题描述

URLFetchApp.fetchAll() 的单次调用是否有最大数量提取请求?我对 AppScripts 的经验有限,在文档上找不到任何表明请求数量有限制的内容,但我很想知道是否存在限制。欢迎任何意见。

提前致谢

解决方法

答案:

扩展 Tanaike 在他的 benchmarking research for UrlFetchApp.fetchAll() 中进行的研究。我能够成功发出 2199 个请求,但更多的请求触发了端点的速率限制,因此我无法进一步测试。

研究:

阅读上述基准测试后,我使用 Apps Script 来查看是否可以找到该方法的限制。我使用 httpbin 进行测试,因为这是 Google 在 fetchAll(requests) 的示例代码段中提供的:

// Make both a POST request with form data,and a GET request.
var resumeBlob = Utilities.newBlob('Hire me!','text/plain','resume.txt');
var formData = {
  'name': 'Bob Smith','email': 'bob@example.com','resume': resumeBlob
};
// Because payload is a JavaScript object,it is interpreted as
// as form data. (No need to specify contentType; it defaults to either
// 'application/x-www-form-urlencoded' or 'multipart/form-data')
var request1 = {
  'url': 'https://httpbin.org/post','method' : 'post','payload' : formData
};
// A request may also just be a URL.
var request2 = 'https://httpbin.org/get?key=value';
UrlFetchApp.fetchAll([request1,request2]);

我通过初始化一个长度为 n 的数组并用如下请求填充它来修改它:

function fetchAllTester() {
  var resumeBlob = Utilities.newBlob('Hire me!','resume.txt');
  var formData = {
    'name': 'Bob Smith','resume': resumeBlob
  }

  var request1 = {
    'url': 'https://httpbin.org/post','payload' : formData
  }

  let requests = new Array(1000).fill(request1)

  UrlFetchApp.fetchAll(requests).map(x => console.log(x.getContentText()))
}

我从 1000 开始,因为这已经被证实有效。结果如下:

  • 2000 个请求 - 有效
  • 2500 个请求 - HTTP 502 由 httpbin 返回。
  • 2001 个请求 - 有效
  • 2100 个请求 - 有效
  • 2200 个请求 - HTTP 502 由 httpbin 返回。
  • 2199 个请求 - 有效
  • 2199 个请求 - HTTP 502 由 httpbin 返回。

此时,发送 2199 个请求似乎是间歇性响应,但出现 HTTP 502: Bad Gateway 错误,指出问题来自 fetchAll() 方法之外。

结论:

似乎存在对 UrlFetchApp.fetchAll() 的限制,然后它很高。

Quotas for Google Services page 开始,列出的唯一调用限制是:

功能 消费者(例如 gmail.com)和 G Suite 免费版 (legacy) Google Workspace 帐户
网址提取调用 20,000 / 天 100,000 / 天

因此,根据我所做的测试和 Google 提供的文档,我的假设是该方法仅受常规 Apps 脚本配额的限制;也就是说,消费者帐户每天有 20,000 个请求,Workspace 帐户每天有 100,000 个请求。

希望对你有帮助!

参考: