Google Script报Cannot read property 'getRow' of null错误修复
错误根因
报错TypeError: Cannot read property 'getRow' of null的触发逻辑非常明确:sheet1.createTextFinder(handle).matchEntireCell(true).findNext() 这个方法在找不到完全匹配handle值的单元格时,会直接返回null。你没有对返回值做判空就直接调用.getRow(),相当于在null值上读取属性,必然抛出类型错误。
你之前只判断了handle本身不为null,但没考虑「handle有值,但sheet1里根本不存在对应匹配项」的场景,这就是漏判的边界情况。另外如果handle和sheet1里的对应值数据类型不匹配(比如一个是数字类型、一个是文本类型的同值),也会导致匹配失败返回null,如果后续出现明明有对应值却匹配不到的情况,可以先把两边值统一转成字符串再做匹配。
修复方法
- 先接收
findNext()的返回结果,判空后再执行后续逻辑,匹配不到直接跳过当前行循环即可 - 删掉冗余的重复
handle == null判断 - 优化范围拼接写法,去掉无意义的数组包装(比如
"A"+[i]可以直接写成"A"+i,效果完全一致)
修复后的可运行代码:
function iceHorsepowerInjector() { let z = 0; const activeSpread = SpreadsheetApp.getActiveSpreadsheet(); let sheet = activeSpread.getSheetByName('blah blah blah'); let sheet1 = activeSpread.getSheetByName('blah blah blah'); let sheet2 = activeSpread.getSheetByName('blah blah blah'); for (let i = 2; i <= 1312; i++) { let handle = sheet.getRange("A"+i).getValue(); if (handle == null) continue; // 先拿匹配结果,判空再取行号 const matchedCell = sheet1.createTextFinder(handle) .matchEntireCell(true) .findNext(); // 匹配不到直接跳过当前行 if (!matchedCell) continue; const index = matchedCell.getRow(); let horsepower = sheet1.getRange("EE"+index).getValue(); if (horsepower == "NULL") continue; let id = sheet.getRange("CQ"+i).getValue(); if (id == "#N/A") continue; const commands = `UPDATE fossil_fuel_vehicle_trims SET horsepower='${horsepower}' WHERE id =${handle};` sheet2.getRange(1+z, 1).setValue(commands); z++; } }
额外优化建议(可选)
你现在循环里每次都单独调用getValue()/setValue(),跑1300多行速度会非常慢,可以一次性把需要的范围数据读成二维数组再遍历,最后批量把生成的SQL语句写回sheet2,执行速度能提升几十倍。
内容的提问来源于stack exchange,提问作者brooklynveezy
相关产品推荐
相关产品推荐

