使用Google Apps Script移动Google Drive文件夹时报错求解决方案
问题原因
你的代码逻辑顺序存在问题:你先在客户根文件夹下创建了Old Client Work文件夹,再调用getFolders()拉取该客户文件夹下的所有子文件夹,此时拉取到的子文件夹列表已经包含了刚刚新建的Old Client Work文件夹。在后续循环移动子文件夹时,程序会尝试将Old Client Work文件夹移动到它自己内部,不符合Google Drive的文件系统逻辑,因此触发报错。
修复方案
调整代码执行顺序:先拉取客户文件夹下原有的所有文件、子文件夹列表,再创建目标文件夹,保证新创建的文件夹不会被纳入待移动的资源列表中。
修复后代码
function createOldClientWorkFolder() { var clientContentFolder = DriveApp.getFolderById("IDhere"); var clientFolders = clientContentFolder.getFolders(); while(clientFolders.hasNext()) { var client = clientFolders.next(); // 提前预存当前客户文件夹下原有所有文件,避免后续新建文件夹被纳入列表 var clientContentFiles = []; var filesIterator = client.getFiles(); while (filesIterator.hasNext()) { clientContentFiles.push(filesIterator.next()); } // 提前预存当前客户文件夹下原有所有子文件夹 var clientContentFolders = []; var foldersIterator = client.getFolders(); while (foldersIterator.hasNext()) { clientContentFolders.push(foldersIterator.next()); } // 预存完成后再创建目标归档文件夹 var oldWorkFolder = client.createFolder('Old Client Work'); // 批量移动预存的所有文件 clientContentFiles.forEach(fileToMove => { fileToMove.moveTo(oldWorkFolder); }); // 批量移动预存的所有原有子文件夹 clientContentFolders.forEach(folderToMove => { folderToMove.moveTo(oldWorkFolder); }); } }
额外注意事项
- 如果客户文件夹下的文件/子文件夹数量特别多,建议在循环中添加
Utilities.sleep(100)的延时操作,避免触发Google Drive的API调用频率限制 - 全量执行前建议先替换测试客户文件夹ID验证逻辑,确认移动效果符合预期后再运行全量任务
内容的提问来源于stack exchange,提问作者Aimee
相关产品推荐
相关产品推荐

