使用Google Drive v3 API及Apps Script迁移文件夹至共享云端硬盘失败
问题:Google Apps Script迁移My Drive文件夹至共享云端硬盘失败
报错信息
GoogleJsonResponseException: API call to drive.files.update failed with error: Moving folders into shared drives is not supported.
所用代码
util.gdrive.getParentId = function(fileId) { var options = { supportsAllDrives: true, supportsTeamDrives: true, 'fields': 'id, parents' }; var result = Drive.Files.get(fileId, options); var parentId = result.parents[0]; return parentId; } util.gdrive.moveFolder3 = function (sourceFolderId, destinationFolderId) { var sourceFolderParentId = util.gdrive.getParentId(sourceFolderId); var resourceUpdate = { 'fields': 'id, parents', supportsAllDrives: true, }; var mediaData = null; var options = { supportsAllDrives: true, 'addParents': destinationFolderId, 'removeParents': sourceFolderParentId }; var updatedFile = Drive.Files.update(resourceUpdate, sourceFolderId, mediaData, options); return updatedFile; }
核心疑问
是否存在可行的代码实现方式?是使用了错误的方法,还是该操作确实不被支持?手动通过Web界面可完成迁移,但批量迁移需要代码,已排除权限问题(使用Google Workspace管理员账号)。
解决方案
原因说明
Drive API的Files.update接口确实不支持直接将My Drive中的文件夹移动到共享云端硬盘,两者的存储架构存在差异。Web界面的“移动”操作本质是后台执行了「复制文件夹到共享盘 + 删除原文件夹」的逻辑,并非真正意义上的移动。
可行代码实现
通过复制文件夹至共享盘,再删除原文件夹的方式模拟迁移,以下是递归实现的代码:
// 递归复制文件夹及所有内容到目标位置(支持共享云端硬盘) function copyFolderToSharedDrive(sourceFolderId, destFolderId) { const sourceFolder = DriveApp.getFolderById(sourceFolderId); const destFolder = DriveApp.getFolderById(destFolderId); // 在目标位置创建同名文件夹副本 const copiedFolder = destFolder.createFolder(sourceFolder.getName()); // 复制当前文件夹下的所有文件 const files = sourceFolder.getFiles(); while (files.hasNext()) { const file = files.next(); file.makeCopy(file.getName(), copiedFolder); } // 递归复制所有子文件夹 const subFolders = sourceFolder.getFolders(); while (subFolders.hasNext()) { const subFolder = subFolders.next(); copyFolderToSharedDrive(subFolder.getId(), copiedFolder.getId()); } return copiedFolder.getId(); } // 完整迁移流程:复制到共享盘后删除原文件夹(可根据需求选择是否删除) function migrateFolderToSharedDrive(sourceFolderId, destFolderId) { // 执行复制操作 const copiedFolderId = copyFolderToSharedDrive(sourceFolderId, destFolderId); // 确认复制完成后,将原文件夹移至回收站(如需彻底删除可调用setTrashed(true)后再清空回收站) const sourceFolder = DriveApp.getFolderById(sourceFolderId); sourceFolder.setTrashed(true); return copiedFolderId; }
注意事项
- 权限处理:复制到共享盘后,文件/文件夹的权限会继承共享盘的设置,若需保留原权限,可额外调用Drive API的
Permissions相关接口进行配置。 - 大文件夹处理:若迁移的文件夹包含大量文件,建议分批执行或使用时间驱动触发器,避免脚本超时。
- 数据安全:删除原文件夹前务必确认复制操作已完成,可通过对比原文件夹和副本的文件数量验证。
内容的提问来源于stack exchange,提问作者Karl Cassar
相关产品推荐
相关产品推荐

