Enviar notificação para a equipe quando o status do item de trabalho for atualizado no aplicativo de amostra Etapas

O aplicativo de exemplo Etapas para Microsoft Teams permite que os usuários acompanhem o andamento da conclusão dos itens de trabalho em projetos em todos os marcos. Embora o aplicativo permita que itens de trabalho sejam atualizados e mantidos, atualmente não há notificações padrão sobre atualizações de itens de trabalho para a equipe.

Neste artigo, aprenderemos como criar um fluxo do Power Automate para enviar uma notificação de cartão adaptável para a equipe (na qual o aplicativo está instalado) quando o status do item de trabalho muda.

Assista a este vídeo para aprender como configurar a notificação para a Equipe quando o status do item de trabalho é atualizado no aplicativo de exemplo Etapas:

Pré-requisitos

Para concluir este exercício, precisaríamos da capacidade de entrar no Teams que estará disponível como parte da seleção de assinaturas do Microsoft 365 e também do modelo Etapas do Power Apps para o Teams instalado. Este aplicativo pode ser instalado a partir de https://aka.ms/TeamsInspection.

Faça logon no aplicativo Etapas

  1. Selecione o ícone do Power Apps no painel esquerdo e vá para a guia Criar.

  2. Selecione a Equipe na qual o aplicativo Etapas está instalado no menu de aplicativos esquerdo.

  3. Selecione Aplicativos instalados e, em seguida, selecione Etapas para abrir o aplicativo. O aplicativo Etapas é aberto.

Adicione condição para chamar o fluxo do Power Automate

  1. No modo de exibição de árvore no painel esquerdo, selecione a tela Projetos.

  2. Na tela, pressione a tecla Alt e selecione para abrir qualquer projeto. A tela Adicionar/Editar Item de Trabalho é aberta.

  3. Selecione o botão Concluído.

  4. Selecione a propriedade OnSelect do botão concluído.

  5. Ao selecionar o botão Concluído, juntamente com as outras atualizações executadas em segundo plano, também queremos acionar um fluxo que enviaria uma atualização de cartão adaptável para a equipe se o status do item de trabalho fosse atualizado. Para fazer essa alteração, adicione o seguinte à parte superior da fórmula OnSelect:

    If(
    
        locEditWorkItem,
    
        //adding code to call a flow when status changes
    
            If(
    
                locSelectedWorkItem.'Work Item Status'.'Project Work Item Status' \<\>
                cmbAddWorkItemStatus.Selected.'Project Work Item Status',
    
        true //your flow call will come here
    
    ); 
    
  6. Copie todo o código da propriedade OnSelect do botão Concluído e cole-o em um editor de texto para uso posterior.

  7. Selecione o botão ... (reticências) ao lado de Configurações na faixa de opções superior e selecione Power Automate.

  8. O pop-up Dados é aberto com a opção de Criar um novo fluxo.

  9. Selecione o botão Criar um novo fluxo. Uma janela do navegador é aberta com a tela do novo fluxo do Power Automate.

  10. Atualize o nome do fluxo para - "Enviar notificação de cartão adaptável quando o status da ordem de serviço mudar".

  11. Selecione a opção para disparar o Power Apps da lista de gatilhos. O novo fluxo é criado e a etapa do Power Apps é carregada na tela.

Criar o fluxo do Power Automate

  1. Depois de seguir as etapas da seção anterior, selecione o botão de etapa + Novo.

  2. Selecione a ação Obter uma linha por ID e selecione Nome da Tabela como Itens de Trabalho do Projeto.

  3. Em ID da LInha, abra o conteúdo dinâmico e selecione a opção Perguntar no Power Apps.

  4. Renomeie a etapa para "Obter registro do Item de Trabalho".

  5. Selecione o botão de etapa +Avançar novamente e selecione a ação Obter uma linha por ID e selecione o nome da tabela como Status do Item de Trabalho.

  6. Em ID da Linha, abra o conteúdo dinâmico, selecione Status do Item de Trabalho (Valor).

  7. Renomeie a etapa para Obter registro do Status do Item de Trabalho.

  8. Adicione outra etapa selecionando a etapa +Novo.

  9. Adicione a ação Inicializar variável.

    • Renomeie a etapa para Inicializar variável – "Título do Cartão"

    • Nome – "varCardTitle"

    • Tipo – "cadeia de caracteres"

    • Valor = atualização de status para o Item de Trabalho {e selecione o nome do conteúdo dinâmico do Item de Trabalho adicionado na etapa 3}

  10. Adicione outra etapa selecionando a etapa +Novo.

  11. Adicione a ação Inicializar variável.

    • Renomeie a etapa para a Inicializar variável – Revisar Link
    • Nome – "varReviewWorkItemLink"
    • Tipo – "cadeia de caracteres"
    • Valor – deixe em branco – será adicionado mais tarde.

    Observação

    Depois de adicionar uma nova etapa, poderá ser mostrado um aviso no verificador de fluxo. Esse aviso é esperado porque o fluxo é chamado de um aplicativo Power Apps, e adicionar uma nova etapa a um fluxo chamado de um aplicativo Power Apps pode interromper a conexão com o aplicativo. Posteriormente no exercício, substituiremos a conexão com o fluxo para corrigir esse aviso.

  12. Para a ação Revisar Link do Item de Trabalho, usaremos o link para o aplicativo. Para encontrar esse link, abra a equipe onde o aplicativo Etapas está instalado e copie o link para a guia na qual o aplicativo está instalado. Você pode copiar o link para a guia abrindo a guia e selecionando ... (reticências) no canto superior direito.

    A URL deverá ser semelhante ao seguinte exemplo:

    https://teams.microsoft.com/l/entity/GUID/_djb2_msteams_prefix_956529380?context=%7B%22subEntityId%22%3Anull%2C%22channelId%22%3A%2219%3AGUID%40thread.tacv2%22%7D&groupId=GUID&tenantId=GUID

  13. Para continuar, copie a parte da URL que vem depois de context= e use um decodificador de URL, como https://www.urldecoder.org/, para decodificar a URL.

  14. Copie esse texto decodificado e volte para o fluxo do Power Automate.

  15. Retornar à variável Initialize – etapa Revisar Link de Item de Trabalho.

  16. Defina o campo Valor para o texto de URL decodificado copiado anteriormente.

  17. Adicione uma nova etapa com a ação Redigir e, no campo Entradas, cole o seguinte trecho.

    replace(replace(replace(variables('varReviewWorkItemLink'),'{','%7B'),'"','%22'),'}','%7D')
    
  18. Adicione outra etapa selecionando +Nova etapa.

  19. Selecione a ação Postar cartão adaptável em um chat ou canal (versão preliminar).

    • Postar como – Usuário

    • Postar em – Canal

    • Equipe – {a equipe em que seu aplicativo está instalado}

    • Canal – Geral

    • Cartão Adaptável – cole o código JSON a seguir:

      Observação

      O código JSON a seguir contém referências dinâmicas para valores das etapas anteriores do fluxo. Eles devem resolver automaticamente para a referência correta. Mas, se não resolverem, atualize-os manualmente com a referência correta. Por exemplo, @{outputs('Get_Work_Item_Status_record')?['body/msft_name']} faz referência à coluna de nome da etapa Obter Status do Item de Trabalho.

      {
                  "type": "AdaptiveCard",
                  "body": [
                  {
      
                         "type": "TextBlock",
      
             "size": "large",
      
             "weight": "Bolder",
      
             "text": "Status Update for
             @{outputs('Get_Work_Item_record')?['body/msft_name']}",
      
             "wrap": true
      
             },
      
             {
      
             "type": "TextBlock",
      
             "text": "Status for Work Item
             '@{outputs('Get_Work_Item_record')?['body/msft_name']}' has been updated to
             @{outputs('Get_Work_Item_Status_record')?['body/msft_name']}",
      
             "wrap": true
      
             }
      
             ],
      
             "actions": [
      
             {
      
             "type": "Action.OpenUrl",
      
             "title": "View @{variables('varCardTitle')}",
             //Update the part of the following URL before "context=" with the URL copied in step 12. 
             "url":
             "[https://teams.microsoft.com/l/entity/040880f4-0c68-4c38-8821-d5efd2b6ddbe/_djb2_msteams_prefix_956529380?context=@{outputs('Compose](https://teams.microsoft.com/l/entity/040880f4-0c68-4c38-8821-d5efd2b6ddbe/_djb2_msteams_prefix_956529380?context=@%7boutputs('Compose)')}"
      
             }
      
             ],
      
             "$schema": "<http://adaptivecards.io/schemas/adaptive-card.json>",
      
             "version": "1.2"
      
             }
      
  20. Salve o fluxo.

Disparar o fluxo do Power Apps

  1. Depois que o fluxo for salvo, volte para o Teams e abra o aplicativo no Power Apps.

  2. No modo de exibição de árvore, selecione a tela Adicionar/Editar Item de Trabalho.

  3. Selecione o botão Atualizar.

  4. Atualize a propriedade OnSelect para garantir que o fluxo seja disparado.

  5. Copie a fórmula de onde você a colou anteriormente na propriedade OnSelect.

  6. Na primeira condição If adicionada na parte superior, substitua "verdadeiro" pela função de execução usada para disparar o gatilho de fluxo. Veja o exemplo abaixo.

    If(
    
    locEditWorkItem,
    
    //adding code to call a flow when status changes
    
    If(
    
    locSelectedWorkItem.'Work Item Status'.'Project Work Item Status' \<\>
    cmbAddWorkItemStatus.Selected.'Project Work Item Status',
    SendAdaptivecardnotificationwhenthestatusoftheworkorderchanges.Run(locSelectedWorkItem.'Project Work item') //your flow call will come here
    
    );
    
    //end code
    

Atualizar a tela de carregamento

  1. No modo de exibição de árvore, selecione a Tela de Carregamento.

  2. Expanda a tela de carregamento e depois conLoading_HiddenHelper embaixo dela.

  3. Selecione o timer tmrLoadingDelay e selecione a propriedade OnTimerEnd.

  4. Se o aplicativo for aberto por meio do link do cartão adaptável, ele deve abrir diretamente o registro do item de trabalho que foi atualizado, o que significa que precisaríamos de uma maneira de verificar se uma ID do item de trabalho está sendo passada para o aplicativo.

  5. A fórmula da página de carregamento precisa ser atualizada para incluir o número do Item de Trabalho, então precisamos atualizar a propriedade OnTimerEnd para o seguinte:

    If(
        gblAppLoaded,// && !IsBlankOrError(gblAppStyles),
        If(
            !IsBlank(Param("subEntityId")), //check if the parameter is blank or not
            If( //if the parameter is not blank, check if the user is on a mobile device or desktop/web and then populate the relevant variables and collections to make deep linking work
                (!IsBlank(Param("hostClientType")) && (Param("hostClientType") = "android" Or Param("hostClientType") = "ios")) || (IsBlank(Param("hostClientType")) && (Acceleration.X > 0 || Acceleration.Y > 0 || Acceleration.Z > 0)) Or tglAdmin_Mobile.Value, 
                //project cover colors
                ClearCollect(
                    colMobileProjectCoverColors,
                    {
                        Color: "#F4B9B9",
                        Theme: "default",
                        Base: "Color1"
                    },
                    {
                        Color: "#94BFFF",
                        Theme: "default",
                        Base: "Color2"
                    },
                    {
                        Color: "#E6F0FF",
                        Theme: "default",
                        Base: "Color3"
                    },
                    {
                        Color: "#5AC6CC",
                        Theme: "default",
                        Base: "Color4"
                    },
                    {
                        Color: "#C5E9EA",
                        Theme: "default",
                        Base: "Color5"
                    },
                    {
                        Color: "#F0F9FA",
                        Theme: "default",
                        Base: "Color6"
                    },
                    {
                        Color: "#EE6F99",
                        Theme: "default",
                        Base: "Color7"
                    },
                    {
                        Color: "#F495BF",
                        Theme: "default",
                        Base: "Color8"
                    },
                    {
                        Color: "#F4D2DC",
                        Theme: "default",
                        Base: "Color9"
                    },
                    {
                        Color: "#CEF0CD",
                        Theme: "default",
                        Base: "Color10"
                    },
                    {
                        Color: "#BDBDE6",
                        Theme: "default",
                        Base: "Color11"
                    },
                    {
                        Color: "#E2E2F6",
                        Theme: "default",
                        Base: "Color12"
                    },
                    {
                        Color: "#F4F4FC",
                        Theme: "default",
                        Base: "Color13"
                    },
                    {
                        Color: "#FBF6D9",
                        Theme: "default",
                        Base: "Color14"
                    },
                    {
                        Color: "#791818",
                        Theme: "dark",
                        Base: "Color1"
                    },
                    {
                        Color: "#053385",
                        Theme: "dark",
                        Base: "Color2"
                    },
                    {
                        Color: "#6264A7",
                        Theme: "dark",
                        Base: "Color3"
                    },
                    {
                        Color: "#002F31",
                        Theme: "dark",
                        Base: "Color4"
                    },
                    {
                        Color: "#025C5F",
                        Theme: "dark",
                        Base: "Color5"
                    },
                    {
                        Color: "#03787C",
                        Theme: "dark",
                        Base: "Color6"
                    },
                    {
                        Color: "#461525",
                        Theme: "dark",
                        Base: "Color7"
                    },
                    {
                        Color: "#CC3D6D",
                        Theme: "dark",
                        Base: "Color8"
                    },
                    {
                        Color: "#EA5788",
                        Theme: "dark",
                        Base: "Color9"
                    },
                    {
                        Color: "#043615",
                        Theme: "dark",
                        Base: "Color10"
                    },
                    {
                        Color: "#33344A",
                        Theme: "dark",
                        Base: "Color11"
                    },
                    {
                        Color: "#6264A7",
                        Theme: "dark",
                        Base: "Color12"
                    },
                    {
                        Color: "#464775",
                        Theme: "dark",
                        Base: "Color13"
                    },
                    {
                        Color: "#FFAA44",
                        Theme: "dark",
                        Base: "Color14"
                    }
                );
    
    //local table of character widths, used for auto width labels
    ClearCollect(
                    colMobileCharsWidth,
                    staticCharWidths
                );
    
    //stock project cover images
    ClearCollect(
                    colMobileStockImages,
                    {appStockImage: Blank()},
                    {appStockImage: ProjectCover_Future},
                    {appStockImage: ProjectCover_Work},
                    {appStockImage: ProjectCover_Shapes},
                    {appStockImage: ProjectCover_Design},
                    {appStockImage: ProjectCover_Flow},
                    {appStockImage: ProjectCover_Abstract},
                    {appStockImage: ProjectCover_Mountain},
                    {appStockImage: ProjectCover_Vision},
                    {appStockImage: ProjectCover_DarkShapes},
                    {appStockImage: ProjectCover_Morning},
                    {appStockImage: ProjectCover_Sublime},
                    {appStockImage: ProjectCover_Tech},
                    {appStockImage: ProjectCover_Neon},
                    {appStockImage: ProjectCover_City}
                );
                Set(
                    gblMobileProject,
                    LookUp(
                        'Project Work Items',
                        'Project Work item' = GUID(Param("subEntityId"))
                    ).Project
                );
                ClearCollect(
                    colMobileWorkItems,
                    Filter(
                        'Project Work Items',
                        Project.Project = gblMobileProject.Project
                    )
                );
                UpdateContext(
                    {
                        locMobileCompletionStatus: First(
                            Sort(
                                'Project Work Item Statuses',
                                Sequence,
                                Ascending
                            )
                        )
                    }
                );
                Clear(colMobileWorkItemStatuses);
                ForAll(
                    Sort(
                        Filter(
                            'Project Work Item Statuses',
                            'Project Work Item Status' <> locMobileCompletionStatus.'Project Work Item Status'
                        ),
                        Sequence,
                        Ascending
                    ),
                    Collect(
                        colMobileWorkItemStatuses,
                        {
                            Name: ThisRecord.Name,
                            Color: ThisRecord.Color,
                            'Color Dark': ThisRecord.'Color Dark',
                            'Project Work Item Status': ThisRecord.'Project Work Item Status',
                            Sequence: ThisRecord.Sequence
                        }
                    )
                );
                Collect(
                    colMobileWorkItemStatuses,
                    {
                        Name: locMobileCompletionStatus.Name,
                        Color: locMobileCompletionStatus.Color,
                        'Color Dark': locMobileCompletionStatus.'Color Dark',
                        'Project Work Item Status': locMobileCompletionStatus.'Project Work Item Status',
                        Sequence: locMobileCompletionStatus.Sequence
                    }
                );
                Navigate(
                    'Mobile Work Item Details Screen',
                    ScreenTransition.None,
                    {
                        locMobileSelectedWorkItem: LookUp(
                            'Project Work Items',
                            'Project Work item' = GUID(Param("subEntityId"))
                        ),
                        locMobileShowWorkItemDetail: true,
                        locMobileShowSearchWorkItem: false,
                        locMobileNavToDetailFromAbout: true
                    }
                ),
                Set(
                    gblProject,
                    LookUp(
                        'Project Work Items',
                        'Project Work item' = GUID(Param("subEntityId"))
                    ).Project
                );
                UpdateContext(
                    {
                        locCompletionStatus: First(
                            Sort(
                                'Project Work Item Statuses',
                                Sequence,
                                Ascending
                            )
                        )
                    }
                );
                Clear(colWorkItemStatuses);
                ForAll(
                    Sort(
                        Filter(
                            'Project Work Item Statuses',
                            'Project Work Item Status' <> locCompletionStatus.'Project Work Item Status'
                        ),
                        Sequence,
                        Ascending
                    ),
                    Collect(
                        colWorkItemStatuses,
                        {
                            Name: ThisRecord.Name,
                            Color: ThisRecord.Color,
                            'Color Dark': ThisRecord.'Color Dark',
                            'Project Work Item Status': ThisRecord.'Project Work Item Status',
                            Sequence: ThisRecord.Sequence
                        }
                    )
                );
                Collect(
                    colWorkItemStatuses,
                    {
                        Name: locCompletionStatus.Name,
                        Color: locCompletionStatus.Color,
                        'Color Dark': locCompletionStatus.'Color Dark',
                        'Project Work Item Status': locCompletionStatus.'Project Work Item Status',
                        Sequence: locCompletionStatus.Sequence
                    }
                );
                Navigate(
                    'Add/Edit Work Item',
                    ScreenTransition.None,
                    {
                        locEditWorkItem: true,
                        locSelectedWorkItem: LookUp(
                            'Project Work Items',
                            'Project Work item' = GUID(Param("subEntityId"))
                        ),
                        locAddProject: false,
                        locExpandProjectList: true,
                        locProjectSortOrder: true,
                        locSortWorkItemBy: "eta",
                        locShowSearchWorkItem: false,
                        locAddWorkItem: false,
                        locProjectStatusSelection: "Milestone status",
                        locWorkItemSortOrder: true
                    }
                )
            ),
            If( //if the parameter is blank, check if the user is on a mobile device or desktop/web and redirect the user accordingly 
                (!IsBlank(Param("hostClientType")) && (Param("hostClientType") = "android" Or Param("hostClientType") = "ios")) || (IsBlank(Param("hostClientType")) && Acceleration.X > 0) Or tglAdmin_Mobile.Value,
                Navigate(
                    'Mobile Projects Screen',
                    ScreenTransition.None
                ),
                Navigate(
                    'Projects Screen',
                    ScreenTransition.None,
                    {
                        locShowFirstRun: gblFirstRun,
                        locShowPowerAppsPrompt: gblRecordUserSettings.'Display Splash (Power Apps)' = 'Display Splash (Power Apps) (Project User Settings)'.Yes
                    } 
                )
            )
        )
    )
    
    

Publicar o aplicativo Etapas

Todas as alterações no aplicativo Etapas foram concluídas. O aplicativo agora pode ser publicado selecionando o botão Publicar para o Teams no canto superior direito.

Testar o fluxo do Power Automate

  1. Vá para o Teams e abra o aplicativo Etapas.

  2. Abra um item de trabalho existente e atualize o Status para um valor diferente.

  3. Uma notificação do Cartão Adaptável é recebida no canal do Teams onde o aplicativo está instalado.

Consulte também

Observação

Você pode nos falar mais sobre suas preferências de idioma para documentação? Faça uma pesquisa rápida. (Observe que esta pesquisa está em inglês)

A pesquisa levará cerca de sete minutos. Nenhum dado pessoal é coletado (política de privacidade).