Este será el primero de tres post en los que abordaré cómo podemos usar typescript, Automate y Apps de forma conjunta para construir procesos.
Doy por supuesto que ya conocéis typescript, si no es así, tenéis en esta web una gran cantidad de publicaciones al respecto, os invito a verlas.
Y ahora vamos con nuestro ejemplo de creación de script. Nuestra fuente inicial de datos nos llega en un archivo de Excel, así:
Pero nosotros necesitamos crear dos campos a partir de la primera hoja. Y los datos deben estar en formato tabla:
Para conseguirlo usaremos este script:
function main(libroTrabajo: ExcelScript.Workbook) {
// Intentamos obtener la hoja de cálculo llamada "ORIGINAL" del libro de trabajo.
const hojaOriginal = libroTrabajo.getWorksheet("ORIGINAL");
// Si no encontramos la hoja "ORIGINAL", lanzamos un error.
if (!hojaOriginal) throw new Error("Hoja 'ORIGINAL' no encontrada");
// Obtenemos todas las celdas con datos en la hoja "ORIGINAL".
const valoresOriginales = hojaOriginal.getUsedRange().getValues();
// Definimos los rangos de edad que utilizaremos para clasificar a las personas.
const rangosEdad = ["", "18 a 25", "26 a 35", "36 a 45", "46 a 55", "56 a 65"];
// Preparamos un arreglo para almacenar los valores formateados, excluyendo los encabezados.
const valoresFormateados: (string | number | boolean)[][] = [];
// Procesamos cada fila de datos originales para formatear y calcular nuevos valores.
const filasNuevas = valoresOriginales.slice(1).map(fila => {
// Obtenemos la edad de la fila actual.
const edad = fila[3];
// Calculamos el índice para el rango de edad basado en la edad.
const indiceEdad = Math.min(Math.floor((edad - 18) / 10 + 1), rangosEdad.length - 1);
// Determinamos el grupo de edad usando el índice calculado o dejamos en blanco si es menor de 18.
const grupoEdad = edad >= 18 ? rangosEdad[indiceEdad] : "";
// Verificamos si el dato de género existe y lo convertimos a mayúsculas, si no, asignamos "*ERROR*".
const generoSeguro = fila[4] ? fila[4].toString().toUpperCase() : "*ERROR*";
// Mapeamos los valores de género a términos estandarizados.
const mapaGenero: { [clave: string]: string } = { "MUJER": "FEMENINO", "HOMBRE": "MASCULINO" };
// Determinamos el género usando el mapa definido o asignamos "*ERROR*" si no coincide.
const genero = mapaGenero[generoSeguro] || "*ERROR*";
// Devolvemos la fila formateada con ID, grupo de edad y género.
return [fila[1], grupoEdad, genero];
});
// Añadimos las nuevas filas formateadas al arreglo de valores formateados.
valoresFormateados.push(...filasNuevas);
// Intentamos obtener la hoja de cálculo llamada "FORMATEADA".
const hojaFormateada = libroTrabajo.getWorksheet("FORMATEADA");
// Si no la encontramos, lanzamos un error.
if (!hojaFormateada) throw new Error("Hoja 'FORMATEADA' no encontrada");
// Eliminamos todas las filas debajo de la primera fila de la hoja "FORMATEADA".
const filasUsadas = hojaFormateada.getUsedRange().getRowCount();
if (filasUsadas > 1) {
// Utilizamos el método 'delete' para eliminar las filas, ajustando las siguientes hacia arriba.
hojaFormateada.getRange(`2:${filasUsadas}`).delete(ExcelScript.DeleteShiftDirection.up);
}
// Establecemos los nuevos valores en la hoja "FORMATEADA", comenzando desde la segunda fila.
const rangoNuevo = hojaFormateada.getRangeByIndexes(1, 0, valoresFormateados.length, valoresFormateados[0].length);
rangoNuevo.setValues(valoresFormateados);
// Ajustamos automáticamente el ancho de las columnas a los nuevos contenidos.
rangoNuevo.getFormat().autofitColumns();
// Activamos la hoja "FORMATEADA" para que sea visible al usuario.
hojaFormateada.activate();
}
No vamos a crear aquí el formato tabla, sino que en la segunda hoja (Formateada), crearemos el formato y la fila de los encabezados, el motivo es que no podemos perder el formato inicial, ya que el ID de la tabla lo usaremos en Automate y si eliminamos el formato, aunque luego creemos otra tabla, nuestro flujo fallará.
El script, borra toda la tabla, excepto los encabezados y actualiza con los que dejemos en la primera hoja.
Este es el script, que usaremos en nuestro flujo y será también el excel desde el que vamos a actualizar nuestra lista de SharePoint. Pero eso lo dejo, para la próxima publicación.
Os he comentado el script fila a fila, para que sea más sencillo saber qué hace cada línea de código. Por otra parte, comentar que este código es bastante elaborado y lo he creado para que sea lo más eficiente posible.