You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

错误原因与修复方案

核心错误点

  1. 迭代器方法调用缺失括号:hasNext是FolderIterator和FileIterator的方法,必须用hasNext()调用,原代码中while (mfolders.hasNext)和while(pfiles.hasNext)没加括号,会把函数引用视为true,导致迭代器耗尽后仍尝试调用next(),触发错误。
  2. 方法调用语法错误:getName是对象方法,必须加()调用,原代码中personfolder.getName、pfile.getName都缺少括号,会把函数本身存入数组而非名称字符串。
  3. 无效的文件夹重复获取:var personfolder = DriveApp.getFolderById(mfolder.getId())完全多余,mfolder已经是文件夹对象,直接使用即可。
  4. 数组语法错误:data.push([personfolder.getName,,,])中逗号间缺少元素占位,应明确填入空字符串保持数组长度一致。
  5. 二维数组未解析: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:20:28