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 manualTrigger 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/ItemCondition 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 FileEsecuzione 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 ItemEsecuzione 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 variabiliGetItem con variabili
Potrebbe interessarti anche: