Google Apps Script循环报错:H列为空时range行数不足的解决方案咨询
问题根因
- 原有代码错误添加了
if(ct > 0)的判断条件:当H列全空时ct值为0,该判断会直接跳过所有数据抓取逻辑,导致最终待写入的valueArr是空数组,调用setValues时传入的行数为0,触发「range行数至少需要为1」的报错。 - 没有对最终待写入数组做非空校验,即使没有数据也会执行写入操作,触发异常。
优化后代码
function soccerway() { var sh = SpreadsheetApp.getActiveSpreadsheet(); var ss = sh.getSheetByName("Soccerway"); if (ss.getRange("A2").getValues()[0][0] == "ATIVO") { var range = ss.getRange('F2:F31'); var loop = range.getValues().flat().filter(e => e); // F列无有效链接时直接退出,避免无效运算 if (loop.length === 0) return; // 计算H列第一个空白行位置,原有逻辑保留,保证不覆盖已有数据 var column = ss.getRange('H2:H'); var values = column.getValues(); var ct = 0; while (values[ct] && values[ct][0] != "") { ct++; } var valueArr = []; // 移除原错误的ct>0判断,无论H列是否有数据都执行抓取 for (var key of loop) { var contentText = UrlFetchApp.fetch(key).getContentText(); var $ = Cheerio.load(contentText); var ElementSelect = $('#page_match_1_block_match_info_5 > div > div > div.container.left > a.team-title'); var ElementSelect2 = $('#page_match_1_block_match_info_5 > div > div > div.container.right > a.team-title'); var data1 = ElementSelect.text().trim() + '&&&&&' + ElementSelect.attr('href'); var data2 = ElementSelect2.text().trim() + '&&&&&' + ElementSelect2.attr('href'); valueArr.push([key, data1, data2]); } // 仅当有待写入数据时执行写入操作,从根源避免空range报错 if (valueArr.length > 0) { ss.getRange(ct + 2, 8, valueArr.length, 3).setValues(valueArr); } } }
方案说明
- 完全保留原有追加写入的逻辑,新数据始终从H列第一个空白行开始写入,不会覆盖已有非空单元格
- 不需要冗余的try/catch结构,仅通过两处判空逻辑就解决了空数组写入的报错问题
- 额外新增了F列有效链接的判空逻辑,减少无意义的后续运算,提升脚本执行效率
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

