Apps Script中filter()报错:Uncaught TypeError: Cannot read properties of null (reading 'filter')
解决空列导致的filter报错问题
错误原因分析
报错Uncaught TypeError: Cannot read properties of null (reading 'filter')本质是dados变量为null或undefined时调用了filter方法。虽然你示例里硬编码了dados数组,但实际从Google Sheets读取数据时,如果指定范围无数据,getValues()会返回null;另外行内空单元格会被解析为undefined,若回调函数未处理这类值也可能引发问题。
解决方案
1. 先校验dados的有效性
在调用filter前,先确保dados是有效数组,避免在null/undefined上调用方法:
function procurar(){ // 实际场景中通常是从Sheets读取数据,示例: // var dados = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getDataRange().getValues(); dados = [[1.0, "LEROY MERLIN - PRODUTO BOLORES E SANYTOL", "COMPRAS HIGIENIZAÇÃO", 8.08, "Banco", , , , , "Expense", , "C", , "FR443", 0.0, 0.0, 0.0, 1.51, 0.0, 6.57], [2.0, "JARDIM GARVE - 3 SACOS SIRO ROYAL", "COMPRAS JARDIM", 49.51, "Banco", , , , , "Expense", , "C", , "HT525", 2.8, 0.0, 0.0, 0.0, 0.0, 46.71]]; var searchInput = "LEROY"; var searchWords = searchInput.split(/\s+/); var searchColumns = [1,2,3]; // 校验dados是否为有效数组 let resultadosProcura = []; if (Array.isArray(dados)) { resultadosProcura = searchInput === "" ? [] : dados.filter(function(r){ return searchWords.every(word => { return searchColumns.some(col => { // 兜底处理空单元格,转为空字符串后再匹配 const cellValue = r[col] ? String(r[col]).toLowerCase() : ""; return cellValue.includes(word.toLowerCase()); }); }); }); } // 后续处理resultadosProcura }
2. 处理行内空单元格值
在回调函数中对要检查的单元格值做兜底:将null/undefined转为空字符串,避免调用toLowerCase()或includes()时出错。
额外优化点
- 示例中未加引号的字符串(如
LEROY MERLIN - PRODUTO BOLORES E SANYTOL)要补加双/单引号,否则会触发语法错误。 - 若从Sheets读取数据,推荐用
getDisplayValues()替代getValues(),它直接返回字符串格式内容,空单元格返回空字符串,减少类型处理成本:var dados = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getDataRange().getDisplayValues();
内容的提问来源于stack exchange,提问作者Octávio Teixeira
相关产品推荐
相关产品推荐

