修复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); }
关键优化点
- 单次遍历文件夹:在同一个
while循环中同时填充link和names数组,彻底避免迭代器耗尽的问题。 - 规范变量声明:统一在函数开头声明所有变量,避免重复声明造成的混淆。
- 空数组安全判断:写入表格前先检查数组长度,防止文件夹为空时触发异常。
- 清晰的变量命名:将通用的
str拆分为strLink和strName,提升代码可读性。
备选方案(不推荐)
若必须分两次遍历文件夹,需每次遍历前重新获取FileIterator:
// 第一次遍历收集链接 var files = fldr.getFiles(); while (files.hasNext()) { // 收集link的逻辑 } // 第二次遍历前重新获取迭代器 files = fldr.getFiles(); while (files.hasNext()) { // 收集names的逻辑 }
此方法需两次请求Drive API,效率更低,仅作为特殊场景下的备选。
内容的提问来源于stack exchange,提问作者antho2B
相关产品推荐
相关产品推荐

