Google Drive文件夹文件详情导出异常:日志全但Sheet输出不全
问题原因及修复方案
核心问题
你的代码在递归调用getFileNames时,每次都会重新初始化var i = 1,导致子文件夹的文件数据会覆盖之前主文件夹或其他子文件夹写入的行,这就是Sheet内容不完整的直接原因。另外,循环中逐行调用setValues效率较低,还可能触发Google服务的调用限制。
修复后的代码
function exportDriveFiles() { // 初始化数据数组,先加入表头 var data = [["最后修改日期", "所有者名称", "文件名", "文件URL"]]; // 替换为你的目标文件夹ID var targetFolder = DriveApp.getFolderById('FOLDER_ID'); // 递归遍历文件夹,收集所有文件数据 collectFileDetails(targetFolder, data); // 将所有数据一次性写入Sheet var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("Sheet2"); // 清空现有内容(可选操作) sheet.clearContents(); // 批量写入数据 sheet.getRange(1, 1, data.length, 4).setValues(data); } function collectFileDetails(folder, dataArray) { // 处理当前文件夹下的所有文件 var files = folder.getFiles(); while (files.hasNext()) { var file = files.next(); // 收集文件信息,添加容错处理避免无所有者时报错 dataArray.push([ file.getLastUpdated(), file.getOwner() ? file.getOwner().getName() : "无所有者", file.getName(), file.getUrl() ]); } // 递归处理子文件夹 var subFolders = folder.getFolders(); while (subFolders.hasNext()) { var subFolder = subFolders.next(); collectFileDetails(subFolder, dataArray); } } // 执行导出操作 exportDriveFiles();
修复要点
- 使用全局数据数组收集所有文件信息,避免递归时覆盖行数据
- 一次性写入所有数据到Sheet,大幅提升效率并减少服务调用次数
- 添加无所有者文件的容错处理,防止脚本中途报错终止
- 分离数据收集与写入逻辑,代码结构更清晰易维护
使用说明
- 将代码中的
FOLDER_ID替换为你的目标文件夹ID - 确保Sheet2存在,或修改为你需要使用的Sheet名称
- 运行
exportDriveFiles函数即可完成导出
内容的提问来源于stack exchange,提问作者Gitz
相关产品推荐
相关产品推荐

