我试图弄清楚为什么会出现以下错误:
TypeError: Cannot read properties of undefined (reading 'includes')
错误发生在var nameIndex = dataFlatArr.findIndex(s => s.includes(lastName) && s.includes(firstName));
以下脚本的行中:
var firstName = 'Steve';
var lastName = 'Jobs';
var dataArr = getValues_({ spreadsheetId: fileID, sheetName: sht.getName(), start: 1, maxRow: lastRow, limit: 100000 });
var columnsArr = [1,2,3,4];
for(var i in columnsArr){
if(foundColTrigger == 'No'){
var dataFlatArr = dataArr.map(r => r[columnsArr[i]-1]);
//Logger.log(dataFlatArr);
var nameIndex = dataFlatArr.findIndex(s => s.includes(lastName) && s.includes(firstName));
Logger.log(nameIndex);
if(nameIndex != -1){
foundColTrigger = 'Yes';
indexColumn = columnsArr[i]-1;
var fullDisplayName = dataArr[nameIndex][columnsArr[i]-1];
Logger.log(fullDisplayName)
}
}
}
用于加载的函数dataArr
:
//getValues in batches of 100K rows
function getValues_({ spreadsheetId, sheetName, start = 1, maxRow, limit = 100000 }) {
return [...Array(Math.ceil(maxRow / limit))].flatMap((_) => {
const last = start - 1 + limit;
const range = `'${sheetName}'!A${start}:${last > maxRow ? maxRow : last}`;
const temp = Sheets.Spreadsheets.Values.get(spreadsheetId, range).values;
start += limit;
return temp;
});
}
以下是我输入的数据dataArr
:
参与者A | 参与者 B | 参与者C | 参与者 D |
---|---|---|---|
杰克逊,迈克尔 | 史蒂夫·沃兹尼亚克 | 詹姆斯、勒布朗 | 巴里·邦兹 |
布莱姬,玛丽·J | 盖茨、比尔 | 乔丹,迈克尔·J | 马克·麦克奎尔 |
凯莉、玛丽亚 | 库克,蒂姆 | 史蒂芬·库里 | 索萨,萨米 |
杰克逊,珍妮特 | 乔布斯,马克 | 杜兰特、凯文 | 法官亚伦 |
休斯顿,惠特尼 | 乔布斯,史蒂夫·苹果 | 贾巴尔、卡里姆 | 马里斯·罗杰 |
弗雷迪·默丘里 | 马斯克、伊隆 | 拉塞尔·比尔 | 露丝,宝贝 |
此脚本遍历每一列并检查 和 是否firstName
存在lastName
于其中一列的同一单元格中。如果是,我将返回第一个实例的索引,然后最终获取数据显示的全名。在本例中应该是Jobs, Steve Apple
。indexColumn
将是1
。
当我使用getValues()
抓取时dataArr
,它按预期工作,但我想继续使用Sheets.Spreadsheets.Values.get(spreadsheetId, range).values;
方法,因为它的加载速度更快。(快约 30 秒)
您对可能发生的情况有什么想法吗?如果我能保持速度,我愿意接受其他选择。
从
到
上述语句使用空值合并运算符 (
??
) ...)。当r[columnsArr[i]-1]
为时undefined
,表达式返回''
而不是undefined
。或者
到
上述语句使用了可选链接运算符(
?.
) ...)。当s
为时undefined
,表达式将返回undefined
,而不是引发错误。SpreadsheetApp.Range.getValues
对于所有空白单元格返回一个空字符串,但Sheets.Spreadsheets.Values.get(spreadsheet, range).values
不会返回最后一个非空白值的空白单元格之后的值。