Hola a todos,
Recuerdo que a finales de 2019 me inicié de forma muy intensa a trabajar con Typescript, de hecho a día de hoy tengo la firme convicción de que será uno de los sustitutos de VBA (es cuestión de tiempo).
Actualmente, con las posibilidades que trae de uso con Power Automate, la verdad es que no cabe duda de su potencial. Y por eso, no dejaré de recomendar que os acerquéis y adquiráis familiaridad con este lenguaje.
Y algo que tendremos que controlar cuando ejecutemos nuestros scripts (en la plataforma que sea) es que podamos controlar errores. Porque los errores los puede provocar el código mal escrito, una lógica funcional deficiente o la calidad de los datos.
Por ello, cuando trabajamos con typescript tendremos que usar declaraciones como Try, Catch y Finally. Y en mis palabras que aquí repito de otro post anterior:
Básicamente lo que hace la declaración en una primera parte es tratar (Try) de realizar una tarea, y en caso de producirse una excepción (error) se lanza una respuesta con la sentencia Catch.
Finally recoge la parte final del proceso, y son las sentencias que van después de Try y Catch.
Dicho esto, os dejaré un script que al ejecutarlo veréis como se utilizan todas estas declaraciones:
function main(libro: ExcelScript.Workbook) {
let hoja = libro.getActiveWorksheet();
// Ejecutamos función para limpiar datos anteriores
limpiarCeldas(hoja);
// Creamos la tabla de ejemplo si no existe
let tabla = hoja.getTables()[0] || crearTablaEjemplo(hoja);
// Inicializamos variables para capturar posibles errores y la suma total
let errorGeneral = "";
let suma = 0;
let valoresValidos: number[] = [];
try {
// Intentamos acceder a una columna que no existe para forzar un error general
let columnaInexistente = tabla.getColumnByName("Col1"); // Salta error
let rangoValores = columnaInexistente.getRangeBetweenHeaderAndTotal();
} catch (error) {
// Si ocurre un error general, guardamos el mensaje en la variable errorGeneral
errorGeneral = `Error general: ${error.message}`;
}
try {
// Intentamos acceder a la columna "Valores" para procesar sus datos
let rangoValores = tabla.getColumnByName("Valores").getRangeBetweenHeaderAndTotal();
let valores = rangoValores.getValues();
// Recorremos cada valor de la columna para validarlos y sumarlos
valores.forEach((valor, indice) => {
try {
let valorNumero = Number(valor);
if (isNaN(valorNumero)) {
hoja.getRange(`B${indice + 2}`).setValue(`Error en fila ${indice + 2}: "${valor}" no es un número.`);
} else {
valoresValidos.push(valorNumero);
}
} catch (error) {
hoja.getRange(`B${indice + 2}`).setValue(`Error en fila ${indice + 2}: ${error.message}`);
}
});
// Calculamos la suma de los valores válidos
suma = valoresValidos.reduce((acumulador, numero) => acumulador + numero, 0);
} catch (error) {
// Si ocurre algún error al procesar la columna "Valores", se guarda en la variable errorGeneral
errorGeneral += ` Error al procesar la columna "Valores": ${error.message}`;
} finally {
// Mostrar la suma total, independientemente de si hubo un error o no
hoja.getRange("D1").setValue(`Suma total de valores válidos: ${suma}`);
// Mostrar el mensaje de error general, si existe
if (errorGeneral) {
hoja.getRange("D3").setValue(errorGeneral);
}
// Mostrar el mensaje de proceso finalizado
hoja.getRange("D2").setValue("Proceso de suma finalizado.");
}
}
// Función para limpiar las celdas antes de ejecutar el script
function limpiarCeldas(hoja: ExcelScript.Worksheet) {
// Limpiamos los mensajes de error en la columna "Mensaje" (columna B)
let rangoMensajes = hoja.getRange("B2:B100");
rangoMensajes.clear();
// Limpiamos las celdas de resultados y errores generales
hoja.getRange("D1").clear();
hoja.getRange("D2").clear();
hoja.getRange("D3").clear();
}
// Función para crear una tabla de ejemplo con nombre específico
function crearTablaEjemplo(hoja: ExcelScript.Worksheet): ExcelScript.Table {
// Definimos los encabezados de la tabla
const encabezados = [["Valores", "Mensaje"]];
// Definimos los datos de ejemplo con algunos errores intencionales
const datos = [[1500], ["ABC"], [1800], [-500], ["xyz"], [3000]];
// Insertamos los encabezados en la hoja
hoja.getRange("A1:B1").setValues(encabezados);
// Insertamos los datos en la hoja
hoja.getRange("A2:A7").setValues(datos);
// Creamos la tabla a partir del rango y le asignamos el nombre "MiTabla"
let tabla = hoja.addTable("A1:B7", true);
tabla.setName("MiTabla"); // Asignamos el nombre "MiTabla" a la tabla
return tabla;
}
Lo que hace el código es generar una tabla, y si está utiliza los datos generados, para mostrar una serie de informaciones. Hay errores que he colocado a propósito para que falle y capture el error. Aparecen las tres declaraciones.
Además he incluido dos funciones, una para crear una tabla si no encuentra datos (con los valores y contenido) y otra para limpiar el resultado de ejecuciones anteriores.
He comentado casi todas las líneas y por ello creo que no es necesario más explicación. Los errores que se recogen son: datos no numéricos en una suma e intentar leer de una columna que no existe.
Este es el resultado:
Y esto es el resultado, hemos conseguido finalizar el script sin que se detuviese por culpa de un error, lo hemos capturado y mostrado y generado el resultado.
Y esto es todo, espero que sea de utilidad.