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

修复Google Apps Script获取文件名称和URL时的空列表及报错问题

问题分析与修复方案

核心问题

  • FileIterator 遍历一次后耗尽:DriveApp.getFiles()返回的是FileIterator对象,它是一次性的——第一个while (files.hasNext())循环已经把所有文件遍历完毕,第二个循环再调用files.hasNext()会直接返回false,导致names数组始终为空,调用setValues()时因为空数组对应的行数为0,触发Exception: The number of rows in the range must be at least 1.异常。
  • 冗余的变量重复声明:第二个代码块里重复声明var names=[],f,str;,其中f和str与之前的变量重名,属于冗余写法,易造成代码混淆。

修复方案

最合理的做法是只遍历文件夹一次,同时收集文件的链接和名称数据,既解决迭代器耗尽问题,也提升代码效率,同时规范变量声明。

修正后的代码

function collectFiles() {
  var COLsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("COLLECTEUR");
  var fldr = DriveApp.getFolderById("186TzknoKVEfMZOz-WpB-H1XX5HnpzAyx");
  var files = fldr.getFiles();
  var link = [], names = [], f, strLink, strName;

  // 单次遍历,同时收集链接与文件名
  while (files.hasNext()) {
    f = files.next();
    strLink = '=hyperlink("' + f.getUrl() + '")';
    strName = '("' + f.getName() + '")';
    
    link.push([strLink]);
    names.push([strName]);
  }

  // 空数组判断,避免写入空数据触发异常
  if (link.length > 0) {
    COLsheet.getRange(8, 20, link.length, 1).setValues(link);
  }
  if (names.length > 0) {
    COLsheet.getRange(8, 21, names.length, 1).setValues(names);
  }

  Logger.log(link);
  Logger.log(names);
}

关键优化点

  1. 单次遍历文件夹:在同一个while循环中同时填充link和names数组,彻底避免迭代器耗尽的问题。
  2. 规范变量声明:统一在函数开头声明所有变量,避免重复声明造成的混淆。
  3. 空数组安全判断:写入表格前先检查数组长度,防止文件夹为空时触发异常。
  4. 清晰的变量命名:将通用的str拆分为strLink和strName,提升代码可读性。

备选方案(不推荐)

若必须分两次遍历文件夹,需每次遍历前重新获取FileIterator:

// 第一次遍历收集链接
var files = fldr.getFiles();
while (files.hasNext()) {
  // 收集link的逻辑
}

// 第二次遍历前重新获取迭代器
files = fldr.getFiles();
while (files.hasNext()) {
  // 收集names的逻辑
}

此方法需两次请求Drive API,效率更低,仅作为特殊场景下的备选。

内容的提问来源于stack exchange,提问作者antho2B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:35:09