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

使用Apps Script复制文件夹到共享盘时Sheet/Doc丢失如何解决

问题根因
  • 手动下载上传时文件缺失:Google Docs、Google Sheets是Google Workspace专属的云端原生格式,不存在本地文件实体,直接通过网页端下载文件夹时,系统不会自动导出这类格式的文件,只会下载PDF、图片、压缩包等有本地实体的文件,因此手动上传后必然缺失,和操作方式无关。
  • Apps Script无法识别两类文件:内置的DriveApp服务对「我的驱动器→共享盘」跨盘符场景的兼容性存在缺陷,默认请求未携带共享盘支持参数,会直接过滤掉Google原生格式的文件条目,导致遍历文件时根本拿不到Docs、Sheets的记录,日志里自然不会有对应文件名。
解决方案

首先在Apps Script编辑器中开启高级Drive服务:

  1. 打开Apps Script编辑器,点击左侧边栏「服务」旁边的+号
  2. 在弹出的服务列表中选择「Drive API」,版本选择v3,点击添加
  3. 确认操作账号对源模板文件夹有查看权限,对共享盘目标位置有内容编辑/管理员权限

使用以下递归脚本即可完整复制包括Google Docs、Sheets在内的所有内容:

// 配置项:替换为实际ID,文件夹ID可从浏览器地址栏URL中获取
const SOURCE_FOLDER_ID = '替换为源模板文件夹的ID';
const TARGET_PARENT_ID = '替换为共享盘内目标父文件夹的ID';

function copyFullFolderToSharedDrive() {
  // 获取源文件夹元信息,开启共享盘支持
  const sourceFolder = Drive.Files.get(SOURCE_FOLDER_ID, {
    supportsAllDrives: true,
    fields: 'id,name,mimeType'
  });
  // 在目标位置创建同名根文件夹
  const newRoot = Drive.Files.create({
    name: sourceFolder.name,
    mimeType: 'application/vnd.google-apps.folder',
    parents: [TARGET_PARENT_ID]
  }, null, {supportsAllDrives: true});
  // 递归复制所有子内容
  processChildItems(SOURCE_FOLDER_ID, newRoot.id);
}

/**
 * 递归处理文件夹下的所有子项
 * @param {string} sourceId 源文件夹ID
 * @param {string} targetId 目标文件夹ID
 */
function processChildItems(sourceId, targetId) {
  // 拉取源文件夹下所有未删除的条目,必须开启全盘符支持参数
  const itemList = Drive.Files.list({
    q: `'${sourceId}' in parents and trashed = false`,
    supportsAllDrives: true,
    includeItemsFromAllDrives: true,
    fields: 'files(id,name,mimeType)'
  }).files;

  for (const item of itemList) {
    console.log(`处理条目:${item.name},类型:${item.mimeType}`);
    let copiedItem;
    if (item.mimeType === 'application/vnd.google-apps.folder') {
      // 是文件夹则先在目标位置创建,再递归处理内部内容
      copiedItem = Drive.Files.create({
        name: item.name,
        mimeType: item.mimeType,
        parents: [targetId]
      }, null, {supportsAllDrives: true});
      processChildItems(item.id, copiedItem.id);
    } else {
      // 所有非文件夹类型(含Google Docs/Sheets/Slides等原生格式)直接复制
      copiedItem = Drive.Files.copy({
        name: item.name,
        parents: [targetId]
      }, item.id, {supportsAllDrives: true});
    }
  }
}
注意事项
  • 所有Drive API请求必须携带supportsAllDrives: true参数,列举文件时额外加includeItemsFromAllDrives: true参数,否则接口会自动过滤跨盘场景下的Google原生格式文件,这也是之前脚本识别不到Docs、Sheets的核心原因。
  • 不要用内置的DriveApp服务做跨盘复制:DriveApp的遍历、复制方法默认不开启全盘符支持,跨盘时会静默跳过Google原生格式文件,不会抛出任何报错,排查难度极高。
  • 首次运行脚本会弹出OAuth授权窗口,同意授权后脚本才会正常执行。
  • 如果复制后文件权限不符合共享盘要求,可批量选中目标文件夹内的所有内容,选择「共享」→「继承共享盘权限」即可。

内容的提问来源于stack exchange,提问作者Bob Bobby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:21:32