In Power Automate è possibile creare un flow con un trigger manuale e poi invocarlo tramite un column formatting.

Può sorgere la necessità di invocare lo stesso flow da più liste o document library, l'approccio classico è quello di duplicare il flow, ma... si può evitare ed ottimizzare.

Sorge quindi la necessità ricavare la url del sito, l'id della lista e dell'item dinamicamente.
Trigger manual
Trigger manual

Trigger input

Prima di tutto vediamo che JSON viene passato quando un flow viene invocato da un pulsante creato con Column formatting.

In ingresso al trigger viene passato un JSON simile a questo:

JSON: List item

{
    "headers": {
        ...
        "origin": "https://tenantName.sharepoint.com",
        ...
    },
    "body": {
        "ID": 1,
        "itemUrl": "https://tenantName.sharepoint.com/sites/DCM2/_layouts/15/listform.aspx?PageType=4&ListId=%7BBDEE3C79-BE50-4279-A5E4-FC49FAEAB3BC%7D&Source=https%3A%2F%2FtenantName.sharepoint.com%2Fsites%2FDCM2%2FLists%2FTest2%2FAllItems.aspx&RootFolder=%2Fsites%2FDCM2%2FLists%2FTest2&ID=1&ContentTypeId=0x010010B9723E86726345A1794FA23C6EB3A800209C5721A5390D42A8AFDBB01637EA2C",
        "fileName": "Titolo item",
        "FileId": "1"
    }
}
Quello che interessa in particolare è nel body la proprietà itemUrl e ID, che può essere ricavata con l'espressione

Power Automate: Variabile ItemUrl

triggerBody()?['itemUrl']
Da notare che il valore contenuto in itemUrl si riferisce ad una lista.
L'ID della lista si trova in query string nel campo ListId.

Nel caso di una document library, il valore di itemUrl cambia e non abbiamo il parametro ListId nella url.

JSON: File item

{
    "headers": {
        ...
        "origin": "https://tenantName.sharepoint.com",
        ...
    },
    "body": {
        "ID": 1,
        "itemUrl": "https://tenantName.sharepoint.com/sites/DCM2/Shared%20Documents/Forms/AllItems.aspx?id=%2Fsites%2FDCM2%2FShared%20Documents%2Ff24%2D2022%2D06%2D13%2D1%2Epng&parent=%2Fsites%2FDCM2%2FShared%20Documents",
        "fileName": "f24-2022-06-13-1.png",
        "FileId": "1"
    }
}

Url site collection

In entrambi i casi quello che possiamo fare e ricavare le url della site collection da cui è stato invocato il flow usando l'espressione:

Power Automate: Variabile SPSiteUrl

substring(variables('ItemUrl'), 0, nthIndexOf(variables('ItemUrl'),'/', if(equals(indexOf(toLower(variables('ItemUrl')), '/sites/'), -1), 3, 5)))
L'espressione verifica se si tratta di una site collection con prefisso /sites/ oppure della root site collection.

ListId

Per l'ID lista è un po' più complicato ma si può fare.
Condition File/Item
Condition File/Item

Come prima cosa va capito se si tratta di un item di una lista oppure di un file in una document library.

Questo lo si può fare controllando la presenza della stringa ListId= nella variabile ItemUrl.

Power Automate: Condition: IsFile

indexOf(variables('ItemUrl'), 'ListId=') is equal to -1

File / Document Library

Nel caso di condizione vera, si tratta di un file, si può procedere in questo modo.

Prima di tutto si ricava url relativa:

Power Automate: Compose: ListRelativePath

slice(variables('ItemUrl'), add(length(variables('SPSiteUrl')),1), indexOf(toLower(variables('ItemUrl')), '/forms/'))
con il path relativo, si può fare una chiamata HTTP alla url per avere l'Id Lista (vti_x005f_listname)

URL

_api/web/GetFolderByServerRelativeURL('/sites/miosito/doclib')/properties?$select=vti_x005f_listname

Power Automate: Send an HTTP: GetListByRelativePath

_api/web/GetFolderByServerRelativeURL('@{outputs('Compose:_ListRelativePath')}')/properties?$select=vti_x005f_listname
salviamo l'Id nella variabile ListId

Power Automate: Set variable: ListId (file)

body('Send_an_HTTP:_GetListByRelativePath')?['vti_x005f_listname']

Questo è un esempio di esecuzione
Esecuzione File
Esecuzione File

Item / Lista

Viceversa, se si tratta di una lista, ricavare il suo Id è più semplice.

Si prende la query string e la si converte in array

Power Automate: Filter array: ItemUrl

split(substring(uriQuery(variables('ItemUrl')), 1), '&')

item() starts with 'ListId='
poi la si salva nella variabile ListId

Power Automate: Set variable: ListId (item)

substring(decodeUriComponent(body('Filter_array:_ItemUrl')?[0]), 8, 36)
Il Guid di una lista è lungo 36 caratteri.

Questo è un esempio di esecuzione
Esecuzione Item
Esecuzione Item

ItemId

Ricavare l'ItemId è semplice viene passato in input al trigger

Power Automate: Initialize variable: ItemId

triggerBody()?['ID']

Query

Avendo tutte e tre le variabili che caratterizzano l'item, ovvero: SiteUrl, ListId e ItemId, si può accedere ai dati:
GetItem con variabili
GetItem con variabili
Tags:
Power Automate28 Column formatting4
Potrebbe interessarti anche: