如何获取同时匹配两个字符串的单元格索引?代码报错求助
查找同时包含姓和名的单元格索引
问题背景
需要找到数组中同时包含指定姓氏和名字的第一个单元格索引,姓名格式可能为Jobs, Steve、Jobs II, Steve等。尝试两段代码后均报错:TypeError: Cannot read properties of undefined (reading 'indexOf')。
尝试的代码及错误
第一次尝试代码:
var firstName = 'Steve'; var lastName = 'Jobs'; var columnOfNamesArr = ['Participants','Wozniak, Steve','Gates, Bill','Cook, Tim','Jobs, Mark','Jobs, Steve Apple','Musk, Elon']; var lastNameIndex = columnOfNamesArr.findIndex(s => s.indexOf(lastName) >= 0); var nameIndex = columnOfNamesArr[lastNameIndex].findIndex(s => s.indexOf(firstName) >= 0);
第二次尝试代码:
var nameIndex = columnOfNamesArr.findIndex(s => s.includes(lastName) && s.includes(firstName));
数组生成方式:
columnArr = namesSht.getRange('A1:A'+ LastRow).getValues(); var columnOfNamesArr = columnArr.map(r => r[0]);
错误原因
- 第一段代码核心错误:
columnOfNamesArr[lastNameIndex]是字符串类型,字符串没有findIndex方法,直接调用会触发类型错误;且分步查找的逻辑本身不合理,应该在单个元素内同时判断两个匹配条件。 - 两段代码共同问题:从表格取数据时,若A列存在空单元格,
map(r => r[0])会生成undefined元素。当findIndex遍历到undefined时,调用indexOf或includes这类字符串方法,就会抛出Cannot read properties of undefined错误。
解决方案
1. 处理空值+一次完成匹配
先判断元素是否为有效字符串,再同时检查姓和名是否存在:
var firstName = 'Steve'; var lastName = 'Jobs'; var nameIndex = columnOfNamesArr.findIndex(s => typeof s === 'string' && s.includes(lastName) && s.includes(firstName) );
typeof s === 'string':提前排除数组中的undefined或非字符串类型,避免调用字符串方法时报错。s.includes(lastName) && s.includes(firstName):单次遍历完成双条件判断,直接返回第一个匹配项的索引。
2. 优化数组生成(可选)
如果表格存在大量空单元格,可在生成数组时直接过滤无效值:
columnArr = namesSht.getRange('A1:A'+ LastRow).getValues(); var columnOfNamesArr = columnArr.map(r => r[0]).filter(s => typeof s === 'string' && s.trim() !== '');
后续查找时无需重复判断空值,简化逻辑。
3. 精准匹配姓名格式(可选)
如果需要严格匹配「姓氏+后缀(可选)+逗号+名字」的格式,可使用正则表达式:
var nameRegex = new RegExp(`^${lastName}(?:\\s+[IVX]+)?,\\s+${firstName}`); var nameIndex = columnOfNamesArr.findIndex(s => typeof s === 'string' && nameRegex.test(s) );
该正则可匹配Jobs, Steve、Jobs II, Steve这类格式,避免误匹配Jobs, Steve Apple这类额外带后缀的内容。
内容的提问来源于stack exchange,提问作者DanCue
相关产品推荐
相关产品推荐

