Hola a todos!
Hace unos días publicaba dos post en los que mediante una UDF o función definida obtenía elementos únicos y los ordenaba:
ELIMINAR DUPLICADOS EN UNA CADENA DE TEXTO CON TYPESCRIPT
ELIMINAR DUPLICADOS EN UNA CADENA DE TEXTO Y ORDENAR CON TYPESCRIPT
Pues bién, he recibido una solicitud pidiendo que los transformase en un procedimiento automatizado y no una UDF, es decir que los podamos ejecutar en la pestaña AUTOMATIZAR como un script.
Este trabajo se puede realizar de varias formas, tantas como podamos idear en el proceso y las instrucciones precisas. En mi propuesta voy a utilizar un forEach() para recorrer cada fila y las funciones que vimos en los post anteriores para generar los datos, obteniendo el mismo resultado que las dos UDF’s anteriores.
Adicionalmente crearé una nueva columna en la que se muestra la cadena de texto original pero ordenada.
El script es el siguiente:
function main(workbook: ExcelScript.Workbook) {
//declaramos variables y cargamos valores
const mihoja = workbook.getWorksheet("Hoja1");
const valores = mihoja.getUsedRange().getValues();
//creamos titulos para las tres columnas a calcular
const nUnicos: (string)[][] = [
["UNICOS"]
];
const nUnicosOrdenados: (string)[][] = [
["UNICOS ORDENADOS"]
];
const nOrdenados: (string)[][] = [
["ORDENADOS"]
];
//pasamos por el for los valores de la columna 1 a partir de la fila 1
valores.splice(1).forEach((row) => {
let pRango = row[0].toString().replace(/\s/g, "");
//obtenemos Unicos, los Ordenamos y Ordenamos los datos iniciales
let Unicos = Array.from(new Set(pRango.split(','))).join(', ');
let UnicosOrdenados = Array.from(new Set(pRango.split(',').sort())).join(', ');
let Ordenados = pRango.split(',').sort().join(', ');
//Creamos los nuevos arrays
nUnicos.push([Unicos])
nUnicosOrdenados.push([UnicosOrdenados])
nOrdenados.push([Ordenados])
});
//limpiamos celdas
let FinRow = mihoja.getUsedRange().getRowCount() - 1;
mihoja.getRangeByIndexes(1, 1, FinRow, 3).clear(ExcelScript.ClearApplyTo.contents);
//pasamos los datos a cada columna. Unicos
const ColumnaUnicos = mihoja.getRangeByIndexes(0, 1, nUnicos.length, 1);
ColumnaUnicos.setValues(nUnicos);
//Unicos Ordenados
const ColumnaUnicosOrdenados = mihoja.getRangeByIndexes(0, 2, nUnicosOrdenados.length, 1);
ColumnaUnicosOrdenados.setValues(nUnicosOrdenados);
//Datos iniciales ordenados
const ColumnaOrdenados = mihoja.getRangeByIndexes(0, 3, nOrdenados.length, 1);
ColumnaOrdenados.setValues(nOrdenados);
}
Como podéis observar la cantidad de código utilizado es mayor, pero necesaria. En este caso estamos unificando tres custom functions en un solo procedimiento.
En esta imagen podéis ver cómo se genera la información como un proceso automatizado que fila por fila. Los temas usados con lenguajes de programación, razas de gatos y variedades de plantas. La última columna ordena la columna A.

Y esto es todo, con esto ya quedaría el trabajo finalizado. A diferencia de otros post en los que he utilizado un bucle For, en este caso utilizo un forEach con el que además ahorramos declarar algunas variables.
Espero que sea de utilidad para vuestros procedimientos programados.
¿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