Odeslání oznámení týmu, když je stav pracovní položky aktualizován v ukázkové aplikaci Milníky
Ukázková aplikace Milníky pro Microsoft Teams umožňuje uživatelům sledovat průběh dokončení pracovních položek v projektech napříč milníky. I když aplikace umožňuje aktualizaci a údržbu pracovních položek, v současné době neexistují žádná standardní oznámení o aktualizacích pracovních položek odesílaná týmu.
V tomto článku se naučíme, jak vytvořit tok Power Automate pro zaslání oznámení týmu (ve kterém je aplikace nainstalována) ve formě adaptivní karty, když se změní stav pracovní položky.
Požadavky
K dokončení tohoto cvičení budeme potřebovat možnost přihlásit se do Teams, které budou k dispozici jako součást vybraných předplatných Microsoftu 365 a také musíme mít nainstalovanou šablonu Power Apps ukázkové aplikace Milníky pro Teams. Tuto aplikaci lze nainstalovat z https://aka.ms/TeamsInspection.
Přihlášení do aplikace Milníky
Vyberte ikonu Power Apps vlevo a přejděte na kartu Sestavit.
V levé nabídce aplikace vyberte tým, ve kterém je nainstalována aplikace Milníky.
Vyberte Nainstalované aplikace a výběrem položky Milníky otevřete aplikaci. Otevře se aplikace Milníky.
Přidání podmínky pro volání toku Power Automate
Ze stromového zobrazení v levém podokně vyberte obrazovku Projekty.
Na obrazovce stiskněte klávesu Alt a výběrem otevřete libovolný jeden projekt. Otevře se obrazovka Přidat/upravit pracovní položku.
Vyberte tlačítko Hotovo.
Vyberte vlastnost OnSelect tlačítka Hotovo.
Při výběru tlačítka Hotovo spolu s dalšími aktualizacemi, které poběží na pozadí, chceme také spustit tok, který by týmu zaslal aktualizaci ve formě adaptivní karty, pokud dojde k aktualizaci stavu pracovní položky. Chcete-li tuto změnu provést, přidejte do horní části vzorce vlastnosti OnSelect následující kód:
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 );Zkopírujte celý kód z vlastnosti OnSelect tlačítka Hotovo a vložte jej do textového editoru pro pozdější použití.
Vyberte tlačítko ... (výpustek) vedle Nastavení na horním pásu karet a vyberte položku Power Automate.
Otevře se vyskakovací dialogové okno Data s možností Vytvořit nový tok.
Vyberte tlačítko Vytvořit nový tok. Otevře se okno prohlížeče s obrazovkou nového toku Power Automate.
Aktualizujte název toku na „Odeslat adaptivní kartu oznámení, když se změní stav pracovního příkazu“.
V seznamu triggerů vyberte možnost, která spustí Power Apps. Vytvoří se nový tok a krok Power Apps se načte na obrazovku.
Vytvoření toku Power Automate
Po provedení kroků v předchozí části vyberte tlačítko kroku +Nový.
Vyberte akci Získat řádek podle ID a vyberte název tabulky Pracovní položky projektu.
V části ID řádku otevřete dynamický obsah a vyberte možnost Zeptat se v Power Apps.
Přejmenujte krok na „Získat záznam pracovní položky“.
Vyberte znovu tlačítko kroku +Nový, vyberte akci Získat řádek podle ID, a vyberte název tabulky Stavy pracovních položek.
V části ID řádku otevřete dynamický obsah a vyberte Stav pracovní položky (hodnota).
Přejmenujte krok na „Získat stav pracovní položky“.
Přidejte další krok výběrem tlačítka +Nový.
Přidejte akci Inicializovat proměnnou.
Přejmenujte krok na Inicializovat proměnnou - Název karty
Název - "varCardTitle"
Typ - Řetězec
Hodnota - aktualizace stavu pro pracovní položku {a poté vyberte dynamický obsah Název pracovní položky přidaný v kroku 3}
Přidejte další krok výběrem tlačítka +Nový.
Přidejte akci Inicializovat proměnnou.
- Přejmenujte krok na Inicializovat proměnnou - Odkaz na recenzi
- Název - "varReviewWorkItemLink"
- Typ - Řetězec
- Hodnota - nechte prázdné - bude přidána později.
Poznámka
Po přidání nového kroku se vám v nástroji pro kontrolu toku může zobrazit varování. Toto varování se očekává, protože tok je volán z aplikace Power Apps a přidání nového kroku do toku volaného z aplikace Power Apps může přerušit spojení s aplikací. Později ve cvičení nahradíme připojení k toku, abychom toto varování opravili.
U akce Zkontrolovat odkaz na pracovní položku použijeme odkaz na aplikaci. Chcete-li najít tento odkaz, otevřete tým, kde je nainstalována aplikace Milníky, a zkopírujte odkaz na kartu, na které je aplikace nainstalována. Odkaz na kartu můžete zkopírovat otevřením karty a výběrem tlačítka ... (výpustku) v pravém horním rohu.
Vaše adresa URL by měla vypadat podobně jako následující příklad:
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=GUIDChcete-li pokračovat, zkopírujte část adresy URL, která následuje za částí context= a k dekódování adresy URL použijte dekodér, například https://www.urldecoder.org/.
Zkopírujte dekódovaný text a vraťte se do toku Power Automate.
Návrat k kroku Inicializace proměnné - Kontrola odkazu na pracovní položku.
Nastavte pole Hodnota na dekódovaný text adresy URL zkopírovaný dříve.
Přidejte nový krok s akcí Vytvořit a v poli Vstupy vložte následující fragment.
replace(replace(replace(variables('varReviewWorkItemLink'),'{','%7B'),'"','%22'),'}','%7D')Přidejte další krok výběrem tlačítka +Nový krok.
Výběr akce Odeslání adaptivní karty v chatu nebo kanálu (Preview).
Publikovat jako - uživatel
Publikovat v - Kanál
Tým - {tým, ve kterém je vaše aplikace nainstalována}
Kanál - Obecný
Adaptivní karta - vložte následující kód JSON:
Poznámka
Následující kód JSON obsahuje dynamické odkazy na hodnoty z předchozích kroků toku. Ty by se měly automaticky vyřešit na správný odkaz, ale pokud se tak nestane, aktualizujte je ručně správným odkazem. Například @{outputs('Get_Work_Item_Status_record')?['body/msft_name']} odkazuje na sloupec názvu v kroku Získat stav položky práce.
{ "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" }
Uložte tok.
Spuštění toku z Power Apps
Po uložení toku se vraťte zpět do Teams a otevřete aplikaci v Power Apps.
Ve stromovém zobrazení vyberte obrazovku Přidat/upravit pracovní položku.
Vyberte tlačítko Aktualizovat.
Aktualizujte vlastnost OnSelect, aby bylo zajištěno spuštění toku.
Zkopírujte do vlastnosti OnSelect vzorec z místa, kam jste jej dříve vložili.
V první podmínce If, která byla přidána na začátek, nahraďte „true“ běhovou funkcí použitou ke spuštění spouštěče toku. Viz příklad níže.
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
Aktualizace obrazovky Načítání
Ve stromovém zobrazení vyberte Obrazovka načítání.
Rozbalte obrazovku načítání a poté uzel conLoading_HiddenHelper v ní.
Vyberte časovač tmrLoadingDelay a vyberte vlastnost OnTimerEnd.
Pokud je aplikace otevřena prostřednictvím odkazu v adaptivní kartě, měla by přímo otevřít záznam pracovní položky, který byl aktualizován, což znamená, že potřebujeme způsob, jak zkontrolovat, zda je do aplikace předáváno ID pracovní položky.
Vzorec stránky Načítání je třeba aktualizovat, aby zahrnoval číslo pracovní položky, takže musíme aktualizovat vlastnost OnTimerEnd na následující kód:
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 } ) ) ) )
Publikování aplikace Milníky
Všechny změny v aplikaci Milníky jsou dokončeny. Aplikaci lze nyní publikovat výběrem tlačítka Publikovat do Teams vpravo nahoře.
Testování toku Power Automate
Přejděte do Teams a otevřete aplikaci Milníky.
Otevřete stávající pracovní položku a aktualizujte stav na jinou hodnotu.
V kanálu Teams, kde je aplikace nainstalována, je přijato oznámení ve formě adaptivní karty.
Viz také
- Nasazení ukázkové aplikace Milníky v široké distribuci
- Přizpůsobení ukázkové aplikace Milníky
- Principy architektury ukázkové aplikace Milníky
- Přizpůsobení ukázkových aplikací
- Často kladené dotazy k ukázkovým aplikacím
- Použití ukázkových aplikací z obchodu Microsoft Teams
Poznámka
Můžete nám sdělit, jaké máte jazykové preference pro dokumentaci? Zúčastněte se krátkého průzkumu. (upozorňujeme, že tento průzkum je v angličtině)
Průzkum bude trvat asi sedm minut. Nejsou shromažďovány žádné osobní údaje (prohlášení o zásadách ochrany osobních údajů).
Váš názor
Odeslat a zobrazit názory pro