29 mayo, 2022

PROCEDIMIENTO AUTOMATIZADO PARA ELIMINAR DUPLICADOS Y ORDENAR ELEMENTOS EN UNA CADENA DE TEXTO CON TYPESCRIPT

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.

Donate Button with Credit Cards

¡¡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

Comparte este post

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

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