尝试使用 findIndex 时解决类型错误

问题描述 投票:0回答:1

我试图找出为什么会出现以下错误:

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 秒)

对可能发生的事情有什么想法吗?如果我能保持速度,我愿意接受其他选择。

javascript google-apps-script google-sheets-api
1个回答
0
投票

来自

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
不会为最后一个具有非空白值的单元格之后的空白单元格返回值。

© www.soinside.com 2019 - 2024. All rights reserved.