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:
Se executarmos o flow como está neste momento, deveremos obter o seguinte output do step: “Run script from SharePoint library”:
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:
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”:
Então, estes são os detalhes deste step:
Na caixa "Content", o código é:
body(‘Run_script_from_SharePoint_library’)?[‘result’]
E este é o flow até ao momento:
Vamos testar novamente o flow e ver o que acontece. O output do último step promete. Os dados parecem estar bem!
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:
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:
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):
E os resultados são o que esperávamos:
Eis um flow, sem conector Premium e que, ainda assim, é capaz de obter um resultado fantástico para os obetivos deste projeto!