Tengo una variable de matriz que obtiene los valores de una hoja de cálculo.
Quiero verificar si algunas de las celdas están vacías, así que miro la longitud de cada elemento de la matriz.
Pero para mi sorpresa, si el elemento es una fecha, la longitud devuelve "nulo". ¿No debería devolver la longitud completa de la fecha? (por ejemplo, el miércoles 01 de diciembre 03:00:00 GMT-05:00 2021 debería devolver 34)
¿Alguien puede explicarme este comportamiento?
Aquí está el código que uso:
En mi tabla, la celda I1 es una fecha y la celda J1 está vacía
var sheet = SpreadsheetApp.getActive().getSheetByName('Example'); var tab = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues(); Logger.log(tab[0][8]); Logger.log(tab[0][8].length); Logger.log(tab[0][9]); Logger.log(tab[0][9].length);Este regreso:
1:28:09 PM Notice Execution started 1:28:15 PM Info Wed Dec 01 03:00:00 GMT-05:00 2021 1:28:17 PM Info null 1:28:18 PM Info 1:28:19 PM Info 0.0Solo los ingenieros de productos de Google Apps Script pueden responder por qué, pero según https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date , la longitud no es una propiedad del objeto Date.
Al usar Logger.log o console.log para imprimir cualquier objeto en el registro de ejecuciones del IDE, intentarán convertir ese objeto en una cadena de acuerdo con las reglas establecidas para hacerlo, pero la documentación de Google Apps Script no brinda detalles de lo que sucederá. se mostrará cuando no se pase una cadena. Como puede ver en la parte inferior, cada método tiene resultados diferentes, Logger.log muestra el mismo resultado que el uso de Date.prototype.toString() mientras que console.log imprime la fecha y la hora, incluido el nombre de la zona horaria de IATA.
JSON.stringify y Utilities.formatDate son métodos para formatear el objeto Date como cadenas, ambos funcionan con el tiempo de ejecución antiguo y el nuevo. Al usar el tiempo de ejecución predeterminado (V8), también puede tener otras propiedades de fecha como Date.prototype.toDateString entre otras.
Tenga en cuenta que Date.prototype.toLocaleString devolverá un resultado basado en el servidor, en la computadora del usuario.
Cuando use Hojas de cálculo de Google, tenga en cuenta que tiene una forma diferente de manejar los valores de fechas que JavaScript. Cuando se usa getValue / getValues, Google Apps Script convierte las fechas de la hoja de cálculo en objetos de fecha de JavaScript según la zona horaria de la hoja de cálculo. Por otro lado, getDisplayValue / getDisplyVAlues devuelve los valores mostrados de celda como una cadena. Puede usar las opciones de formato de número para formatear la fecha con ciertas limitaciones, como no poder mostrar la zona horaria ya que las fechas de la hoja de cálculo no la incluyen directamente.
function myFunction() { const date = new Date(); Logger.log(date); Logger.log(date.length); console.log(date); console.log(date.length); } 10:39:27 AM Notice Execution started 10:39:27 AM Info Thu Mar 03 11:39:27 GMT-05:00 2022 10:39:27 AM Info null 10:39:27 AM Info Thu Mar 03 2022 11:39:27 GMT-0500 (Eastern Standard Time) 10:39:27 AM Info undefined 10:39:27 AM Notice Execution completedReferencias
Según los comentarios, podemos editar el código y usar ambas alternativas para convertir la cadena y evitar el valor nulo.
var sheet = SpreadsheetApp.getActive().getSheetByName("Sheet1"); //var tab = sheet.getRange(1, 1, sheet.getLastRow()-1, sheet.getLastColumn()-1).getValues(); var tab = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getDisplayValues(); var date = new Date(tab[0][8]); var date2 = date.toString(); Logger.log(tab[0][8]); Logger.log(tab[0][8].length); Logger.log(tab[0][9]); Logger.log(tab[0][9].length); Logger.log(date2.length)