我试图找出为什么会出现以下错误:
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 秒)
对可能发生的事情有什么想法吗?如果我能保持速度,我愿意接受其他选择。
来自
var nameIndex = dataFlatArr.findIndex(s => s.includes(lastName) && s.includes(firstName));
到
var nameIndex = dataFlatArr.findIndex(s => s?.includes(lastName) && s?.includes(firstName));
上面的语句使用了 可选链操作符 (
?.
)...)。当 s
未定义时,它返回 undefined
而不是抛出错误。
SpreadsheetApp.Range.getValues
为所有空白单元格返回空字符串,但 Sheets.Spreadsheets.Values.get(spreadsheet, range).values
不会为最后一个具有非空白值的单元格之后的空白单元格返回值。