You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:14:52