如何在Google Apps Script中通过setTrashed()替换共享云端硬盘同名文件
解决方案
问题根因
你之前调用Drive.Files.remove()报错是因为Drive高级API的v2版本默认不支持操作共享云端硬盘内的文件,需要额外传递supportsAllDrives: true参数才能正常识别共享盘文件ID。改用DriveApp内置的setTrashed()方法不需要额外配置,只要你对目标文件有编辑权限就能操作共享盘资源,逻辑更简单。
完整修改后代码
function ConvertFiles() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); var r= 2; for(r= 2;r < sheet.getLastRow(); r++){ // 从表格读取源文件ID和目标文件夹ID var fileId = sheet.getRange(r,1).getValue(); var folderID = sheet.getRange(r,8).getValue(); var files = DriveApp.getFileById(fileId); var name = files.getName().split('.')[0]; var blob = files.getBlob(); // 构造新转换文件的元数据 var newFile = { title: name.replace('_converted','') + '_converted', parents: [{id: folderID}] }; var destinationFolder = DriveApp.getFolderById(folderID); var existingFiles = destinationFolder.getFilesByName(newFile.title); // 删除旧的同名转换文件 while(existingFiles.hasNext()) { var oldFile = existingFiles.next(); // 用setTrashed把旧文件移入回收站,替代原来的Drive.Files.remove oldFile.setTrashed(true); } // 插入新的转换文件,保留supportsAllDrives参数适配共享盘 var newFileID = Drive.Files.insert(newFile, blob, { convert: true,supportsAllDrives: true }).id; var Url = "https://drive.google.com/open?id=" + newFileID; // 回写结果到表格 sheet.getRange(r,9).setValue(newFileID); sheet.getRange(r,10).setValue(Url); } }
核心修改说明
- 你原来注释掉的
setTrashed()调用有语法错误,多写了一次.getId(),现在直接对遍历拿到的oldFile对象调用setTrashed(true)即可,不需要额外查ID再获取文件对象,逻辑更简洁 - 不需要额外调整其他逻辑,原来的文件名匹配、新文件生成逻辑都可以保留
注意事项
- 请确保你对目标共享云端硬盘文件夹拥有至少「编辑」权限,否则无法操作文件移入回收站,会出现权限报错
- 如果不需要保留旧文件的回收站备份,确认权限足够的情况下也可以给
Drive.Files.remove加上supportsAllDrives参数,写法为Drive.Files.remove(oldFile.getId(), {supportsAllDrives: true}),可以直接永久删除旧文件
内容的提问来源于stack exchange,提问作者Vishnu Kumaran
相关产品推荐
相关产品推荐

