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
相关产品推荐
相关产品推荐

