Google Apps Script报错:Cannot retrieve the next object: iterator已到末尾
问题:Google Apps Script遍历文件夹文件时触发迭代器末尾错误
运行脚本遍历文件夹中的文件并提取单元格值写入表格时,出现报错:
Exception: Cannot retrieve the next object: iterator has reached the end.
错误触发在第14行var pfile = pfiles.next();,前两个文件夹能返回部分值,第三个文件夹报错。运行日志如下:
5:24:43 PM Notice Execution started 5:24:45 PM Info [[]] 5:24:45 PM Info [[]] 5:24:46 PM Error Exception: Cannot retrieve the next object: iterator has reached the end. list_files_in_folders @ macros.gs:14
原报错代码:
function list_files_in_folders(){ var sh = SpreadsheetApp.getActiveSheet(); var mainfolder = DriveApp.getFolderById('id-here'); // I change the folder ID here var mfolders = mainfolder.getFolders(); var data = []; data.push(['Person Name','File Name','Value 1','Value 2']); while (mfolders.hasNext){ var mfolder = mfolders.next(); var personfolder = DriveApp.getFolderById(mfolder.getId()); var pfiles = personfolder.getFiles(); data.push([personfolder.getName,,,]); while(pfiles.hasNext){ var pfile = pfiles.next(); //error here var personfile = SpreadsheetApp.openById(pfile.getId()); var value1 = personfile.getSheetValues(2,9,1,1); //var value2 = personfile.getSheetValues(); Logger.log(value1); data.push(["",pfile.getName,value1,""]); } } sh.getRange(1,1,data.length,data[0].length).setValues(data); }
错误原因与修复方案
核心错误点
- 迭代器方法调用缺失括号:
hasNext是FolderIterator和FileIterator的方法,必须用hasNext()调用,原代码中while (mfolders.hasNext)和while(pfiles.hasNext)没加括号,会把函数引用视为true,导致迭代器耗尽后仍尝试调用next(),触发错误。 - 方法调用语法错误:
getName是对象方法,必须加()调用,原代码中personfolder.getName、pfile.getName都缺少括号,会把函数本身存入数组而非名称字符串。 - 无效的文件夹重复获取:
var personfolder = DriveApp.getFolderById(mfolder.getId())完全多余,mfolder已经是文件夹对象,直接使用即可。 - 数组语法错误:
data.push([personfolder.getName,,,])中逗号间缺少元素占位,应明确填入空字符串保持数组长度一致。 - 二维数组未解析:
getSheetValues()返回的是二维数组,直接存入data会导致表格写入异常,需提取具体值value1[0][0]。
修复后的代码
function list_files_in_folders(){ var sh = SpreadsheetApp.getActiveSheet(); var mainfolder = DriveApp.getFolderById('id-here'); // 替换为你的主文件夹ID var mfolders = mainfolder.getFolders(); var data = []; data.push(['Person Name','File Name','Value 1','Value 2']); // 遍历主文件夹下的子文件夹 while (mfolders.hasNext()) { var personFolder = mfolders.next(); var pfiles = personFolder.getFiles(); // 添加文件夹名称行 data.push([personFolder.getName(), "", "", ""]); // 遍历当前文件夹下的文件 while(pfiles.hasNext()) { var pfile = pfiles.next(); try { // 尝试打开表格文件,跳过非表格文件 var personFile = SpreadsheetApp.openById(pfile.getId()); // 获取指定单元格值(第2行第9列) var value1 = personFile.getSheetValues(2, 9, 1, 1)[0][0]; Logger.log(value1); // 存入数据数组 data.push(["", pfile.getName(), value1, ""]); } catch(e) { // 捕获非表格文件或权限问题,记录日志并继续 Logger.log(`无法处理文件 ${pfile.getName()}: ${e.message}`); data.push(["", pfile.getName(), "无法读取", ""]); } } } // 将数据写入表格 if(data.length > 0) { sh.getRange(1, 1, data.length, data[0].length).setValues(data); } }
额外优化
- 增加
try-catch块,处理非表格文件或权限不足的情况,避免脚本中途中断。 - 添加数据长度判断,防止空数据写入导致的错误。
- 变量命名更清晰,提升代码可读性。
内容的提问来源于stack exchange,提问作者Armond Hambarchian
相关产品推荐
相关产品推荐

