Google Scripts调用YouTube API上传共享驱动器非自有视频失败求助
解决思路与修改方案
问题根源
你遇到的「Processing abandoned」本质是权限与文件获取方式的问题:
- 原代码通过直接调用Drive API的
alt=media端点下载文件,但针对共享驱动器中他人拥有的文件,这个请求缺少supportsAllDrives=true参数,导致权限验证不通过,获取到的文件内容可能不完整或带有权限异常标记,传到YouTube后触发处理失败。 - 复制文件到自己名下后,文件权限归属于当前用户,原方法就能正常工作,验证了这一点。
可行修改方案
用DriveApp.getFileById().getBlob()替代原有的UrlFetchApp.fetch()方式,原因是:
- DriveApp是Google Apps Script的原生服务,会自动处理共享驱动器的权限上下文,只要你对目标文件有下载权限,就能稳定获取Blob。
- 无需手动构造API请求和处理权限参数,避免因参数遗漏导致的权限问题。
修改后的核心代码片段
// 替换原有的UrlFetchApp.fetch部分 var file = DriveApp.getFileById(match); var video = file.getBlob(); // 直接获取文件Blob
完整修改后的代码
function upload() { var driveurl = `https://drive.google.com/file/d/AAAAAAAAAAAAAAAAAAAAAAAAA/view?usp=share_link`; var match = driveurl.match(/([a-z0-9_-]{25,})[$/&?]/i).pop(); var title = "title"; var description = "test"; var topics = ["TEST"]; // 注意:tags需要是数组类型,原代码字符串会导致问题 // 直接通过DriveApp获取文件Blob var file = DriveApp.getFileById(match); var video = file.getBlob(); response = YouTube.Videos.insert({ snippet:{ title: title, description: description, tags: topics }, status:{ privacyStatus: "public", }, }, "snippet,status", video ); Logger.log(JSON.stringify(response)); Logger.log(response.id); }
额外注意事项
- 权限确认:确保你对共享文件拥有下载权限(仅查看权限无法获取Blob),如果权限不足,联系文件所有者调整。
- OAuth授权:修改代码后第一次运行,需要重新授权脚本,确保包含Drive文件访问的权限。
- tags参数修正:原代码中
topics是字符串类型,但YouTube API要求tags是数组,修改为["TEST"]避免潜在报错。
内容的提问来源于stack exchange,提问作者Andrewncf
相关产品推荐
相关产品推荐

