在Google Apps Script中压缩大文件夹遇报错求助
Google Apps Script压缩大文件夹报错原因及解决办法
报错原因
你遇到的问题主要受两个核心限制影响:
- 内存不足:
Utilities.zip会把所有待压缩文件的Blob一次性加载到内存中,当大文件夹的文件总大小或数量超过Google Apps Script的内存上限(通常在几十MB级别)时,会触发内存溢出,表现为这个"Unexpected error"。 - 执行超时:遍历大文件夹并读取所有文件Blob的操作耗时超过GAS的6分钟单脚本执行上限,脚本被强制终止后抛出错误。
另外,Utilities.zip本身并非为处理超大文件夹设计,它存在隐性的文件数量和总大小限制,小文件夹能正常运行是因为未触碰到这些阈值。
解决办法
1. 分批压缩文件
将大文件夹的文件拆成小批次处理,每批生成一个独立压缩包,避免一次性加载过多文件到内存:
function zipLargeFolder() { const folderId = "<FOLDER_ID>"; const folder = DriveApp.getFolderById(folderId); const filesIterator = folder.getFiles(); const batchSize = 20; // 可根据单文件大小调整每批数量 let batchCount = 0; let currentBatch = []; while (filesIterator.hasNext()) { currentBatch.push(filesIterator.next()); if (currentBatch.length >= batchSize) { batchCount++; const zipBlob = Utilities.zip(currentBatch, `batch_${batchCount}.zip`); folder.createFile(zipBlob); currentBatch = []; } } // 处理剩余未凑满批次的文件 if (currentBatch.length > 0) { batchCount++; const zipBlob = Utilities.zip(currentBatch, `batch_${batchCount}.zip`); folder.createFile(zipBlob); } }
2. 按子文件夹单独压缩
如果大文件夹由多个子文件夹构成,递归遍历每个子文件夹并单独压缩,减少单次处理的文件量:
function zipSubFolders(parentFolderId) { const parentFolder = DriveApp.getFolderById(parentFolderId); const subFolders = parentFolder.getFolders(); while (subFolders.hasNext()) { const subFolder = subFolders.next(); const files = subFolder.getFiles(); const fileList = []; while (files.hasNext()) { fileList.push(files.next()); } if (fileList.length > 0) { const zipBlob = Utilities.zip(fileList, `${subFolder.getName()}.zip`); parentFolder.createFile(zipBlob); } // 递归处理子文件夹的子目录 zipSubFolders(subFolder.getId()); } } // 调用方式 zipSubFolders("<FOLDER_ID>");
3. 处理超时长任务
如果分批压缩仍超时,可借助时间驱动触发器分多次执行:
- 用
PropertiesService记录已处理的文件ID,每次脚本运行时跳过已处理文件。 - 设置触发器每隔一段时间执行一次,直到所有文件处理完成。
内容的提问来源于stack exchange,提问作者Wekend
相关产品推荐
相关产品推荐

