As listas do SharePoint oferecem uma maneira flexível de armazenar e organizar dados, permitindo que as equipes colaborem de maneira eficaz. Integrar essa ferramenta com o Power Automate é uma excelente ideia, resultando em economia de tempo significativa para suas tarefas diárias. No entanto, um desafio comum dessa integração é o temido loop infinito (infinite loop). Isso ocorre quando um fluxo de Power Automate é acionado por uma atualização em um registro na SharePoint List e, dentro desse mesmo fluxo, há uma ação que atualiza o mesmo item da lista. Como resultado, ocorre um acionamento subsequente do fluxo, criando um loop infinito.
O loop infinito causa diversos problemas, incluindo consumo excessivo de recursos, desempenho lento e potencialmente causar o travamento de toda a automação. Resolver esse desafio é essencial para manter um processo de automação estável e confiável. Alguns posts na Comunidade do Power Automate até recomendam o uso de uma conta de serviço exclusiva para gerenciar esses fluxos, o que pode resultar em aumento de custos (cada conta de serviço necessita de uma licença própria) e maior complexidade no fluxo.
Felizmente, existe uma solução criativa e fácil que resolve esse problema sem exigir licenças adicionais, utilizando recursos já disponíveis no SharePoint.
Visão geral do exemplo
Como exemplo para este artigo, vamos utilizar uma SharePoint List bastante simples e que contém poucas colunas, representando uma lista de clientes:

A lista possui duas colunas de texto (“Client” e “Email”) e duas colunas numéricas (“Lucky number” e “PA_Version Control”). Para este exemplo, suponhamos que os usuários devam preencher apenas as colunas de texto e que o ‘Número da Sorte’ (destacado em amarelo) deve ser gerado aleatoriamente pelo sistema (neste caso, por um fluxo no Power Automate). Quando o nome ou o e-mail do cliente é alterado, o “Lucky number” é atualizado, gerando um novo número aleatório.
A coluna “PA_Version Control” (destacada em verde) também será preenchida automaticamente e será usada para evitar que o infinite loop ocorra no Power Automate, como veremos posteriormente neste artigo. Ainda, como os usuários devem não alterar esta coluna (segundo as regras do nosso exemplo), você pode mantê-la oculta.
O loop infinito (infinite loop) de SharePoint Lists no Power Automate
O bug do loop infinito ocorre quando temos um fluxo que é acionado quando um registro da lista é editado e possui uma ação ‘Atualizar item’ que modifica esse mesmo registro:

Como a ação ‘Atualizar item’ modifica o mesmo item da lista, o trigger será acionado e o fluxo executado novamente. O comportamento será repetido sucessivas vezes, entrando em um “loop infinito”. Para evitá-lo, precisamos fazer algumas pequenas alterações no design do fluxo.
Entendendo o controle de versões em SharePoint Lists
O controle de versão é um dos atributos que o Power Automate extrai do item da lista ao utilizar o trigger “Quando um item é criado ou modificado”:

Essa propriedade captura a versão atual do registro. Quando incluído em uma lista, o registro recebe por padrão a versão ‘1.0’, e para cada alteração subsequente nesse mesmo registro, o número da versão é incrementado em ‘1’ (tornando-se ‘2.0’, ‘3.0’, ‘4.0’, e assim por diante).
No Power Automate, o trigger ‘Quando um item é criado ou modificado’ retornará, entre outros dados sobre o novo ou editado registro da Lista, a sua “versão”. Você pode encontrá-lo os “raw outputs” do trigger (se você não souber como acessar os raw outputs, confira este artigo):

O Power Automate receberá essa informação com um ponto decimal e como um tipo de dado “string/texto” (podemos identificá-lo como uma string devido às aspas que cercam o 3.0, conforme destacado em amarelo acima). Contudo, nosso fluxo realizará operações aritméticas com o ‘número da versão’, então precisaremos converter seu valor, que atualmente é um texto, para um número inteiro/integer (para saber mais sobre tipos de dados no Power Automate e como trabalhar com eles, consulte este artigo).
Portanto, inicializaremos uma nova variável de tipo integer chamada ‘version_controlling’ e atribuiremos a ela uma expressão int() contendo o conteúdo dinâmico da propriedade ‘VersionNumber’ do trigger outputs como único argumento (você pode selecioná-la como conteúdo dinâmico):

Após adicionar o conteúdo dinâmico, a expressão deverá psosuir esse texto: Int(triggerOutputs()?[‘body/{VersionNumber}’])
Comparando versões com Power Automate
Agora que temos o valor correspondente à versão atual da edição, precisamos compará-lo com aquele armazenado na Lista do SharePoint. Todas as alterações (manuais ou automáticas) resultam em um novo número de versão, mas em nosso processo, estamos armazenando apenas o número da versão das modificações executadas pelo Power Automate.
Portanto, se a versão atual (armazenada na variável ‘version_controlling’) for igual àquela armazenada na Lista mais um, então estamos dentro do loop e devemos encerrar o fluxo sem executar nenhuma atualização na Lista.
Na prática, vamos precisar de uma ação de ‘Condição’ contendo duas subcondições que serão testadas com um operador ‘E’ (para aprender mais sobre como trabalhar com condições no Power Automate, consulte este artigo). A primeira subcondição verificará se a versão armazenada na lista é diferente de ‘null’, o que capturará apenas os valores não vazios (quando um novo item é adicionado à Lista, o usuário não preencherá este campo, então ele será ‘null’ neste primeiro momento). A segunda condição verifica se o número da versão da edição atual é equivalente àquele armazenado na coluna ‘PA_Version Control’+1:

Em resumo:
- Certifique-se de selecionar o operador lógico “E” para concatenar as duas subcondições (destacado em amarelo)
- No input da direita da primeira subcondição, adicione o conteúdo dinâmico da propriedade ‘PA_Version Control’ vinda do trigger (item 1)
- Certifique-se de selecionar no dropdown da primeira condição o valor de ‘não é igual a’ (destacado em verde)
- No input da esquerda da primeira subcondição, adicione um valor ‘null’ como expressão (item 2)
- No input da direita da segunda subcondição, adicione a variável ‘version_controlling’ (item 3)
- No input da esquerda da segunda subcondição, adicione a seguinte expressão: add(triggerOutputs()?[‘body/PA_VersionControl’], 1), substituindo o texto em vermelho pelo conteúdo dinâmico da propriedade ‘PA_Version Control’ vinda do trigger.
Essa condição está testando se o valor de ‘PA_Version Control’+1 corresponde à modificação que acionou o fluxo. Se corresponder, o fluxo pode ser interrompido, quebrando o loop infinito. Também estamos definindo uma condição para verificar se a coluna ‘PA_Version Control’ tem um valor nulo: isso é importante para evitar erros, já que a coluna ‘PA_Version Control’ será sempre nula quando estivermos criando um novo registro na Lista.
Evitando o Infinit Loop em SharePoint Lists com Power Automate
Agora vamos incluir uma ação de ‘Atualizar item’ no bloco ‘Falso’ da condição, mantendo o bloco ‘Verdadeiro’ vazio. O fluxo atualizará o item da lista somente se (1) o valor ‘PA_Version Control’ for igual a null ou (2) ‘PA_Version Control’ + 1 não for igual à variável ‘version_controlling’. Se ‘version_controlling’ for diferente de ‘PA_Version Control’ + 1, o fluxo pode ser encerrado sem nenhuma ação adicional.
Na ação ‘Atualizar item’, vamos gerar o valor aleatório para a coluna ‘Lucky number’ (podemos fazer isso usando a expressão rand(1, 500)) e atribuir a versão atual a coluna ‘PA_Version Control’:

Como nosso caso de uso exige que nenhum usuário edite a coluna ‘PA_Version Control’, podemos ter certeza de que ela está mantendo o controle da versão que foi criada pelo Power Automate. Uma vez que o fluxo é acionado novamente devido a essa alteração (iniciando um loop), a ‘Condição’ que criamos acima identificará que a última atualização foi realizada pelo Power Automate, então o resultado da ‘Condição’ será verdadeiro, direcionando o fluxo para o bloco ‘Verdadeiro’, que está vazio – e, consequentemente, encerrará o fluxo e interromperá o loop.
Testando o fluxo
Para garantir que o fluxo esteja funcionando, vamos adicionar um novo usuário “Harry P”, mantendo as colunas ‘Lucky Number’ e ‘PA_Version Control’ vazias:

Como criamos um novo item, o fluxo será acionado e nos detalhes da execução identificaremos que a ‘Condição’ retornará como falsa (destacado em azul), o que é esperado, pois a coluna ‘PA_Version Control’ está vazia (tem um valor igual a null):

Ao expandir a ação ‘Atualizar item’ para verificar as saídas, verificamos que o ‘Lucky Number’ é definido como ’83’ (destacado em amarelo) e o ‘PA_Version Control’ é definido como ‘1’ (destacado em verde).

Quase ao mesmo tempo, o fluxo foi acionado novamente. Isso é esperado, pois durante a primeira execução do fluxo (destacada em verde), atualizamos o registro da lista, resultando em outra chamada de fluxo (destacada em amarelo):

Agora, contudo, a “Condição” retornou “verdadeira” (destacado em verde), e a ação “Atualizar item” não foi executada (destacado em amarelo):

Ao verificar nossa Lista, ‘Harry P’ recebeu corretamente o 83 como ‘Número da sorte’ e ‘1’ como ‘PA_Version Control’:

Se mudarmos o nome de ‘John L’ para ‘John M’, o fluxo será acionado novamente e um novo Lucky Number será atribuído ao registro. O ‘PA_Version Control’ também será reatribuído para ‘3’ e o loop será evitado:

Conclusão
Em conclusão, ao rastrear e comparar versões, o Power Automate permite atualizações inteligentes evitando o “loop infinito”. Com essas práticas em vigor, é possível extrair o melhor uso dessas ferramentas incríveis!

