Cuando miro una fecha en la hoja de cálculo, veo 1/11/2005. Cuando lo leo en los scripts de Google, cambia a 31/10/2005.
Estoy en PDT, mi hoja de cálculo está en PDT, (UTC-8).
¿Hay una manera fácil de leer la fecha de la hoja de cálculo para que muestre la misma fecha que en la hoja de cálculo?
Tal vez relacionado con Pregunta o Pregunta
esto no está funcionando:
let date2 = Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy-MM-dd");Aquí hay un ejemplo tan simple como se me ocurrió:
function myFunction() { let data = SpreadsheetApp.getActive() .getSheetByName("Sheet1") .getDataRange() .getValues(); let header = data[0] data.splice(0,1) // remove header data.forEach(row => { let date = row[0] let month = date.getMonth() + 1 // zero based month let day = date.getDate() let year = date.getFullYear() row[1] = month; row[2] = day; row[3] = year; }) data.splice(0,0,header) // put header back SpreadsheetApp.getActive() .getSheetByName("Sheet1") .getDataRange() .setValues(data); } Date MM DD YYYY 11/1/2005 0:00:00 10 31 2005 <-- 1 day behind 11/1/2007 0:00:00 10 31 2007 11/1/2009 0:00:00 10 31 2009 11/1/2011 0:00:00 10 31 2011 11/1/2015 0:00:00 10 31 2015 11/1/2017 0:00:00 10 31 2017 11/1/2019 0:00:00 10 31 2019 11/1/2021 0:00:00 10 31 2021Este tipo de problemas suelen surgir porque el proyecto de secuencia de comandos y la hoja de cálculo se encuentran en zonas horarias diferentes. Muchos proyectos de secuencias de comandos están en GMT mientras que las hojas de cálculo están en la zona horaria predeterminada del usuario.
La diferencia de zona horaria no causa necesariamente problemas, porque el objeto Date aún representa el mismo momento en el tiempo que la fecha de la hoja de cálculo, incluso cuando se encuentran en diferentes zonas horarias.
Para solucionar el problema al crear una cadena de texto de fecha y hora legible por el usuario, use Utilities.formatDate() para obtener la fecha en la zona horaria de la hoja de cálculo, así:
const formattedDate = Utilities.formatDate(date, SpreadsheetApp.getSpreadsheetTimeZone(), 'yyyy-MM-dd HH:mm');
Use Archivo > Configuración de la hoja de cálculo para configurar la zona horaria de la hoja de cálculo. No depende del sistema, pero se puede configurar por separado en cada hoja de cálculo. En las hojas de cálculo nuevas, el valor predeterminado proviene de la configuración de la cuenta del usuario que creó la hoja de cálculo.
Creo que lo que sucede es que la fecha en la hoja de cálculo no tiene hora y cuando la lees en GAS, GAS asume que la hora original en la hoja de cálculo era UTC, por lo que cuando la lees, se transforma en PDT, restando 8 horas. Entonces, lo que ves es (fecha - 8 horas) PDT. por ejemplo, a partir del 01/11/2005, verá:
viernes 31 de octubre de 2005 16:00:00 GMT-0800 (hora estándar del Pacífico)
Para solucionarlo, solo necesita agregar 8 horas hacia atrás:
let date = row[0] let date1 = new Date(date) date1 = new Date(date1.setHours( date1.getHours() + 8 )) // timezone adjustmento, una mejor idea podría ser sacar la fecha de compensación de la fecha primero y usar eso para el ajuste. Eso podría funcionar si vas fuera de PDT.
let date = row[0] let offset = date.getTimezoneOffset() // offset in minutes let date2 = new Date(date) date2 = new Date(date2.setMinutes(date2.getMinutes() + offset))como una solución de 1 línea:
date = new Date(date.setMinutes(date.getMinutes() + date.getTimezoneOffset()))