Contexto geral
Tenho uma equipe no Microsoft Teams para um cliente, onde centralizo as demandas de ajustes internos entre as disciplinas (Elétrica, Instrumentação etc.).
Dentro dessa equipe eu uso:
- Uma lista do SharePoint chamada
Registros de Ajustes, que é onde fica o controle oficial das demandas.
Um Planner (plano: Planner Rio Verde) para gestão das tarefas atribuídas para os responsáveis.
Um Forms que o pessoal preenche quando precisa registrar um novo ajuste.
Hoje já tenho alguns fluxos no Power Automate funcionando:
Quando o usuário preenche o Forms, o fluxo:
Cria um item na lista Registros de Ajustes;
Cria uma tarefa correspondente no Planner.
Isso está ok.
Objetivo
Quero que o Status fique sincronizado entre:
Coluna Status da lista Registros de Ajustes (SharePoint)
Opções: Não Iniciado, Em Andamento, Concluído
Campo Progress da tarefa no Planner
Valores: `notStarted`, `inProgress`, `completed`
Ou seja:
Se o colaborador mudar o Status na lista do SharePoint, o status da tarefa do Planner deve mudar automaticamente.
Se o colaborador mudar o status da tarefa no Planner (percentComplete / Progress), o campo Status do SharePoint deve ser atualizado também.
Quero isso de forma confiável, sem atualizar outros itens errados.
Estrutura das listas
1) Lista principal – Registros de Ajustes
Campos relevantes:
Title (Título do ajuste)
Status – Choice
Não Iniciado
`Em Andamento`
`Concluído`
`IDtarefaPlanner` – Single line of text → guarda o **id** da tarefa criada no Planner.
2) Lista auxiliar – VínculosPlanner
Criei essa lista só para ajudar na sincronização, com os campos:
IDRegistro – Number (ou Lookup para a lista principal) → ID do item na lista Registros de Ajustes
IDPlanner – Single line of text → id da tarefa no Planner
UltStatusPlanner – Single line of text (para controle)
UltStatusSharePoint – Single line of text (para controle)
A ideia é usar essa lista como “tabela de vínculos” estável entre o SharePoint e o Planner.
Nome (exemplo): Registro de Ajuste - Criar item e tarefa
Gatilho
When a new response is submitted (Forms)
Ação em seguida: Get response details
Ações principais
Criar item na lista Registros de Ajustes com os dados do Forms.
Criar tarefa no Planner (Create a task):
Plano: Planner Rio Verde
Título: algo como `concat('Ajuste - ', Title do registro)`
Progress: `notStarted`
**Atualizar item** na lista `Registros de Ajustes` para gravar o ID da tarefa:
Campo `IDtarefaPlanner` =
```sql
outputs('Create_a_task')?['body/id']
```
**Criar item na lista `VínculosPlanner`**:
`IDRegistro` = `ID` do item recém-criado na lista `Registros de Ajustes`
`IDPlanner` = `outputs('Create_a_task')?['body/id']`
`UltStatusPlanner` = `"Não Iniciado"`
`UltStatusSharePoint` = `"Não Iniciado"`
Esse fluxo está ok e já está funcionando.
Diagrama (Fluxo 1):
Forms (When a new response is submitted)
→ Get response details
→ Create item (Registros de Ajustes)
→ Create a task (Planner)
→ Update item (Registros de Ajustes) [preencher IDtarefaPlanner]
→ Create item (VínculosPlanner)
FLUXO 2 – SharePoint → Planner (problemas no Update a Task)
Nome (exemplo): Registro de Ajuste - Sincronizar Status para Planner
Objetivo
Se alguém mudar o campo Status de um item na lista Registros de Ajustes, o fluxo deve:
Ver se esse item tem um IDtarefaPlanner preenchido;
Se tiver, atualizar o Progress da tarefa correspondente no Planner.
Gatilho
When an item is created or modified Lista: Registros de Ajustes
Condição para garantir que existe ID de tarefa
Como estou usando a interface nova, sem “modo avançado” na Condition, configurei assim:
Condition:
Campo à esquerda (Expression):
empty(triggerOutputs()?['body/IDtarefaPlanner'])
Operador: is equal to
Valor à direita: false
Ou seja: só segue se o campo IDtarefaPlanner NÃO estiver vazio.
Converter Status do SharePoint para Progress do Planner
Ação: Compose (por exemplo, MapearStatusParaPlanner)
Expressão:
if(
equals(triggerOutputs()?['body/Status'], 'Não Iniciado'),
'notStarted',
if(
equals(triggerOutputs()?['body/Status'], 'Em Andamento'),
'inProgress',
'completed'
)
)
Atualizar tarefa no Planner
Ação: Update a task
Task Id:
triggerOutputs()?['body/IDtarefaPlanner']
Progress:
outputs('MapearStatusParaPlanner')
Atualizar lista VínculosPlanner
Depois disso, faço:
Ação: Get items na lista VínculosPlanner
Filter Query (ODATA):
IDRegistro eq <ID do item do gatilho>
No construtor:
IDRegistro eq @{triggerOutputs()?['body/ID']}
Ação: Update item (na VínculosPlanner) usando o item retornado:
`UltStatusPlanner` = `outputs('MapearStatusParaPlanner')`
`UltStatusSharePoint` = `triggerOutputs()?['body/Status']`
Problema atual no Fluxo 2
Mesmo apontando o campo certo IDtarefaPlanner para o Task Id, ainda recebo:
BadRequest. Falha ao executar o fluxo.
Ou, em outras tentativas anteriores: The resolved string values for the following parameters are invalid, they may not be null or empty: 'id'
Tenho dúvida se o conector do Planner está exigindo algum outro parâmetro (Bucket, Plan, etc.) ou se tem algo específico com o campo Progress ou com o Task Id no meu ambiente.
Diagrama (Fluxo 2):
When an item is created or modified (Registros de Ajustes)
→ Condition: empty(IDtarefaPlanner) = false ?
True:
→ Compose (mapear Status SP → Progress Planner)
→ Update a task (Planner) [Task Id = IDtarefaPlanner, Progress = saída do Compose]
→ Get items (VínculosPlanner) [Filter Query: IDRegistro eq ID do item]
→ Update item (VínculosPlanner) [UltStatusPlanner / UltStatusSharePoint]
False:
→ (não faz nada)
Nome (exemplo): Registro de Ajuste - Sincronizar Status do Planner para SharePoint
Objetivo
Rodar de tempos em tempos (ex: a cada 1 minuto) e:
Listar as tarefas do Planner;
Para cada tarefa, encontrar o vínculo correspondente na lista VínculosPlanner;
Com esse vínculo, encontrar o item correto na lista Registros de Ajustes;
Atualizar o campo Status no SharePoint com base no percentComplete do Planner;
Atualizar os campos de controle na VínculosPlanner.
Gatilho
Recurrence Intervalo: 1 minuto
Passos principais
Listar tarefas (Planner):
Ação: List tasks
Plano: `Planner Rio Verde`
**Obter itens** da lista `VínculosPlanner`:
Ação: `Get items`
**Apply to each** tarefa do Planner:
Entrada:
```sql
outputs('List_tasks')?['body/value']
```
Dentro desse Apply to each:
3.1. Filter array – achar vínculo pelo IDPlanner
Ação: Filter array
From:
body('Get_items')?['value']
Condição em modo avançado (onde consigo usar):
@equals(
string(item()?['IDPlanner']),
string(items('Apply_to_each')?['id'])
)
3.2. Condição — se encontrou vínculo?
Condition:
@greater(length(body('Filter_array')), 0)
Se False: ignora essa tarefa.
Se True:
3.3. Compor — mapear percentComplete → Status do SharePoint
if(
equals(items('Apply_to_each')?['percentComplete'], 0),
'Não Iniciado',
if(
equals(items('Apply_to_each')?['percentComplete'], 50),
'Em Andamento',
'Concluído'
)
)
3.4. Obter item correto na lista Registros de Ajustes
Ação: Get item (SharePoint)
ID:
first(body('Filter_array'))?['IDRegistro']
3.5. Atualizar item na lista Registros de Ajustes
Ação: Update item
ID:
first(body('Filter_array'))?['IDRegistro']
Campo Status = saída do Compose do passo 3.3.
3.6. Atualizar VínculosPlanner
Ação: Update item na lista VínculosPlanner
ID:
first(body('Filter_array'))?['ID']
UltStatusPlanner = items('Apply_to_each')?['percentComplete'] ou já o texto final
UltStatusSharePoint = saída do Compose (texto: Não Iniciado, Em Andamento, Concluído)
Problemas que já enfrentei no Fluxo 3
Quando eu usava duplo loop (Apply to each de tarefas e outro For each de itens do SharePoint), vários registros eram atualizados com o mesmo status, porque eu acabava casando errado ou atualizando itens sem checar o vínculo corretamente.
Quando tentei arrumar com Filter array, em vários testes ele retornava matriz vazia e acabava gerando:
ID nulo no Update item
erros do tipo:
`The 'inputs.parameters' of workflow operation 'Update_item' ... 'id' may not be null or empty.`
Depois passei a usar essa lista de VínculosPlanner para ser mais assertivo, mas ainda não consegui uma solução estável de ponta a ponta (principalmente por causa do Update a task no Fluxo 2).
Diagrama (Fluxo 3):
Recurrence (1 min)
→ List tasks (Planner)
→ Get items (VínculosPlanner)
→ Apply to each (tarefa do Planner)
→ Filter array (VínculosPlanner where IDPlanner == task.id)
→ Condition: length(Filter array) > 0 ?
True:
→ Compose (mapear percentComplete → Status SP)
→ Get item (Registros de Ajustes) [ID = IDRegistro do vínculo]
→ Update item (Registros) [Status = saída do Compose]
→ Update item (VínculosPlanner) [UltStatusPlanner / UltStatusSharePoint]
False:
→ (não faz nada para essa tarefa)
Principais dúvidas / pontos que preciso de ajuda
Fluxo 2 – Update a task (Planner) com BadRequest / ID nulo
Mesmo apontando Task Id = IDtarefaPlanner (campo de texto no SharePoint), às vezes recebo:
`The resolved string values for the following parameters are invalid, they may not be null or empty: 'id'`
ou `BadRequest. Falha ao executar o fluxo.`
A expressão de Progress está assim:
```sql
if(
equals(triggerOutputs()?['body/Status'], 'Não Iniciado'),
'notStarted',
if(
equals(triggerOutputs()?['body/Status'], 'Em Andamento'),
'inProgress',
'completed'
)
)
```
Gostaria de confirmar:
Se há algum requisito extra no conector do Planner para `Update a task`;
Se é obrigatório enviar também `Plan Id` / `Bucket Id` ou algo do tipo;
Se há alguma limitação quando o fluxo está em outro ambiente ou idioma.
**Fluxo 3 – Melhor forma de casar tarefa do Planner com item do SharePoint via lista auxiliar**
A abordagem de usar uma lista `VínculosPlanner` com `IDRegistro` e `IDPlanner` é adequada?
O uso de `Filter array` com:
```sql
@equals(
string(item()?['IDPlanner']),
string(items('Apply_to_each')?['id'])
)
```
é a melhor prática para casar esses dados?
Há algum jeito mais robusto de fazer isso (por exemplo, com “Get item” direto via ODATA, ou outro recurso do conector Planner)?
Sugestões gerais:
Como vocês estruturariam uma sincronização **bidirecional** entre:
Status (Choice) numa lista do SharePoint
Progress (notStarted/inProgress/completed) no Planner
Garantindo:
que só o item correto seja atualizado;
que não haja loop infinito;
que erros de “id nulo” não voltem a acontecer.
Se precisarem, posso anexar prints das ações Update a task, Filter array, condições e saídas (body) das execuções de teste.
Quero muito fechar essa sincronização de forma confiável, porque isso vai ser usado por toda a equipe para acompanhar o status de ajustes internos entre disciplinas.Segue um texto prontinho pra você colar na Comunidade do Power Automate, já estruturado, com contexto, descrição dos fluxos, expressões usadas e diagramas em texto.
Você pode ajustar nomes de listas, prints e detalhes se quiser, mas a base está aqui.
Título sugerido
Sincronizar Status entre Planner e Lista do SharePoint (via Power Automate) – Update a Task com BadRequest / ID nulo
Contexto geral
Tenho uma equipe no Microsoft Teams para um cliente, onde centralizo as demandas de ajustes internos entre as disciplinas (Elétrica, Instrumentação etc.).
Dentro dessa equipe eu uso:
Uma lista do SharePoint chamada Registros de Ajustes, que é onde fica o controle oficial das demandas.
Um Planner (plano: Planner Rio Verde) para gestão das tarefas atribuídas para os responsáveis.
Um Forms que o pessoal preenche quando precisa registrar um novo ajuste.
Hoje já tenho alguns fluxos no Power Automate funcionando:
Quando o usuário preenche o Forms, o fluxo:
Cria um item na lista Registros de Ajustes;
Cria uma tarefa correspondente no Planner.
Isso está ok.
Objetivo
Quero que o Status fique sincronizado entre:
Coluna Status da lista Registros de Ajustes (SharePoint)
Opções: Não Iniciado, Em Andamento, Concluído
Campo Progress da tarefa no Planner
Valores: `notStarted`, `inProgress`, `completed`
Ou seja:
Se o colaborador mudar o Status na lista do SharePoint, o status da tarefa do Planner deve mudar automaticamente.
Se o colaborador mudar o status da tarefa no Planner (percentComplete / Progress), o campo Status do SharePoint deve ser atualizado também.
Quero isso de forma confiável, sem atualizar outros itens errados.
Estrutura das listas
1) Lista principal – Registros de Ajustes
Campos relevantes:
Title (Título do ajuste)
Status – Choice
Não Iniciado
`Em Andamento`
`Concluído`
`IDtarefaPlanner` – Single line of text
→ guarda o **id** da tarefa criada no Planner.
2) Lista auxiliar – VínculosPlanner
Criei essa lista só para ajudar na sincronização, com os campos:
IDRegistro – Number (ou Lookup para a lista principal)
→ ID do item na lista Registros de Ajustes
IDPlanner – Single line of text
→ id da tarefa no Planner
UltStatusPlanner – Single line of text (para controle)
UltStatusSharePoint – Single line of text (para controle)
A ideia é usar essa lista como “tabela de vínculos” estável entre o SharePoint e o Planner.
Nome (exemplo): Registro de Ajuste - Criar item e tarefa
Gatilho
When a new response is submitted (Forms)
Ação em seguida: Get response details
Ações principais
Criar item na lista Registros de Ajustes com os dados do Forms.
Criar tarefa no Planner (Create a task):
Plano: Planner Rio Verde
Título: algo como `concat('Ajuste - ', Title do registro)`
Progress: `notStarted`
**Atualizar item** na lista `Registros de Ajustes` para gravar o ID da tarefa:
Campo `IDtarefaPlanner` =
```sql
outputs('Create_a_task')?['body/id']
```
**Criar item na lista `VínculosPlanner`**:
`IDRegistro` = `ID` do item recém-criado na lista `Registros de Ajustes`
`IDPlanner` = `outputs('Create_a_task')?['body/id']`
`UltStatusPlanner` = `"Não Iniciado"`
`UltStatusSharePoint` = `"Não Iniciado"`
Esse fluxo está ok e já está funcionando.
Diagrama (Fluxo 1):
Forms (When a new response is submitted)
→ Get response details
→ Create item (Registros de Ajustes)
→ Create a task (Planner)
→ Update item (Registros de Ajustes) [preencher IDtarefaPlanner]
→ Create item (VínculosPlanner)
FLUXO 2 – SharePoint → Planner (problemas no Update a Task)
Nome (exemplo): Registro de Ajuste - Sincronizar Status para Planner
Objetivo
Se alguém mudar o campo Status de um item na lista Registros de Ajustes, o fluxo deve:
Ver se esse item tem um IDtarefaPlanner preenchido;
Se tiver, atualizar o Progress da tarefa correspondente no Planner.
Gatilho
When an item is created or modified
Lista: Registros de Ajustes
Condição para garantir que existe ID de tarefa
Como estou usando a interface nova, sem “modo avançado” na Condition, configurei assim:
Condition:
Campo à esquerda (Expression):
empty(triggerOutputs()?['body/IDtarefaPlanner'])
Operador: is equal to
Valor à direita: false
Ou seja: só segue se o campo IDtarefaPlanner NÃO estiver vazio.
Converter Status do SharePoint para Progress do Planner
Ação: Compose (por exemplo, MapearStatusParaPlanner)
Expressão:
if(
equals(triggerOutputs()?['body/Status'], 'Não Iniciado'),
'notStarted',
if(
equals(triggerOutputs()?['body/Status'], 'Em Andamento'),
'inProgress',
'completed'
)
)
Atualizar tarefa no Planner
Ação: Update a task
Task Id:
triggerOutputs()?['body/IDtarefaPlanner']
Progress:
outputs('MapearStatusParaPlanner')
Atualizar lista VínculosPlanner
Depois disso, faço:
Ação: Get items na lista VínculosPlanner
Filter Query (ODATA):
IDRegistro eq <ID do item do gatilho>
No construtor:
IDRegistro eq @{triggerOutputs()?['body/ID']}
Ação: Update item (na VínculosPlanner) usando o item retornado:
`UltStatusPlanner` = `outputs('MapearStatusParaPlanner')`
`UltStatusSharePoint` = `triggerOutputs()?['body/Status']`
Problema atual no Fluxo 2
Mesmo apontando o campo certo IDtarefaPlanner para o Task Id, ainda recebo:
BadRequest. Falha ao executar o fluxo.
Ou, em outras tentativas anteriores:
The resolved string values for the following parameters are invalid, they may not be null or empty: 'id'
Tenho dúvida se o conector do Planner está exigindo algum outro parâmetro (Bucket, Plan, etc.) ou se tem algo específico com o campo Progress ou com o Task Id no meu ambiente.
Diagrama (Fluxo 2):
When an item is created or modified (Registros de Ajustes)
→ Condition: empty(IDtarefaPlanner) = false ?
True:
→ Compose (mapear Status SP → Progress Planner)
→ Update a task (Planner) [Task Id = IDtarefaPlanner, Progress = saída do Compose]
→ Get items (VínculosPlanner) [Filter Query: IDRegistro eq ID do item]
→ Update item (VínculosPlanner) [UltStatusPlanner / UltStatusSharePoint]
False:
→ (não faz nada)
Nome (exemplo): Registro de Ajuste - Sincronizar Status do Planner para SharePoint
Objetivo
Rodar de tempos em tempos (ex: a cada 1 minuto) e:
Listar as tarefas do Planner;
Para cada tarefa, encontrar o vínculo correspondente na lista VínculosPlanner;
Com esse vínculo, encontrar o item correto na lista Registros de Ajustes;
Atualizar o campo Status no SharePoint com base no percentComplete do Planner;
Atualizar os campos de controle na VínculosPlanner.
Gatilho
Recurrence
Intervalo: 1 minuto
Passos principais
Listar tarefas (Planner):
Ação: List tasks
Plano: `Planner Rio Verde`
**Obter itens** da lista `VínculosPlanner`:
Ação: `Get items`
**Apply to each** tarefa do Planner:
Entrada:
```sql
outputs('List_tasks')?['body/value']
```
Dentro desse Apply to each:
3.1. Filter array – achar vínculo pelo IDPlanner
Ação: Filter array
From:
body('Get_items')?['value']
Condição em modo avançado (onde consigo usar):
@equals(
string(item()?['IDPlanner']),
string(items('Apply_to_each')?['id'])
)
3.2. Condição — se encontrou vínculo?
Condition:
@greater(length(body('Filter_array')), 0)
Se False: ignora essa tarefa.
Se True:
3.3. Compor — mapear percentComplete → Status do SharePoint
if(
equals(items('Apply_to_each')?['percentComplete'], 0),
'Não Iniciado',
if(
equals(items('Apply_to_each')?['percentComplete'], 50),
'Em Andamento',
'Concluído'
)
)
3.4. Obter item correto na lista Registros de Ajustes
Ação: Get item (SharePoint)
ID:
first(body('Filter_array'))?['IDRegistro']
3.5. Atualizar item na lista Registros de Ajustes
Ação: Update item
ID:
first(body('Filter_array'))?['IDRegistro']
Campo Status = saída do Compose do passo 3.3.
3.6. Atualizar VínculosPlanner
Ação: Update item na lista VínculosPlanner
ID:
first(body('Filter_array'))?['ID']
UltStatusPlanner = items('Apply_to_each')?['percentComplete'] ou já o texto final
UltStatusSharePoint = saída do Compose (texto: Não Iniciado, Em Andamento, Concluído)
Problemas que já enfrentei no Fluxo 3
Quando eu usava duplo loop (Apply to each de tarefas e outro For each de itens do SharePoint), vários registros eram atualizados com o mesmo status, porque eu acabava casando errado ou atualizando itens sem checar o vínculo corretamente.
Quando tentei arrumar com Filter array, em vários testes ele retornava matriz vazia e acabava gerando:
ID nulo no Update item
erros do tipo:
`The 'inputs.parameters' of workflow operation 'Update_item' ... 'id' may not be null or empty.`
Depois passei a usar essa lista de VínculosPlanner para ser mais assertivo, mas ainda não consegui uma solução estável de ponta a ponta (principalmente por causa do Update a task no Fluxo 2).
Diagrama (Fluxo 3):
Recurrence (1 min)
→ List tasks (Planner)
→ Get items (VínculosPlanner)
→ Apply to each (tarefa do Planner)
→ Filter array (VínculosPlanner where IDPlanner == task.id)
→ Condition: length(Filter array) > 0 ?
True:
→ Compose (mapear percentComplete → Status SP)
→ Get item (Registros de Ajustes) [ID = IDRegistro do vínculo]
→ Update item (Registros) [Status = saída do Compose]
→ Update item (VínculosPlanner) [UltStatusPlanner / UltStatusSharePoint]
False:
→ (não faz nada para essa tarefa)
Principais dúvidas / pontos que preciso de ajuda
Fluxo 2 – Update a task (Planner) com BadRequest / ID nulo
Mesmo apontando Task Id = IDtarefaPlanner (campo de texto no SharePoint), às vezes recebo:
`The resolved string values for the following parameters are invalid, they may not be null or empty: 'id'`
ou `BadRequest. Falha ao executar o fluxo.`
A expressão de Progress está assim:
```sql
if(
equals(triggerOutputs()?['body/Status'], 'Não Iniciado'),
'notStarted',
if(
equals(triggerOutputs()?['body/Status'], 'Em Andamento'),
'inProgress',
'completed'
)
)
```
Gostaria de confirmar:
Se há algum requisito extra no conector do Planner para `Update a task`;
Se é obrigatório enviar também `Plan Id` / `Bucket Id` ou algo do tipo;
Se há alguma limitação quando o fluxo está em outro ambiente ou idioma.
**Fluxo 3 – Melhor forma de casar tarefa do Planner com item do SharePoint via lista auxiliar**
A abordagem de usar uma lista `VínculosPlanner` com `IDRegistro` e `IDPlanner` é adequada?
O uso de `Filter array` com:
```sql
@equals(
string(item()?['IDPlanner']),
string(items('Apply_to_each')?['id'])
)
```
é a melhor prática para casar esses dados?
Há algum jeito mais robusto de fazer isso (por exemplo, com “Get item” direto via ODATA, ou outro recurso do conector Planner)?
Sugestões gerais:
Como vocês estruturariam uma sincronização **bidirecional** entre:
Status (Choice) numa lista do SharePoint
Progress (notStarted/inProgress/completed) no Planner
Garantindo:
que só o item correto seja atualizado;
que não haja loop infinito;
que erros de “id nulo” não voltem a acontecer.