Hola a todos!
Llevaba mucho tiempo sin programar en Typescript y este fin de semana he decidido retomarlo de nuevo.
En el ejemplo de hoy voy a trabajar con fechas, y en concreto extraer de una fecha el año, el mes y el día. Este ejercicio lo voy a hacer de dos formas, una trabajando con variables y otra escribiendo las fórmulas en la hoja con typescript y obteniendo así el resultado.
Imaginad que tenemos las siguiente fechas en la primera columna de nuestra hoja de Excel:

Y queremos extraer en las columnas B, C, D el día, mes y año respectivamente. A su vez volveremos a repetir la misma información en las celdas E, F y G, pero utilizando otro método.
Pues bien, para hacerlo utilizaré el siguiente código que he programado en Typescript y que ejecutaré en el editor de código:
async function main(workbook: ExcelScript.Workbook) {
let MiHoja = workbook.getWorksheet("MIEJEMPLO");
//cargamos valores de filas y columna
let MiRangoRow = MiHoja.getUsedRange();
let MiRangoCol = MiHoja.getUsedRange();
//Pasamos valores a variables
let FinRow = MiRangoRow.getRowCount();
let FinCol = MiRangoCol.getColumnCount();
//Antes de proceder limpiamos contenido columnas B:D
MiHoja.getRangeByIndexes(1, 1, FinRow, FinCol).clear(ExcelScript.ClearApplyTo.all);
// Escribimos encabezados de columna
MiHoja.getCell(0, 1).setValues([
["DIA"]
]);
MiHoja.getCell(0, 2).setValues([
["MES"]
]);
MiHoja.getCell(0, 3).setValues([
["AÑO"]
]);
MiHoja.getCell(0, 4).setValues([
["DIA FÓRMULA"]
]);
MiHoja.getCell(0, 5).setValues([
["MES FÓRMULA"]
]);
MiHoja.getCell(0, 6).setValues([
["AÑO FÓRMULA"]
]);
// cargamos en variable Info el contenido columna A
let Info = MiHoja.getRangeByIndexes(0, 0, FinRow, 1).getValues();
for (let i = 1; i < FinRow; i++) {
//Pasamos valores almacenados de fecha de Excel a fecha de JavaScript
let MiInfo = Info[i];
let MiFecha = new Date(Math.round((+MiInfo - 25569) * 86400 * 1000));
// Extraemos día, mes y año
let DIA = MiFecha.getUTCDate();
let MES = MiFecha.getUTCMonth() + 1;
let AÑO = MiFecha.getFullYear();
// Pasamos resultado a la hoja
MiHoja.getCell(i, 1).setValues([
[DIA]
])
MiHoja.getCell(i, 2).setValues([
[MES]
])
MiHoja.getCell(i, 3).setValues([
[AÑO]
])
// Ejecutamos funciones (dia, mes y año)
// pasamos resultado a la hoja
MiHoja.getCell(i, 4).setFormulas([
["=DAY(A" + (i + 1)]
]);
MiHoja.getCell(i, 5).setFormulas([
["=MONTH(A" + (i + 1)]
]);
MiHoja.getCell(i, 6).setFormulas([
["=YEAR(A" + (i + 1)]
]);
}
}
He comentado todo el código para que se pueda comprender qué hace cada línea de programación.
Pero básicamente estoy utilizando dos métodos, en el primero paso el contenido de la columna A a una variable que almacena la fecha de Excel en un número y que luego pasaré a formato javascript:
let MiInfo = Info[i];
let MiFecha = new Date(Math.round((+MiInfo - 25569) * 86400 * 1000));
Ojo con el + que indico antes de MiInfo para indicar que se trata de un número y no una string.
A continuación simplemente extraemos cada elemento:
// Extraemos día, mes y año
let DIA = MiFecha.getUTCDate();
let MES = MiFecha.getUTCMonth() + 1;
let AÑO = MiFecha.getFullYear();
y luego lo pasamos a las columnas que hemos definido:
// Pasamos resultado a la hoja
MiHoja.getCell(i, 1).setValues([
[DIA]
])
MiHoja.getCell(i, 2).setValues([
[MES]
])
MiHoja.getCell(i, 3).setValues([
[AÑO]
])
Y este es el resultado:

Otra forma de hacer este ejercicio y que resulta más sencilla es mediante el método .setFormulas():
// Ejecutamos funciones (dia, mes y año)
// pasamos resultado a la hoja
MiHoja.getCell(i, 4).setFormulas([
["=DAY(A" + (i + 1)]
]);
MiHoja.getCell(i, 5).setFormulas([
["=MONTH(A" + (i + 1)]
]);
MiHoja.getCell(i, 6).setFormulas([
["=YEAR(A" + (i + 1)]
]);
Con esto simplemente pasamos la fórmula a la celda indicada y el resultado se crea automáticamente al ejecutarse la fórmula:

Creo es útil exponer las dos formas de hacerlo y que el lector, según sus necesidades utilice una u otra técnica.
Y esto es todo, espero que os haya resultado interesante.
Nota: Typescript actualmente está disponible en versiones de Excel Online pero cuyas licencias sean Enterprise E3 y E5.
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies