Office Scripts: ordenar las hojas alfabéticamente

Índice
  1. Ejemplo de script de Office
  2. Mejoras de código
    1. Orden inverso
    2. Caracteres en mayúsculas y minúsculas
    3. ordenar números
    4. Usando el guión
  3. Script de Office reutilizable para Power Automate

En esta publicación, cubrimos cómo ordenar hojas alfabéticamente usando Office Scripts. De hecho, el código final será lo suficientemente flexible como para ordenar hojas de muchas maneras diferentes. Compartiré el script básico, junto con los pasos para crear una solución más dinámica y sólida. Al final, tendremos un script que debería cumplir con la mayoría de los requisitos de clasificación de sus hojas de trabajo.

Dado que los scripts de Office se pueden usar con Power Automate, también le proporcionaré un script reutilizable para que lo use con sus flujos.

Si estás preparado para eso, comencemos.

Tabla de contenido
  • Ejemplo de script de Office
  • Mejoras de código
    • Orden inverso
    • Caracteres en mayúsculas y minúsculas
    • ordenar números
    • Usando el guión
  • Script de Office reutilizable para Power Automate

Ejemplo de script de Office

Comencemos con un ejemplo básico. El siguiente código clasifica las hojas de trabajo utilizando el conjunto de códigos de caracteres.

functionmain(workbook:ExcelScript.Workbook){ //Scriptvariables letwsArr=workbook.getWorksheets();letwsNameArr:string[]=[]; //Obtener nombres de hojas en una matriz for(leti=0;iwsArr.length;i++){ wsNameArr.push(wsArr[i].getName())} //Ordenar la matriz de nombres de hojas de trabajowsNameArr.sort(); //Mueve las hojas de trabajo al orden de la matriz for(leti=0;iwsNameArr.length;i++){ workbook.getWorksheet(wsNameArr[i]).setPosition(i);}};

El código tiene 4 secciones principales:

  1. Crea las variables necesarias para ejecutar el código:
    • Una serie de hojas de trabajo llamadas wsArr
    • Una matriz vacía llamada wsNameArr, que contendrá los nombres de las hojas de trabajo.
  2. Recorra la matriz wsArr y agregue los nombres de las hojas de trabajo en la matriz wsNameArr creada anteriormente
  3. Ordene la matriz wsNameArr usando el método básico sort()
  4. Recorra wsNameArr y establezca el orden de la hoja de trabajo para que sea el mismo que el de la matriz

En muchas circunstancias, este código simple funcionará perfectamente. Sin embargo, hay algunos problemas con los que podemos encontrarnos:

  • Ordenar números : todos los nombres de las hojas de trabajo son cadenas de texto, lo que significa que están ordenados carácter por carácter. Si tuviéramos hojas llamadas "1", "2" y "12", se ordenarían como "1", "12" y "2". Lo cual, si quisiéramos una clasificación numérica, proporcionaría el orden incorrecto para nuestras necesidades.
  • Caracteres en mayúsculas y minúsculas : las letras mayúsculas y minúsculas se tratan de forma diferente cuando se clasifican según el orden del código de caracteres. Por ejemplo, los números aparecen primero en el juego de caracteres, seguidos de las mayúsculas y las minúsculas. Por lo tanto, si queremos ordenar alfabéticamente, debemos encontrar una manera de ignorar el caso.
  • Orden inverso : a veces queremos mostrar los elementos en orden inverso.

Mejoras de código

Veamos cada una de las mejoras y agréguelas a nuestro código para crear un script más utilizable.

Orden inverso

Para ordenar una matriz en orden inverso, es un proceso de dos pasos:

  1. Utilice el método sort() para colocar la matriz en un orden de clasificación natural
  2. Utilice el método reverse() para invertir el orden de la matriz

Se han realizado los cambios necesarios en el código siguiente en negrita.

functionmain(workbook:ExcelScript.Workbook){ //Optionvariables letreverseSort = true //Scriptvariables letwsArr=workbook.getWorksheets();letwsNameArr:string[]=[]; //Obtener nombres de hojas en una matriz for(leti=0;iwsArr.length;i++){ wsNameArr.push(wsArr[i].getName())} //Ordenar la matriz de nombres de hojas de trabajowsNameArr.sort(); //Si la ordenación inversa es verdadera, entonces invierta el orden de la matriz if(reverseSort==true){ wsNameArr.reverse(); } //Mueve las hojas de trabajo al orden de la matriz for(leti=0;iwsNameArr.length;i++){ workbook.getWorksheet(wsNameArr[i]).setPosition(i);}};

Para ordenar en orden natural, establezca la variable de clasificación inversa en falso.

letreverseSort = false;

O para ordenar en orden inverso, establezca la variable de clasificación inversa en verdadero.

letreverseSort = verdadero;

Caracteres en mayúsculas y minúsculas

Para obtener una clasificación alfabética que trate los caracteres en mayúsculas y minúsculas por igual, debemos ignorar las mayúsculas y minúsculas.

El enfoque que adoptaremos será el siguiente:

  1. Cree una matriz 2D de nombres de hojas de trabajo:
    • La primera dimensión contendrá el nombre de la hoja original.
    • La segunda dimensión contendrá la versión mayúscula del nombre; Esto hace que el caso sea el mismo para todos los elementos.
  2. Ordena la matriz usando la segunda dimensión.
  3. Aplicar el orden de clasificación a las hojas.

Debido a que estamos usando una matriz 2D, necesitamos usar una versión más avanzada del método sort().

wsNameArr.sort((a,b)={ if(a[1]b[1])return1; if(a[1]b[1])return-1; return0;});

Esto pasa por cada elemento de la matriz tomando el valor y el siguiente valor (a y b) y determina si:

  • ab luego devuelve 1, lo que significa que el segundo elemento (b) debe ir antes del primer elemento (a)
  • ab luego devuelve -1, lo que significa que el primer elemento (a) debe ir antes del segundo elemento (b)
  • a = b luego devuelve 0: los valores son los mismos y no se produce ningún cambio en la posición

Nuestro nuevo script se ve así (los cambios están en negrita)

functionmain(workbook:ExcelScript.Workbook){ //Opcionesvariables letreverseSort=false; letignoreCase=true; //variables de script letwsArr=workbook.getWorksheets();letwsNameArr:string[]=[]; //GetSheetnamesintoanarray //wsNameArr[0]=ActualName(no cambia) //wsNameArr[1]=TransformedName(toperformtransformationson) for(leti=0;iwsArr.length;i++){ wsNameArr.push([wsArr[i].getName( ),wsArr[i].getName()]) } //Si ignoreCase, entonces convierta el segundo valor de la matriz a mayúsculas if(ignoreCase==true){ for(leti=0;iwsArr.length;i++){ wsNameArr[i] [1] = wsNameArr[i][1].toUpperCase(); } } //Ordenar la matriz usando el segundo elemento de wsNameArr wsNameArr.sort((a,b)={ if(a[1]b[1])return1; if(a[1]b[1])return-1; return0; }); //Si la ordenación inversa es verdadera, entonces invierte el orden de la matriz if(reverseSort==true){ wsNameArr.reverse();} //Mueve las hojas de trabajo al orden de la matriz for(leti=0;iwsNameArr.length;i++){ workbook.getWorksheet(wsNameArr[i][0]).setPosition(i ); }};

En el script anterior, para aplicar la clasificación de números de código estándar, establezca la variable ignoreCase en falso.

let ignoreCase = false;

O para ordenar en orden alfabético, independientemente del caso, establezca la variable ignoreCase en verdadero.

let ignoreCase = verdadero;

ordenar números

Hay una mejora más que queremos hacer; la capacidad de ordenar números como números.

Como se indicó anteriormente, todos los nombres de las hojas de trabajo son cadenas de texto, que se ordenan de izquierda a derecha. Como resultado, las hojas denominadas “1”, “2” y “12” se ordenarían como “1”, “12”, “2”. Para ordenarlos correctamente, debemos convertir la cadena de texto en un número antes de ordenarlos.

Para convertir una cadena de texto en un número, podemos usar la función ParseInt() para números enteros o la función ParseFloat() para decimales.

En el código, luego evaluamos el resultado de las funciones ParseInt() o ParseFloat() para ver si el resultado no es un número, usando la función isNaN().

Nuestro script ahora contiene lo siguiente (cambios en negrita):

functionmain(workbook:ExcelScript.Workbook){ //Opcionesvariables letreverseSort=false; letignoreCase=true; letconvertNumbers=true; //variables de script letwsArr=workbook.getWorksheets();letwsNameArr:string[]=[]; //GetSheetnamesintoanarray //wsNameArr[0]=ActualName(no cambia) //wsNameArr[1]=TransformedName(toperformtransformationson) for(leti=0;iwsArr.length;i++){ wsNameArr.push([wsArr[i].getName( ),wsArr[i].getName()])} //Si ignoreCase, entonces convierta el valor a mayúsculas antes de ordenar if(ignoreCase==true){ for(leti=0;iwsArr.length;i++){ wsNameArr[i] [1]=wsNameArr[i][1].toUpperCase(); }} //Si convierte números, luego convierte cualquier cosa que sea un número en un número if(convertir números==true){ for(leti=0;iwsNameArr.length;i++){ if(isNaN(parseFloat(wsNameArr[i][1]))==false){ wsNameArr[i] [1]=parseFloat(wsNameArr[i][1]); } } } // Ordenar la matriz usando el segundo elemento de wsNameArr wsNameArr.sort((a,b)={ if(a[1]b[1])return1; if(a[1]b[1])return-1; return0;}); //Si la ordenación inversa es verdadera, entonces invierte el orden de la matriz if(reverseSort==true){ wsNameArr.reverse();} //Mueve las hojas de trabajo al orden de la matriz for(leti=0;iwsNameArr.length;i++){ workbook.getWorksheet(wsNameArr[i][0]).setPosition(i );}};

En el script anterior, para ordenar números como números, establezca la variable convertNumbers en verdadero.

let convertNumbers = true;

O para ordenar números como texto, establezca la variable convertNumbers en falso.

let convertNumbers = false;

Usando el guión

El script final en la subsección anterior contiene las tres mejoras que nos permiten:

  • invertir el orden
  • ordenar números
  • ignorar el caso

Estas opciones deberían cumplir con la mayoría de los requisitos que probablemente necesitemos. Sin embargo, siempre habrá escenarios en los que alguien quiera ordenar por caracteres específicos dentro de la cadena de texto. Si bien no hemos cubierto esto, los principios anteriores deberían proporcionar un buen punto de partida para crear un script para ese propósito específico.

Script de Office reutilizable para Power Automate

Para usar este script de Office dentro de Power Automate, podemos realizar algunos cambios adicionales para pasar las tres opciones al script en tiempo de ejecución. Esto hará que nuestro script sea completamente reutilizable y pueda llamarse repetidamente pero con diferentes parámetros.

Para crear un bloque de código reutilizable para Power Automate, simplemente movemos las variables de opción a los parámetros de la función (en negrita en el código siguiente).

function main(libro de trabajo: ExcelScript.Workbook, orden inverso: booleano, ignorarCase: booleano, convertNumbers: booleano ) { //Scriptvariables letwsArr=workbook.getWorksheets();letwsNameArr:string[]=[]; //GetSheetnamesintoanarray //wsNameArr[0]=ActualName(doesnotchange)//wsNameArr[1]=TransformedName(toperformtransformationson) for (let i = 0; i wsArr.length; i++) { wsNameArr.push([wsArr[i]. getName(),wsArr[i].getName()])} //Si ignoreCase, entonces convierta el valor a mayúsculas antes de ordenar if(ignoreCase==true){ for(leti=0;iwsArr.length;i++){ wsNameArr[ i][1]=wsNameArr[i][1].toUpperCase(); }} //Si convierte números, luego convierte cualquier cosa que sea un número en un número if(convertir números==true){ for(leti=0;iwsNameArr.length;i++){ if(isNaN(parseFloat(wsNameArr[i][1]))==false){ wsNameArr[i] [1]=parseFloat(wsNameArr[i][1]); } }} //Ordenar la matriz usando el segundo elemento de wsNameArr wsNameArr.sort((a,b)={ if(a[1]b[1])return1; if(a[1]b[1])return-1; return0;}); //Si la ordenación inversa es verdadera, entonces invierta el orden de la matriz if(reverseSort==true){ wsNameArr.reverse(); } //Mueve las hojas de trabajo al orden de la matriz for(leti=0;iwsNameArr.length;i++){ workbook.getWorksheet(wsNameArr[i][0]).setPosition(i);}};

Para usar el script anterior con Power Automate, el paso será similar al siguiente:

Paso de Power Automate para ordenar hojas de trabajo

Los parámetros de script pasados ​​en Power Automate son todos Sí o No, pero en nuestro script son booleanos y tienen valores verdaderos o falsos. Lo cual es un poco confuso, pero es bastante fácil de recordar:

  • Sí = verdadero
  • No = falso

Páginas relacionadas :

  • Guía de hojas de trabajo de Office Scripts
  • Scripts de Office: oculta todas las hojas excepto una

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Este sitio web utiliza cookies para mejorar la experiencia del usuario y garantizar un funcionamiento eficiente. Al utilizar nuestro sitio web, aceptas todas las cookies de acuerdo con nuestra política de cookies. Leer mas...