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.
