11 septiembre, 2026

NORMALIZAR FECHAS CON TYPESCRIPT Y EJECUTAR SCRIPT EN AUTOMATE

Hola a todos,

Llevo tanto tiempo publicando cosas de IA, que ya casi se me ha olvidado cuando publicaba sobre office scripts y cómo integrarlo en Automate y en nuestros procesos.

Hoy he tenido que pasar a un compañero un script que fuese capaz de normalizar varios formatos de pseudo fecha, así:

Para poder realizar la normalización, utilizamos este script:

function main(libro: ExcelScript.Workbook) {
    const hoja = libro.getActiveWorksheet();

    // Detecta el rango de datos con encabezados (ID, Fecha)
    const rango = hoja.getRange("A1").getSurroundingRegion();
    const valores = rango.getValues() as (string | number | boolean | null)[][];

    if (valores.length < 2) throw new Error("No hay filas para procesar.");

    // Encuentra la columna "Fecha"
    const encabezados = valores[0].map(v => String(v ?? "").trim());
    const idxFecha = encabezados.indexOf("Fecha");
    if (idxFecha < 0) throw new Error('No se encontró la columna "Fecha".');

    // Construimos la salida
    const salida: string[][] = [["Fecha normalizada"]];

    for (let i = 1; i < valores.length; i++) {
        const original = String(valores[i][idxFecha] ?? "").trim();
        const normalizada = normalizarFechaTexto(original);
        salida.push([normalizada ?? ""]);
    }

    // Pegamos el resultado en la columna D
    const destino = hoja.getRange("D1").getResizedRange(salida.length - 1, 0);
    destino.setValues(salida);
    destino.getColumn(0).setNumberFormatLocal("@"); // formato texto
}

// convertimos a formato fecha por casos
function normalizarFechaTexto(fechaTexto: string): string | null {
    if (!fechaTexto) return null;

    const txt = fechaTexto.trim();

    let dia: number | null = null;
    let mes: number | null = null;
    let anio: number | null = null;

    //  Detecta fechas escritas en formato europeo (día primero, luego mes y año)
    let m = txt.match(/^(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})$/);
    if (m) {
        dia = +m[1];
        mes = +m[2];
        anio = +m[3];
    }

    // Acepta tanto barras ( / ) como guiones ( - ) como separadores.
    else if (/^\d{4}-\d{2}-\d{2}/.test(txt)) {
        const partes = txt.substring(0, 10).split("-");
        anio = +partes[0];
        mes = +partes[1];
        dia = +partes[2];
    }

    else {
        // Extrae los tres números (día, mes, año) y los convierte a valores numéricos puros
        const nums = txt.match(/\d+/g);
        if (nums && nums.length >= 3) {
            if (nums[0].length === 4) { // si es 4 empieza por año
                anio = +nums[0];
                mes = +nums[1];
                dia = +nums[2];
            } else {
                dia = +nums[0];
                mes = +nums[1];
                anio = +nums[2];
            }
        }
    }

    // Validación básica
    if (!dia || !mes || !anio || dia > 31 || mes > 12) return null;

    // Formato final "dd/mm/aaaa"
    const dd = String(dia).padStart(2, "0");
    const mm = String(mes).padStart(2, "0");
    const yyyy = String(anio);

    return `${dd}/${mm}/${yyyy}`;
}

Este script lo vamos a ejecutar en Automate de forma muy sencilla:

Y el resultado de la ejecución es:

Y este es el resultado. Y como lo podemos ejecutar en Automate a modo de script, resulta muy sencillo incorporarlo en nuestras herramientas.

Comparte este post

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies