TypeError: Cannot read property '4' of undefined at Line 100

TypeError: Cannot read property '4' of undefined at Line 100

当执行函数时,它调用另一个函数(registrarOcupacion() 调用 procesarHojaOcup(hojaOrigen))然后,当处理宏时,我在第 100 行遇到错误:

第 100 行:matriz.push(aux.concat(semana,fechassemana,fechassemana,fechas[semana][6],datos[f][c] * 8,'', 'Ocupación'))

消息错误:类型错误:无法读取未定义的 属性“4”(第 100 行,文件"macroPlaneacion")关闭

之前它工作得很好,但现在我尝试将数据源范围扩大到其他更大的 sheet 并且在 concat fechassemana,fechassemana,fechas[semana][6][= 时不起作用18=]

记录器注册:

6 月 10 日。 2020 13:55:44 信息 27.0 6 月 10 日2020 13:55:45 信息为空 6 月 10 日2020 13:55:45 错误类型错误:无法读取未定义的 属性 '4' 在 procesarHojaOcup(macroPlaneacion:101:55) 在 registrarOcupacion(macroPlaneacion:29:7)

我的母语是西班牙语,这就是为什么有时您会发现用西班牙语发表评论的原因

源代码

function registrarOcupacion(){
  let archivoDestino = SpreadsheetApp.getActive();
  let hojaDestino = archivoDestino.getSheetByName('BD');
  var hojaOrigen = SpreadsheetApp.getActive();

  let archivoOrigen = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/187Mvtj_ExSQ9nil_NbwNmSTcjZ_X1i6GfXcOMMMnn7Y/edit#gid=858356230');

  //crear fechas
  fechas = archivoDestino.getSheetByName('Calendario').getDataRange().getValues()
  personas = archivoDestino.getSheetByName('Personas').getDataRange().getValues()

  let hojasArchivoOrigen = archivoOrigen.getSheets()
  for(let h of hojasArchivoOrigen){
    let nombre = h.getName()
    if(nombre.substr(0,1) != '_'){
      let hojaOrigen = h
      procesarHojaOcup(hojaOrigen)
    }
  }

  let rangoDestino = hojaDestino.getRange(2, 1, matriz.length, matriz[0].length)
  rangoDestino.setValues(matriz)
  Browser.msgBox('Fin del proceso')
}


function procesarHojaOcup(hojaOrigen) {

  let datos = hojaOrigen.getDataRange().getValues()
  for(let f = 3, l = datos.length; f < l; f++){
    if(datos[f][0] != '' && datos[f][0] != 'Totales'){
      let persona = personas.filter(p => p[0] == datos[f][0])
      let aux = [
        hojaOrigen.getName()
      ]
      aux = aux.concat(persona[0])
      aux = aux.concat(
        datos[f][1],
        datos[f][2],
        datos[f][3]
      )
      for(let c = 21; c <= 57; c++){
        if(datos[f][c] !=''){
          let semana = datos[2][c]
          matriz.push(aux.concat(semana,fechas[semana][4],fechas[semana][5],fechas[semana][6],datos[f][c] * 8,'','Ocupación'))
        }
      }
    }
  }
  SpreadsheetApp.getActive().toast('', hojaOrigen.getName())
}

Google Sheet 数据:

日历: enter image description here

人是: enter image description here

以及提取的数据: enter image description here

预期结果:

enter image description here

宏的效果和预期的一样好,但我不知道我做了什么

下定决心,在繁忙的时间里我需要这个。

您的问题源于您查询数据

  • function procesarHojaOcup(hojaOrigen) 检索传递给函数
  • 的每个 sheet 的数据范围
  • for(let f = 3, l = datos.length; f < l; f++)循环遍历从4行到最后一行的所有数据行
  • for(let c = 21; c <= 57; c++) 遍历从 22 到 58 的所有列
  • 现在小心了! if(datos[f][c] !=''){测试要么datos[f][c]的内容不为空,但不测试datos[f][c]是否存在!
  • 如果 datos[f][c] 不存在 - semana 将是未定义的,因此 fechas[semana][4] 等等不存在并会抛出错误

怎么办?

  • if(datos[f][c] !=''){ 替换为 if(datos[f][c]){ 以解决您最近的错误
  • 仔细检查您的行值和列值是否符合预期(您真的有 58 列)吗?
  • 仔细检查您是否真的想要 运行 函数 procesarHojaOcup() 在所有 sheet 上传播 sheet
  • 实施大量 Logger.log 语句以帮助进行故障排除
  • 在循环和 if 语句
  • 中记录 fcsemanafechas 特别有用