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 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:
{
"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
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.
{
"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:
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/ItemCome 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.
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:
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)
_api/web/GetFolderByServerRelativeURL('/sites/miosito/doclib')/properties?$select=vti_x005f_listname
_api/web/GetFolderByServerRelativeURL('@{outputs('Compose:_ListRelativePath')}')/properties?$select=vti_x005f_listname
salviamo l'Id nella variabile
ListIdbody('Send_an_HTTP:_GetListByRelativePath')?['vti_x005f_listname']
Questo è un esempio di esecuzione
Esecuzione FileItem / Lista
Viceversa, se si tratta di una
lista, ricavare il suo Id è più semplice.
Si prende la
query string e la si converte in
arraysplit(substring(uriQuery(variables('ItemUrl')), 1), '&')
item() starts with 'ListId='
poi la si salva nella variabile
ListId substring(decodeUriComponent(body('Filter_array:_ItemUrl')?[0]), 8, 36)
Il Guid di una lista è lungo 36 caratteri.
Questo è un esempio di esecuzione
Esecuzione ItemItemId
Ricavare l
'ItemId è semplice viene passato in input al trigger
Query
Avendo tutte e tre le variabili che caratterizzano l'item, ovvero:
SiteUrl,
ListId e
ItemId, si può accedere ai dati:
GetItem con variabili