如何使用Google Apps Script将谷歌云盘文件移动到同名文件夹
问题原因
你遇到的Cannot use this operation on a shared drive item错误,是因为代码里使用的DriveApp原生方法默认仅支持操作「我的云端硬盘」内的内容,涉及共享云端硬盘(Shared Drive)里的文件/文件夹时,没有配置共享盘支持参数就会触发报错。
前置检查
- 先确认你对涉及的共享云端硬盘有「内容管理者」及以上权限,权限不足时无论怎么修改代码都无法完成移动操作
解决步骤
1. 启用Drive高级服务
在Apps Script编辑器左侧点击「服务」的+按钮,在弹出的列表中找到「Drive API」,版本选择v2,点击添加即可。
2. 使用修复后的代码
修复后的代码适配了共享盘操作逻辑,同时优化了移动文件的效率:
function sortFiles() { // 检索所有未删除的文件夹,包含共享盘内容 var folders = Drive.Files.list({ "q": "mimeType = 'application/vnd.google-apps.folder' and trashed = false", "fields": "items(title, id)", "supportsAllDrives": true, "includeItemsFromAllDrives": true }); // 检索所有未删除的非文件夹文件,包含共享盘内容 var files = Drive.Files.list({ "q": "mimeType != 'application/vnd.google-apps.folder' and trashed = false", "fields": "items(title, id, parents)", "supportsAllDrives": true, "includeItemsFromAllDrives": true }); var folderIDs = []; var folderNames = []; // 遍历所有文件夹存入数组 folders.items.forEach(folder => { folderNames.push(folder.title); folderIDs.push(folder.id); }); // 遍历所有文件匹配对应文件夹 files.items.forEach(file => { for (let j = 0; j < folderNames.length; j++) { // 这里如果需要完全匹配文件名和文件夹名,把下方的search判断改成 folderNames[j] === file.title 即可 if (folderNames[j].search(file.title) > -1) { // 直接调用Drive API移动文件,自动移除原父级 Drive.Files.update( {parents: [{id: folderIDs[j]}]}, file.id, null, {supportsAllDrives: true} ); break; // 匹配到第一个符合条件的文件夹就停止,避免重复移动 } } }); }
注意事项
- 如果仅需要处理特定共享盘的内容,可以在检索的q参数中加入
'共享盘ID' in parents,缩小检索范围,避免遍历整个云端硬盘导致运行超时 - 如果需要处理的文件/文件夹数量超过1000,需要补充分页逻辑拉取所有数据,Drive API单次请求默认最多返回1000条结果
- 批量操作时可以在循环中加入
Utilities.sleep(100),避免触发API调用配额限制
内容的提问来源于stack exchange,提问作者Julianna Dempsey
相关产品推荐
相关产品推荐

