Ricavare l'Id della lista SharePoint in Power Automate (trigger)
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.
In ingresso al trigger viene passato un JSON simile a questo:
Quello che interessa in particolare è nel body la proprietà itemUrl e ID, che può essere ricavata con l'espressione
Nel caso di una document library, il valore di itemUrl cambia e non abbiamo il parametro ListId nella url.
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.
Prima di tutto si ricava url relativa:
con il path relativo, si può fare una chiamata HTTP alla url per avere l'Id Lista (vti_x005f_listname)
salviamo l'Id nella variabile ListId
Questo è un esempio di esecuzione
Si prende la query string e la si converte in array
poi la si salva nella variabile ListId
Questo è un esempio di esecuzione
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 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"
}
}
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.
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.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/'))
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
Power Automate: Set variable: ListId (file)
body('Send_an_HTTP:_GetListByRelativePath')?['vti_x005f_listname']
Questo è un esempio di esecuzione
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='
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
ItemId
Ricavare l'ItemId è semplice viene passato in input al triggerPower Automate: Initialize variable: ItemId
triggerBody()?['ID']