You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheets UrlFetchApp触发外部API速率限制问题求助

解决Google Sheets中UrlFetchAPI跨地区速率限制问题

问题原因

Google Apps Script的UrlFetchApp执行时,请求出口IP由Google数据中心分配,不同地区用户触发的脚本会对应不同区域的数据中心IP。菲律宾地区的该类IP可能被大量用户共享,导致该IP下的总API请求量快速达到每分钟600次的限制,而马耳他地区的IP负载较低,因此未触发限制。

可行解决方案

1. 给API请求添加间隔延迟

在每次API调用后添加短暂延迟,分散请求时间,避免短时间内集中发送请求(即使单次刷新只有十几次,多个用户同时操作也会累加)。修改代码如下:

function callExternalAPI(endpoint) {
  const url = baseUrl + endpoint;
  const response = UrlFetchApp.fetch(url, {
    "muteHttpExceptions": true,
    "headers": {
      "X-Schema-Version": "latest",
      "Authorization": "Bearer " + apiKey
    }
  });
  // 添加500毫秒延迟,可根据情况调整(比如300-1000ms)
  Utilities.sleep(500);
  return response;
}

如果是循环调用该函数,也可以在循环逻辑中添加延迟,确保每次请求间隔开。

2. 缓存API响应结果

对于非实时更新的数据,将API返回结果缓存到脚本缓存或单元格中,减少重复请求次数。示例代码:

function callExternalAPI(endpoint) {
  const cache = CacheService.getScriptCache();
  const cacheKey = `api_${endpoint}`;
  const cachedResponse = cache.get(cacheKey);
  
  // 如果缓存存在,直接返回
  if (cachedResponse) {
    return JSON.parse(cachedResponse);
  }
  
  // 缓存不存在时调用API
  const url = baseUrl + endpoint;
  const response = UrlFetchApp.fetch(url, {
    "muteHttpExceptions": true,
    "headers": {
      "X-Schema-Version": "latest",
      "Authorization": "Bearer " + apiKey
    }
  });
  const responseData = response.getContentText();
  // 缓存5分钟(300秒),可根据数据更新频率调整
  cache.put(cacheKey, responseData, 300);
  
  return response;
}

3. 使用服务账号统一请求出口IP

创建Google Cloud服务账号,让所有用户的请求都通过该服务账号发送,使用固定的出口IP(或IP段),便于控制请求量:

  • 登录Google Cloud控制台,创建服务账号并下载密钥JSON文件
  • 在脚本中加载密钥,生成API所需的Bearer token(需确保目标API支持服务账号认证)
  • 修改callExternalAPI函数,使用服务账号的token发送请求,确保所有请求走服务账号的IP

4. 批量请求(若API支持)

检查目标API是否支持批量查询接口,将原本十几次的单个请求合并为一次批量请求,大幅减少请求次数。比如如果API提供/batch类接口,可传入多个endpoint参数,一次性获取所有需要的数据。


内容的提问来源于stack exchange,提问作者Step

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:45:46