Skip to main content
21 outubro 2023
Follow Us

A segunda forma mais rápida de ler dados do Excel no Power Automate

Sou um grande fã do blog do Matthew Devaney sobre Power Apps, Power Automate e tudo sobre o desenvolvimento com a plataforma Power. O seu post mais recente, The fastest way to read large Excel table in Power Automate, chamou a minha atenção imediatamente, porque terminámos recentemente um projeto para um cliente em que esta funcionalidade é crucial. Analisei a técnica do Matthew, e implementei-a, mesmo que requeira um conector Premium para correr o flow.

Neste post, vou partilhar uma versão simplificada do flow, sem o conector Premium, mas com um pequeno script do Office Scripts, que faz precisamente o mesmo trabalho. O resultado final não é tão rápido como o do Matthew, mas funciona - e abre uma nova porta a muitas novas funcionalidades na automação do Excel!

O desafio: uma notificação sonora em “tempo real” sempre que um novo pedido é feito

O nosso cliente, uma empresa de transporte, desafiou-nos a desenvolver uma aplicação que emite um som sempre que a empresa recebe um pedido de um cliente. Estão sediados aqui em Portugal e enviam dezenas de camiões para toda a Europa transportando todo o tipo de mercadorias. O tempo é crucial e, às vezes, as entregas atrasam-se porque ninguém está atento à carteira de pedidos. Se um cliente fizer um novo pedido, a empresa deverá agir imediatamente para evitar atrasos desnecessários.

O desafio foi assim disponibilizar em grandes ecrãs nos múltiplos pontos de entrega espalhados pelo país uma Power App que apresentasse um mapa da Europa com os pontos de destino e uma tabela com os dados da encomenda. Eles queriam tocar um som alto (uma buzina, claro!) para chamar a atenção de todos que um novo pedido acabava de chegar!

Este é realmente um projeto engraçado e bastante diferente do tipo de projetos em que estamos habituados a trabalhar. Mas foi um pouco confuso quando o cliente nos disse que os detalhes do pedido são inseridos manualmente numa grande tabela Excel e que a app deveria responder em “tempo real” sempre que um novo pedido fosse feito.

Assumindo que “tempo real” é impossível de obter com o Excel e Power Apps, aceitamos o desafio de tocar a buzina e atualizar o mapa e a tabela no Power Apps, um minuto após uma nova linha ser adicionada à tabela.

A solução: faça com que o Power Automate leia a tabela do Excel rapidamente

Não vou detalhar todos os detalhes dessa implementação neste post, mas focar apenas no conceito de obter os dados no Power Automate o mais rápido possível.

Vamos então começar com um trigger manual:

A próxima etapa é chamar um Office Script que corre na tabela Excel da qual queremos obter os dados.Então, para que isso funcione, precisamos ter o ficheiro Excel e o script nalgum lugar do SharePoint ou do OneDrive.

Tenho ambos os ficheiros num site do SharePoint dentro de uma pasta específica, como mostra a imagem abaixo:

O ficheiro Excel contém um exemplo de tabela de demonstração para fins de demonstração.Vamos chamá-la de “Table3” e colocá-la na Sheet 3:

Esta tabela contém 50.000 linhas e 4 colunas e preciso colocar esses dados o mais rápido possível no Power Automate.Se usarmos a ação padrão “List rows present in a table” no Power Automate, seriam necesários, com certeza, mais de 3 minutos.

De fuma forma resumida, os scripts do Office são pequenos programas que permitem automatizar o Excel.Tal como o VBA, eles permitem automatizar muitas tarefas repetitivas no Excel de uma forma muito eficiente. Eles são armazenados na nuvem e podem ser executados em qualquer ficheiro Excel que esteja armazenado no mesmo domínio.Isso significa que é possível criar um script que não esteja associado a um único ficheiro Excel, mas que seja independente e possa ser executado em qualquer lugar.O melhor de tudo é que você também pode chamar scripts do Office a partir do Power Automate.

Acredito que esta seja uma ótima solução com potencial para criar muitas coisas boas.

Então, este é o script que precisamos chamar a partir do nosso fluxo:

function main(workbook: ExcelScript.Workbook) {

    let ws = workbook.getWorksheet("Sheet3");

    return ws.getTable("Table3").getRange().getValues();

}

Este código contém uma função main que é executada sempre que o script é chamado. Então, o nome da função é main e o seu argumento é Excel Workbook, que é o ficheiro na qual a função será executada.

A definição da função em si contém apenas duas linhas:

  • A primeira linha define ws como a sheet (ou separador) em que o script será executado. No nosso caso, é Sheet3
  • A segunda linha devolve os valores dentro de todo o intervalo da tabela da qual queremos extrair os dados, incluindo cabeçalhos. Ou seja é a Table3.

É claro que este é um script simples e não vou explorar todos os detalhes aqui, nem a linguagem em que ele é executado: TypeSript.

Se quiser saber mais sobre Office Scripts, pode seguir este link.

Então, o segundo step do nosso fluxo é o seguinte:

 

Então, o flow neste momento estará assim:

PowerAutomate 5

Se executarmos o flow como está neste momento, deveremos obter o seguinte output do step: “Run script from SharePoint library”:

PowerAutomate 6

Isto é um pouco assustador, mas pelo menos conhecemos o fluxo e o script foi executado sem problemas e os dados foram carregados no Power Automate. Se copiarmos todo o array “Result”, conforme mostra a imagem abaixo, poderemos analisar o resultado:

PowerAutomate 7

Isto será o input para o próximo step:  Parse JSON. Adicione este step e insira o texto destacado na caixa “Insert a sample JSON Payload”:

PowerAutomate 8

Então, estes são os detalhes deste step:

PowerAutomate 9

Na caixa "Content", o código é:

body(‘Run_script_from_SharePoint_library’)?[‘result’]

E este é o flow até ao momento:

PowerAutomate 10

Vamos testar novamente o flow e ver o que acontece. O output do último step promete. Os dados parecem estar bem!

PowerAutomate 11

Então, finalmente, precisamos mapear as colunas que precisamos, de forma a obter os dados no formato pretendido. Vamos acrescentar uma ação "Select" e mapear os campos como segue:

PowerAutomate 12

O código na caixa From é o seguinte:

body(‘Parse_JSON’)

E  o código de cada um dos campos, o seguinte:

  • Region: item()[0]
  • Country: item()[1]
  • ItemType: item()[2]
  • SalesChannel: item()[3]

E cá está! Este é o aspeto do nosso flow na sua versão final:

PowerAutomate 13

Vamos lá testá-lo! Executemos o código e vejamos os resultados. O tempo de execução é de apenas 12 segundos (embora os resultados variem ligeiramente de cada vez que executamos o flow):

PowerAutomate 14

E os resultados são o que esperávamos:

PowerAutomate 15

Eis um flow, sem conector Premium e que, ainda assim, é capaz de obter um resultado fantástico para os obetivos deste projeto!

Ficheiros em anexo


Assine a nossa newsletter e receba o nosso conteúdo diretamente no seu email