在GAS中使用Urlfetch App获取Drive图片遇400错误求助
解决UrlFetchApp调用Google Drive公开图片链接返回400错误的问题
我明白你碰到的麻烦了——用那个lh3.google.com开头的Drive图片链接,浏览器打开能正常显示,但用UrlFetchApp调用就弹出400格式错误。我帮你分析下原因,再给你可行的解决办法。
问题根源
你用的这个链接其实是Google Drive的预览/缩略图跳转链接,后面的=w320-h200-k-iv1是浏览器端的渲染参数。这类链接不是直接的资源文件地址,而是Google给前端浏览器用的入口,它会依赖浏览器环境的一些标识(比如Cookie、请求头)来做跳转验证。你加上Authorization头反而会弄巧成拙——因为公开文件根本不需要授权,带token的请求会被Google服务器判定为非法格式,直接返回400。
解决方案
给你两种靠谱的实现方式,都是针对程序化访问优化的:
方式1:直接通过文件ID获取原文件(最稳定)
既然你已经知道文件ID,直接用Drive服务获取文件Blob就行,完全绕开那个麻烦的预览链接:
function myFunction() { // 提取出你的文件ID const targetFileId = "1wJsovhXjWZM5qfyh3_VvJKODxw1DWQG_"; // 直接获取文件对象和Blob const sourceFile = DriveApp.getFileById(targetFileId); const imageBlob = sourceFile.getBlob(); // 保存到Drive DriveApp.createFile(imageBlob); }
方式2:调用官方缩略图API获取指定尺寸的图片
如果需要固定尺寸的缩略图,用Google Drive API的官方缩略图接口,这个接口对程序化访问更友好:
function myFunction() { const targetFileId = "1wJsovhXjWZM5qfyh3_VvJKODxw1DWQG_"; // 指定尺寸,格式为w{宽度}-h{高度} const thumbnailSize = "w320-h200"; // 官方缩略图接口地址 const thumbnailUrl = `https://www.googleapis.com/drive/v3/files/${targetFileId}/thumbnail?sz=${thumbnailSize}`; // 发起请求,不需要Authorization头(因为文件公开) const response = UrlFetchApp.fetch(thumbnailUrl, { muteHttpExceptions: true, followRedirects: true }); // 保存Blob到Drive DriveApp.createFile(response.getBlob()); }
注意事项
- 确保你的图片文件确实设置为**“知道链接的任何人都能查看”**的公开权限,不然即使是你的脚本也需要额外授权(不过公开状态下两种方式都不需要token)。
- 以后尽量避免用lh3.google.com这类前端预览链接做程序化调用,这类链接是给浏览器用的,内部有很多环境检测,很容易触发错误。
内容的提问来源于stack exchange,提问作者Code Guy
相关产品推荐
相关产品推荐

