使用Apps Script复制文件夹到共享盘时Sheet/Doc丢失如何解决
问题根因
- 手动下载上传时文件缺失:Google Docs、Google Sheets是Google Workspace专属的云端原生格式,不存在本地文件实体,直接通过网页端下载文件夹时,系统不会自动导出这类格式的文件,只会下载PDF、图片、压缩包等有本地实体的文件,因此手动上传后必然缺失,和操作方式无关。
- Apps Script无法识别两类文件:内置的
DriveApp服务对「我的驱动器→共享盘」跨盘符场景的兼容性存在缺陷,默认请求未携带共享盘支持参数,会直接过滤掉Google原生格式的文件条目,导致遍历文件时根本拿不到Docs、Sheets的记录,日志里自然不会有对应文件名。
解决方案
首先在Apps Script编辑器中开启高级Drive服务:
- 打开Apps Script编辑器,点击左侧边栏「服务」旁边的+号
- 在弹出的服务列表中选择「Drive API」,版本选择v3,点击添加
- 确认操作账号对源模板文件夹有查看权限,对共享盘目标位置有内容编辑/管理员权限
使用以下递归脚本即可完整复制包括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
相关产品推荐
相关产品推荐

