Spring til indholdet

Slet listeelementer uden om papirkurven med Power Automate

Delete item lægger elementet i papirkurven. Et DELETE med REST sletter det med det samme. Flowet, grænsen på 100 elementer og det, der alligevel ikke forsvinder.

Opdateret Power AutomateSharePoint Online 3 min. læsning

Delete item og Delete file i SharePoint-connectoren sletter kun til papirkurven. En liste, der jævnligt skal tømmes, fylder så papirkurven op, og den skal tømmes i hånden. Et DELETE mod elementet med REST sletter det med det samme. Microsoft skriver det sådan: et element, der slettes med REST eller CSOM, “is immediately purged and it isn’t recoverable from the site or site collection Recycle Bins”. Et kald til recycle() på elementet lægger det i papirkurven i stedet.

Flowet#

Get items henter de elementer, der skal slettes: alle, eller et filtreret udvalg. Apply to each går gennem outputs('Get_items')?['body/value'], og inde i løkken sletter Send an HTTP request to SharePoint hvert element:

Site Address: <webstedets adresse>
Method: DELETE
Uri: _api/web/lists/GetByTitle('<liste>')/items(@{items('Apply_to_each')?['ID']})
Headers:
{
  "Accept": "application/json;odata=nometadata",
  "IF-MATCH": "*"
}

IF-MATCH: * sletter elementet, uanset om det er ændret, siden det blev hentet. Handlingen hører til SharePoint-connectoren og kræver ikke Premium.

2021-udgaven havde også X-RequestDigest: $("#__REQUESTDIGEST").val() i headerne. Det er jQuery fra en SharePoint-side i browseren. I et flow bliver det sendt som tekst og gør ingenting, fordi handlingen selv klarer godkendelsen. En Content-Type er heller ikke nødvendig, for et DELETE har ingen body.

Flowet fra 2021: Get items, Apply to each og DELETE-kaldet, her med de to headere, der ikke er nødvendige.

Hvilke elementer#

Get items giver 100 elementer, hvis intet andet er sat. Et flow, der skal tømme en liste, sletter altså kun 100 pr. kørsel. Top Count under de avancerede indstillinger kan gå op til 5.000, og med Pagination i handlingens indstillinger og en tærskel hentes flere sider.

Filter Query begrænser udvalget, fx elementer ældre end 30 dage eller med en bestemt status:

Created lt '@{addDays(utcNow(), -30)}'
Status eq 'Behandlet'

På en liste med mere end 5.000 elementer skal kolonnen i filteret være indekseret.

Efter en tidsplan: udløseren Recurrence, fx hver søndag om natten.

Kun hvis elementet ikke er ændret#

Med @odata.etag fra Get items i stedet for * fejler sletningen, hvis nogen har ændret elementet, siden det blev hentet:

"IF-MATCH": "@{items('Apply_to_each')?['@odata.etag']}"

Det har jeg ikke efterprøvet.

Mange elementer#

Et kald pr. element er langsomt ved tusindvis. $batch samler mange kald i ét, se Mange elementer på én gang i Opret listeelementer med REST fra Power Automate. Eller PnP PowerShell, hvor Remove-PnPListItem uden -Recycle sletter permanent:

1Connect-PnPOnline -Url "https://<tenant>.sharepoint.com/sites/<websted>" -Interactive -ClientId "<klient-id>"
2
3$items = Get-PnPListItem -List "<liste>" -Query "<View><Query><Where><Lt><FieldRef Name='Created'/><Value Type='DateTime'><Today OffsetDays='-30'/></Value></Lt></Where></Query></View>"
4
5foreach ($item in $items) {
6    Remove-PnPListItem -List "<liste>" -Identity $item.Id -Force
7}

-Force springer bekræftelsen over. Med -Recycle havner elementet i papirkurven.

Det, der alligevel ikke forsvinder#

  • Opbevaringspolitikker og -mærkater. Skal et element bevares efter en politik i Purview eller er under en juridisk tilbageholdelse, bliver det bevaret, uanset hvordan det slettes.
  • Microsofts backup. SharePoint Online har en backup i 14 dage efter en endelig sletning. Den kan kun lægge en hel webstedssamling tilbage, ikke et enkelt element.
  • Papirkurven holder et slettet element i 93 dage i alt, fordelt på første og anden fase, ikke 93 dage i hver. Første fase tæller med i webstedets lagerplads, anden fase gør ikke.

Det der driller#

  • Det kan ikke fortrydes. Flowet bør prøves på en kopi af listen først.
  • 100 elementer pr. kørsel, hvis Top Count og Pagination ikke er sat.
  • Listens titel i GetByTitle, ikke navnet i adressen. En liste, der kan blive omdøbt, adresseres sikrere med lists(guid'<liste-id>').
  • Rettigheder. Forbindelsens konto skal kunne slette elementer på listen. Bidrage er nok.

Alle noter