Google Drive API复制文档后更新标题失败 请求参数被写入正文
问题原因
你遇到的正文被覆盖、标题不更新的问题由3个代码错误直接导致:
- 接口用错:带
/upload/前缀的Drive API端点是专门用于上传/覆盖文件正文内容的,你调用的https://www.googleapis.com/upload/drive/v2/files/{id}接口只要收到带body的PUT请求,就会直接把body内容作为新的正文全量替换原文档,根本不是用来修改文件名这类元数据的接口。 - 代码语法错误:
JSON.stringify('title' : 'new file')属于非法JS语法,JSON.stringify需要传入合法的JS对象作为参数,你这段代码就算不报错,传给上传接口的内容也会被直接写入文档正文。 - 异步逻辑错误:你没有等待修改标题的fetch请求执行完成,就直接打印日志、打开新文档链接,就算接口写对,也可能出现请求还没发完就跳页,导致标题更新不生效。
问题现象参考:
修复方法
- 统一使用和复制接口同版本的Drive V3 API,修改文件元数据(含文件名)不要用带
/upload/前缀的端点,V3更新文件元数据使用PATCH https://www.googleapis.com/drive/v3/files/{fileId}接口,文件名对应的字段是name(V2版本才用title字段)。 - 补全请求头的
Content-Type: application/json声明,保证接口能正确解析你传入的JSON参数。 - 等待所有接口请求执行完成后,再执行打开文档的操作。
- 你之前定义好的
fileName变量可以直接作为新文件名使用,不需要硬编码写死'new file'。
修复后的可运行代码:
async function createFilewithtemplate(tag,document_id){ const accessToken = gapi.auth.getToken().access_token; const fileName = "Wib Issues Report - " + tag + ' ' + getDateString(); // 复制模板文件 const copyRes = await fetch(`https://www.googleapis.com/drive/v3/files/${document_id}/copy`,{ method: "POST", headers: new Headers({ 'Authorization': 'Bearer '+ accessToken }), }); const copiedFileInfo = await copyRes.json(); // 更新复制后文件的文件名 await fetch(`https://www.googleapis.com/drive/v3/files/${copiedFileInfo.id}`,{ method: "PATCH", headers: new Headers({ 'Authorization': 'Bearer '+ accessToken, 'Content-Type': 'application/json' }), body: JSON.stringify({ name: fileName }) }); console.log(copiedFileInfo); console.log(copiedFileInfo.id); // 所有操作完成后再打开文档 window.open(`https://docs.google.com/document/d/${copiedFileInfo.id}/edit`); }
补充说明:如果要坚持使用Drive V2接口修改元数据,去掉端点路径里的
/upload/前缀即可,V2元数据更新端点为https://www.googleapis.com/drive/v2/files/{fileId},请求体传{"title": 你的文件名},只要带/upload/前缀就会触发正文覆盖逻辑。
内容的提问来源于stack exchange,提问作者Itay Turniansky
相关产品推荐
相关产品推荐

