Pošiljanje obvestila ekipi, ko je v vzorčni aplikaciji Mejniki posodobljeno stanje delovne naloge

Vzorčna aplikacija Mejniki za Microsoft Teams uporabnikom omogoča, da v mejnikih spremljajo napredek glede dokončanja delovnih nalog v okviru projektov. Čeprav aplikacija omogoča posodobitev in ohranitev delovnih nalog, trenutno za ekipe ne obstajajo standardna obvestila o posodobitvi delovnih nalog.

Ta članek vsebuje navodila, kako ustvariti tok storitve Power Automate za pošiljanje obvestila o prilagodljivi kartici ekipi (v kateri je aplikacija nameščena) takrat, ko se stanje delovne naloge spremeni.

Zahteve

Če želite dokončati to vajo, potrebujete dovoljenje za prijavo v storitev Teams, ki bo omogočeno v sklopu izbrane naročnine za Microsoft 365, prav tako pa morate namestiti predlogo aplikacije Mejniki storitve Power Apps za storitev Teams. To aplikacijo je mogoče namestiti iz https://aka.ms/TeamsInspection.

Prijava v aplikacijo Mejniki

  1. Izberite ikono Power Apps na levi strani in se pomaknite na zavihek »Graditev«.

  2. V meniju aplikacije na levi strani izberite ekipo, v kateri je nameščena aplikacija Mejniki.

  3. Najprej izberite možnost Nameščene aplikacije, nato pa možnost Mejniki ter tako odprite aplikacijo. Aplikacija Mejniki se odpre.

Dodajanje pogoja za klic toka storitve Power Automate

  1. V drevesnem pogledu levega podokna izberite zaslon Projekti.

  2. Pritisnite tipko Alt na zaslonu in izberite možnost odpiranja katerega koli projekta. Odre se zaslon »Dodajanje/urejanje delovne naloge«.

  3. Izberite gumb Dokončaj.

  4. Izberite lastnost OnSelect gumba »Dokončaj«.

  5. Poleg izbire gumba Dokončaj in drugih posodobitev, ki se izvajajo v ozadju, je pomembno tudi, da sprožite tok, ki bo ekipi v primeru posodobitve stanja delovne naloge poslal posodobitev prilagodljive kartice. Če želite izvršiti to spremembo, na vrh formule OnSelect dodajte naslednje:

    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. Iz lastnosti OnSelect gumba Dokončaj kopirajte celotno kodo in jo prilepite v urejevalnik besedila, saj jo boste pozneje potrebovali.

  7. Najprej izberite ... (tri pike) zraven možnosti Nastavitve v zgornjem traku, nato pa Power Automate.

  8. Odpre se pojavno okno Podatki z možnostjo za Ustvarjenje novega toka.

  9. Izberite gumb Ustvarjenje novega toka. Odpre se okno brskalnika z novim zaslonom toka storitve Power Automate.

  10. Ime toka posodobite na »Pošiljanje obvestila o prilagodljivi kartici ob spremembi stanja delovnega naloga«.

  11. Na seznamu sprožilcev izberite možnost Power Apps. Ustvari se nov tok, na zaslonu pa se naloži korak storitve Power Apps.

Ustvarjanje toka storitve Power Automate

  1. Ko končate s koraki iz prejšnjega razdelka, izberite gumb za +Nov korak.

  2. Izberite dejanje Pridobivanje vrstice z ID-jem, nato pa za ime tabele določite Projektne delovne naloge.

  3. Pod ID-jem vrstice odprite dinamično vsebino in izberite možnost Vprašaj v storitvi Power Apps.

  4. Korak preimenujte v »Pridobivanje zapisa delovne naloge«.

  5. Ponovno izberite gumb za +Naslednji korak, izberite dejanje Pridobivanje vrstice z ID-jem, nato pa za ime tabele določite Stanja delovnih nalog.

  6. Pod ID-jem vrstice odprite dinamično vsebino in izberite Stanje delovne naloge (vrednost).

  7. Korak preimenujte v »Pridobivanje zapisa stanja delovne naloge«.

  8. Dodajte nov korak, in sicer tako, da izberete +Nov korak.

  9. Dodajte dejanje »Inicializacija spremenljivke«.

    • Korak preimenujte v »Inicializacija spremenljivke – naslov kartice«

    • Ime – »varCardTitle«

    • Vrsta – »niz«

    • Vrednost = posodobitev stanja za delovno nalogo {in izbira imena dinamične vsebine za delovno nalogo, dodano v 3. koraku}

  10. Dodajte nov korak, in sicer tako, da izberete +Nov korak.

  11. Dodajte dejanje »Inicializacija spremenljivke«.

    • Korak preimenujte v »Inicializacija spremenljivke – pregled povezave«
    • Ime – »varReviewWorkItemLink«
    • Vrsta – »niz«
    • Vrednost – pustite prazno – bo dodana pozneje.

    Opomba

    Ko dodate nov korak, se vam bo v preverjevalniku toka morda prikazalo opozorilo. To opozorilo je pričakovano, ker je tok priklican iz aplikacije Power Apps, dodajanje novega koraka v tok, priklican iz aplikacije Power Apps, pa lahko prekine povezavo z aplikacijo. V naslednjih korakih te vaje bomo zamenjali povezavo do toka in tako odpravili opozorilo.

  12. Za dejanje Pregled povezave delovne naloge bomo uporabili povezavo do aplikacije. To povezavo najdete tako, da odprete ekipo, v katero je nameščena aplikacija Mejniki, in kopirate povezavo do zavihka, na katerem je nameščena aplikacija. Povezavo do zavihka lahko kopirate tako, da odprete zavihek in v zgornjem desnem kotu izberete ... (tri pike).

    Vaš URL bo videti nekako tako:

    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. Če želite nadaljevati, kopirate del URL-ja, ki se nahaja za elementom context=, in za dekodiranje URL-ja uporabite dekodirnik URL-ja, kot je https://www.urldecoder.org/.

  14. Kopirajte besedilo, ki ste ga dekodirali, in se vrnite v tok storitve Power Automate.

  15. Vrnite se k možnosti »Inicializacija spremenljivke – korak za pregled povezave delovne naloge«.

  16. Polje »Vrednost« nastavite na besedilo dekodiranega URL-ja, ki ste ga kopirali v prejšnjih korakih.

  17. Dodajte nov korak z dejanjem Sestavljanje in v polje Vnosi prilepite naslednji izrezek.

    replace(replace(replace(variables('varReviewWorkItemLink'),'{','%7B'),'"','%22'),'}','%7D')
    
  18. Dodajte dodaten korak, in sicer tako, da izberete Nov korak.

  19. Izberite dejanje »Objava prilagodljive kartice v klepetu ali kanalu (predogledna različica)«.

    • Objavi kot – uporabnik

    • Objavi v – kanal

    • Ekipa – {ekipa, v kateri je nameščena vaša aplikacija}

    • Kanal – splošno

    • Prilagodljiva kartica – prilepite naslednjo kodo JSON:

      Opomba

      Koda JSON, ki je navedena v nadaljevanju, vsebuje dinamične sklice na vrednosti iz prejšnjih korakov toka. Ti bi se morali samodejno razrešiti v ustrezen sklic, če se ne, pa jih ročno posodobite z ustreznim sklicem. Element @{'(Get_Work_Item_Status_record')?['body/msft_name']} npr. vsebuje sklice na stolpec z imenom iz koraka »Pridobivanje zapisa stanja delovne naloge«.

      {
                  "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. Shranite potek.

Sprožitev toka iz storitve Power Apps

  1. Ko je tok shranjen, se vrnite v Teams in aplikacijo odprite v storitvi Power Apps.

  2. V drevesnem pogledu izberite zaslon Dodajanje/urejanje delovne naloge.

  3. Izberite gumb Posodobi.

  4. Posodobite lastnost OnSelect, saj boste s tem zagotovili, da je tok sprožen.

  5. Formulo kopirajte z mesta, na katerega ste jo v prejšnjih korakih prilepili v lastnost OnSelect.

  6. V prvem pogoju »če«, ki je bil dodan na vrh, element »true« zamenjajte z zagnano funkcijo, uporabljeno za sprožitev toka. Glejte spodnji primer.

    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
    

Posodobitev zaslona za nalaganje

  1. V drevesnem pogledu izberite možnost Zaslon za nalaganje.

  2. Razširite zaslon za nalaganje in pod njim izvedite conLoading_HiddenHelper.

  3. Najprej izberite časovnik tmrLoadingDelay, nato pa lastnost OnTimerEnd.

  4. Če je aplikacija odprta s pomočjo povezave prilagodljive kartice, bi morala neposredno odpreti zapis delovne naloge, ki je bil posodobljen, kar pomeni, da je potreben način, kako preveriti, ali je bil ID delovne naloge posredovan aplikaciji.

  5. Formulo strani za nalaganje je treba posodobiti, da bo vanjo vključena številka delovne naloge, zato je treba lastnost OnTimerEnd posodobiti na naslednjo možnost:

    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
                    } 
                )
            )
        )
    )
    
    

Objava aplikacije Mejniki

Izvršene so bile vse spremembe za aplikacijo Mejniki. Aplikacijo je zdaj mogoče objaviti z izbiro gumba »Objava v aplikaciji Teams« zgoraj desno.

Preizkus toka storitve Power Automate

  1. Pojdite v storitev Teams in odprite aplikacijo Mejniki.

  2. Odprite obstoječo delovno nalogo in stanje posodobite na drugo vrednost.

  3. V kanalu storitve Teams, v katerega je nameščena aplikacija, je prikazano obvestilo o prilagodljivi kartici.

Glejte tudi

Opomba

Ali nam lahko poveste, kateri je vaš prednostni jezik za dokumentacijo? Izpolnite kratko anketo. (upoštevajte, da je v angleščini)

Z anketo boste porabili približno sedem minut. Ne zbiramo nobenih osebnih podatkov (izjava o zasebnosti).