Google Apps Script中UrlFetchApp获取RSS时如何清除/规避缓存?
解决Google Apps Script中UrlFetchApp抓取RSS的缓存问题
问题重现
脚本从Google Sheet读取RSS地址,对比GUID检测新文章并推送到Google Chat,但UrlFetchApp频繁返回旧版RSS内容:
- 新内容发布后需等待45-60分钟才偶尔能抓取到新版本
- 日志显示
lastBuildDate在新旧值之间交替:11 Jun 2024, 15:37:05 => lastBuildDate : Mon, 10 Jun 2024 13:06:32 +0000 11 Jun 2024, 15:39:21 => lastBuildDate : Tue, 11 Jun 2024 12:46:24 +0000 11 Jun 2024, 15:49:28 => lastBuildDate : Mon, 10 Jun 2024 13:06:32 +0000
已尝试的方法无效:
- 重置
xml/document变量 - 添加多种
Cache-Control头部 - URL后加时间戳参数
针对性解决方法
1. 启用UrlFetchApp官方缓存禁用选项
Google Apps Script的UrlFetchApp.fetch支持cache: false参数,直接禁用Google服务器端的请求缓存,这是最核心的解决手段:
var fetchOptions = { "method": "GET", "contentType": "application/xml", "muteHttpExceptions": true, "followRedirects": true, "cache": false, // 禁用Google中间层缓存 headers : { 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Accept': 'application/xml, application/rss+xml, */*', 'Accept-Encoding': 'gzip, deflate, br' } }
2. 修正请求头错误并强化缓存控制
- 修复之前的
Accept-Encoging拼写错误(应为Accept-Encoding),否则该头部会失效 - 组合使用
no-cache/no-store/must-revalidate指令,同时添加Pragma和Expires字段兼容旧版服务器
3. 移除异步请求选项
async: true是UrlFetchApp的实验性特性,异步模式下缓存机制不稳定,脚本通过触发器运行无需异步,直接移除该选项或设为false:
var fetchOptions = { "async": false, // 禁用异步请求 // ...其他配置项 }
4. 优化URL缓存破防参数
使用更明确的参数名避免与RSS源自身参数冲突,直接用时间戳确保每次请求URL唯一:
var url = FEED_URL + "?cache_bust=" + new Date().getTime();
5. 验证RSS源自身缓存
如果以上方法仍无效,手动用curl测试请求(携带相同缓存禁用头):
curl -H "Cache-Control: no-cache, no-store, must-revalidate" -H "Pragma: no-cache" -H "Expires: 0" YOUR_RSS_FEED_URL
若手动请求也返回旧内容,说明是RSS源自身的CDN/服务器缓存问题,需联系源站调整缓存策略。
内容的提问来源于stack exchange,提问作者Nonouille
相关产品推荐
相关产品推荐

