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

Google Sheet获取重定向URL规避调用超限报错 代码修复求助

代码问题排查

  • 语法结构错误:你的代码中try块没有配套的catch/finally逻辑,末尾多余了一个闭合大括号,运行时直接会报语法错误。
  • 缓存逻辑完全未生效:你虽然初始化了CacheService实例,也读取了缓存值,但没有做命中判断,后续直接发起了网络请求,完全达不到减少调用量规避超限报错的效果。
  • 没有写入缓存的逻辑:就算请求完成拿到了重定向结果,也没有存入缓存,下次调用同一个URL还是会重复请求。
  • 变量命名冲突:先声明了let res = cache.get(url),后续循环里又用var res接收网络请求结果,变量直接被覆盖,缓存值完全丢失。
  • 缺少异常处理逻辑:网络请求失败、重定向地址无效等场景没有兜底,容易触发表格函数报错。

修复后的完整代码

function getRedirects(url) {
  const params = {
    'followRedirects': false,
    'muteHttpExceptions': true
  };
  const followedUrls = [url];
  const cache = CacheService.getScriptCache();
  // 缓存过期时间,单位秒,这里设为6小时,可根据需求调整
  const CACHE_EXPIRE = 21600;

  // 优先查缓存,命中直接返回
  const cachedResult = cache.get(url);
  if (cachedResult) {
    return JSON.parse(cachedResult);
  }

  try {  
    let currentUrl = url;
    while (true) {
      const res = UrlFetchApp.fetch(currentUrl, params);
      const status = res.getResponseCode();
      // 非重定向状态码,结束循环
      if (status < 300 || status > 399) {
        break;
      }
      const nextUrl = res.getHeaders()['Location'];
      // 取不到下一跳地址就结束
      if (!nextUrl) break;
      followedUrls.push(nextUrl);
      currentUrl = nextUrl;
      // 防止无限重定向,最多追10层,可调整
      if (followedUrls.length > 10) break;
    }
    // 结果写入缓存
    cache.put(url, JSON.stringify(followedUrls), CACHE_EXPIRE);
    return followedUrls;
  } catch (e) {
    // 异常兜底,返回原始地址数组
    return [url];
  }
}

额外优化说明

  • 增加了最大重定向层数限制,避免遇到循环重定向时函数卡死。
  • 缓存结果默认保存6小时,你可以根据URL重定向的变动频率调整CACHE_EXPIRE的数值。
  • 如果需要更久的存储,可以在写入缓存的同时,把结果存入PropertiesService,缓存过期时优先查持久化存储,进一步减少网络请求次数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:51:03