使用Google Apps Script从Google Drive下载文件出现403错误如何解决
Google Apps Script Drive文件下载403错误解决方法
问题原因
你遇到的403错误是近期Google对drive.google.com/uc下载端点的安全校验策略更新导致的:内嵌在Apps Script模态对话框内的跳转请求,携带的用户认证cookie上下文和Google Drive主站不匹配,会被权限拦截;直接粘贴链接到地址栏能正常下载,是因为地址栏请求携带了完整的认证凭据,所以你之前做的账号登出、权限调整操作都无法解决该问题。
可行修复方案
方案1:使用带OAuth令牌的下载链接(最稳定)
修改原代码的下载链接生成逻辑,直接给下载地址追加当前脚本的有效访问令牌,绕开cookie校验:
// 替换原dlUrl生成行即可 var dlUrl = file.getDownloadUrl() + "&access_token=" + ScriptApp.getOAuthToken(); // 后续原有逻辑保持不变 // Open a dialog and run Javascript for downloading the file. var str = '<script>window.location.href="' + dlUrl + '"</script>'; var html = HtmlService.createHtmlOutput(str); SpreadsheetApp.getUi().showModalDialog(html, "Downloading invoice ... please wait"); // 建议把删除文件的逻辑延后,避免下载未完成就删除文件 Utilities.sleep(5000); // 可以适当延长等待时间 file.setTrashed(true); var closeHtml = HtmlService.createHtmlOutput("<script>google.script.host.close()</script>"); SpreadsheetApp.getUi().showModalDialog(closeHtml, "Downloading invoice ... please wait");
注意:如果运行时报权限错误,可在脚本任意位置添加一行注释代码// DriveApp.getFiles(),重新运行触发Drive权限授权即可。
方案2:改用a标签自动点击触发下载
如果不想修改链接生成逻辑,也可以把模态框内的跳转逻辑换成HTML5下载标签触发,降低被拦截的概率:
var dlUrl = "https://drive.google.com/uc?export=download&id=" + file.getId(); // 替换原str变量的内容 var str = '<a href="' + dlUrl + '" id="dlBtn" download style="display:none"></a><script>document.getElementById("dlBtn").click()</script>'; // 后续逻辑保持不变
内容的提问来源于stack exchange,提问作者Andrew Jeung
相关产品推荐
相关产品推荐

