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
语句 中记录 f
、c
、semana
和 fechas
特别有用
当执行函数时,它调用另一个函数(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
语句 中记录
f
、c
、semana
和 fechas
特别有用