Continuando con Power Automate, ahora vamos a ver dos formas diferentes para extraer datos de una tabla en un archivo de Excel usando Power Automate, y veremos un método lento y dos rápidos.
- Empezaremos dándole un vistazo a un flujo de Power Automate que use acciones simples pero que tomarán tiempo para ejecutarse.
- En el segundo veremos cómo usar una combinación de acciones simples y el método de Pieter, el cual nos tomará menos tiempo para ejecutar.
Respecto a los datos que estaremos usando el día de hoy, como nuestra meta es transformar grandes cantidades de datos de Excel en JSON, en este archivo que tenemos una tabla llamada «Trabajos» con 20,000 filas de datos (haremos pruebas con los primeros 255) que nos mostrarán tres trabajos: «Pinta», «Jardinería» y «Plomería», los cuales se completarán en diferentes casas (representadas en columnas).
Si quieres intentar los siguientes procedimientos con todas las filas, puedes checarlo en nuestra entrada de la semána anteriór.
Nuestra intención es meter todos estos datos en tres objetos JSON tal y como se muestra a continuación. Cada uno de estos representará un trabajo completado con un array que contenga «número de casa», «calle» y «ciudad». Estos datos podrán ser usados para análisis y reportes posteriores.
MÉTODO 1
NOTA: En la medida de lo posible, intenta evitar usar este método, pues es el más tardado.
Una manera simple de obtener los datos es por medio de la acción «lista de filas presentes en una tabla». Con esta pasamos los detalles requeridos a esta acción, como por ejemplo, en dónde se encuentra el archivo de Excel y la tabla (en este caso llamada «Trabajos») que contiene los datos y obtendremos las filas como JSON.
La acción «lista de filas» utiliza Microsoft Graph para obtener los datos, por lo cual para obtener el archivo de manera dinámica necesitaremos dos conectores para que estos llamen a Microsoft Graph. Necesitaremos proveerles el directorio del archivo, el archivo mismo para que lea las tablas necesarias y las obtenga desde el archivo de Excel. Para usar estos conectores, el archivo de Excel debe tener los datos que queramos leer en una tabla.
Una vez tengamos esto haremos un loop a través de las filas (en paralelo si es necesario) y para cada fila, revisar si «Pintar» no está vacío y recolectar los campos «número de casa», «calle» y «ciudad» relacionados a esa fila para luego adjuntarlos a una array variable. Haremos lo mismo tanto para «Jardinería» como para «Plomería».
Cuando el loop termine de ejecutarse, las variables en el array tendrán las filas requeridas y podremos usar la acción «Componer» para obtener los datos requeridos.
{"Pintar":variables('varPintar')}
Ahora vamos a ejectuarlo. Como ya dijimos, este es un método simple y que funciona bien para pocas cantidades de datos. De ser el caso contrario y tener muchos datos con los cuales trabajar, entonces este proceso nos tomará mucho tiempo para ejecutarse.
Con el siguiente método veremos cómo reducir el tiempo que toma a estas mismas acciones realizarse.
MÉTODO 2
Ahora echemos un vistazo a cómo reducir el tiempo que toma a la acción «aplicar a cada columna» para extraer datos de Excel con Power Automate. La principal razón por la cuál le toma más tiempo es porque esta acción usa variables dentro de ella. Power Automate necesita obtener el seguro para las variables, establecer sus valores y luego quitar este seguro cuando alguna tarea necesite ser realizada en las variables, por lo cual nos vendría bien encontrar una forma de evitar estas variables.
Para lograr esto vamos a usar las acciones «Filtro» y «Seleccionar» y obtendremos los datos necesarios usando el ya mencionado método de Pieter.
El flujo que vamos a ver a continuación puede ser descargado de manera directa si damos click a este link.
Empezaremos usando de nuevo la acción «lista de filas presentes en una tabla» para obtener los datos desde Excel. Después de eso, vamos a crear un array que represente las columnas/encabezados en Excel de esta forma:
["Pintar", "Jardinería", "Plomería"]
Estos nombres de columnas/encabezados pueden ser guardados en una lista en SharePoint o cualquier otro lugar de ser necesario. De esta forma, no habrá necesidad de editar el flujo más adelante.
Conversión a JSON
En cuanto tengamos esto, podremos hacer un loop a través de cada una de las columnas/encabezados. Primero filtraremos las filas para las cuales la columna actual no se encuentre vacía y luego seleccionaremos el «número de casa», «calle» y «ciudad» relacionados a esa fila.
Para hacer que en el Select te aparezcan los valores como los he listado aqui, debes construir la función de la siguiente manera:
item()['Num Casa'] item()['Calle'] item()['Ciudad']
Esto nos dará un array de datos JSON para «Pintar», «Jardinería» y «Plomería» en ese orden y será acomodado en orden ascendente por fila. Después de esto, usaremos el método de Pîeter para obtener el JSON necesario. Por ejemplo, usaremos el cuerpo de la acción «Seleccionar» fuera del loop.
Cuando la acción seleccionada sea referenciada fuera del loop, tendrá todos los valores concatenados en el loop. Dado que el loop está hecho para tres columnas/encabezados, los datos concatenados tendrán tres valores. El primer objeto de estos datos concatenados será los datos pertenecientes a «Pintar».
{"Pintar": body('Map_non_empty_values')[0]}
De manera similar para «Jardinería» y «Plomería», vamos a necesitar obtener el segundo y tercer objeto de los datos concatenados. Por ejemplo:
{ "Jardinería: body('Map_non_empty_values')[1]}
{ "Plomería": body('Map_non_empty_values')[2]}
Por medio del método de Pieter hemos reducido la ejecución de tiempo de 5 minutos a solo 3 segundos.
Un dato adicional es que en el loop de «aplicar a cada columna» podemos usar la operación «Seleccionar» primero y luego «Filtrar» para los datos si es necesario. Para esto necesitaremos escribir una expresión en «Seleccionar» en su lugar:
if(empty(item()?[Outputs("current_column")]),null,json(concat('{"House number":"',item()?['House number'],'","Street":"',item()?['Street'],'","City":"',item()?['City'],'"}')))
Concluciones
Con esto podemos intentar y evitar usar para cada loop con variables dentro cada que sea posible. En lugar de eso, podemos usar el filtro y seleccionar acciones que sean rápidas y nos ayuden a obtener los datos requeridos en solo unos segundos. Combinando eso con el método de Pieter nos ayudará a hacer flujos bastante rápidos y extraer datos desde Excel de forma optima con Power Automate.
Cualquier duda nos leemos abajo.