Przywracanie usuniętych w SharePoint plików z Power Automate
Table of Contents
Znając wyzwalacz w Power Automate o nazwie „When a file is deleted” wiele osób pyta, czy istnieje możliwość przywrócenia usuniętego pliku lub usunięcia go na stałe? I owszem, jest to możliwe. Pokażę Ci, jak to zrobić.
Obiekt RecycleBin
Najlepszym sposobem na osiągnięcie tego jest użycie obiektu SP.RecycleBinItem
z biblioteki podstawowych obiektów SharePoint (Core Objects’ Library, więcej). Obiekt ma dwie metody:
- deleteObject – trwale usuwa element z kosza
- restore– przywraca element z kosza
http://<sitecollection>/<site>/_api/web/RecycleBin(recyclebinitemid)/deleteObject()
http://<sitecollection>/<site>/_api/web/RecycleBin(recyclebinitemid)/restore()
Uwaga: jeśli budujesz to rozwiązanie dla witryny, będącej główną witryną kolekcji witryn lub dla modern team/ communication site, zastąp web na site, aby uzyskać dostęp do kosza witryny:http://<sitecollection>/<site>/_api/site/RecycleBin(recyclebinitemid)/restore()
Kluczowym wyzwaniem przy użyciu powyższych endpointów uzyskanie „recyclebinitemid
„. Pokażę Ci, jak to zrobić.
When a file is deleted
Ten wyzwalacz jest uruchamiany po usunięciu elementu w aplikacji SharePoint (źródło). Akcja ta jednak ma bardzo ograniczoną liczbę zwracanych danych i są one mało przydatne dla naszego scenariusza:
{ "ID": [ID elementu w bibliotece SharePoint], "Name": "[Nazwa wyświetlana]", "FileNameWithExtension": "[Nazwa wyświetlana + rozszerzenie]", "DeletedByUserName": "[Imię i nazwisko usuwającego]", "TimeDeleted": "[Data i czas usunięcia]", "IsFolder": [prawda/ falsz] }
Zakres informacji, jaki możemy uzyskać o każdym usuniętym pliku, gdy odpytamy endpoint http://<sitecollection>/<site>/_api/web/RecycleBin
jest znacznie szerszy. W danych od triggera brakuje m. in. informacji o ścieżce, pod którą plik był pierwotnie obecny, oraz identyfikatora elementu w koszu, którego możemy użyć do przywrócenia lub trwałego usunięcia pliku. Jak ten identyfikator zdobyć? Patrz poniżej.
Recycle Bin Item ID
By go otrzymać wykonaj poniższe akcje:
- Wywołaj endpoint
http://<sitecollection>/<site>/_api/web/RecycleBin
używając akcji „Send an HTTP request to SharePoint”. - Odifltruj zwrócone dane pozostawiając wyłącznie te rekordy, w których nazwa pliku z rozszerzeniem jest równa tej, z danych w koszu.
- Sparsuj otrzymany JSON.
- Przywróć element z kosza korzystając z parametru Recycle Bin Item ID, poprzez użycie akcji „Send an HTTP request to SharePoint”.
W kroku nr 2 użyj: body('Get_files_from_Recycle_Bin')['d']['results']
dla pola „From” oraz item()['Title']
is equal to triggerBody()?['FileNameWithExtension']
dla ustawień filtra.
Następnie użyj akcji do sparsowania zwróconego rekordu i pobierz body('Parse_JSON')['Id']
jako parametr w polu Uri do przywrócenia elementu korzystając ze endpoint: _api/site/RecycleBin('@{body('Parse_JSON')?['Id']}')/restore()
.
Dlaczego jest to przydatne?
Ta prosta, ale ważna funkcjonalność może pomóc w zarządzaniu plikami SharePoint (tzw. governance), co w naszych czasach jest bardzo ważne. Możliwość usunięcia pliku jest przywilejem większości użytkowników, jednak dodanie dodatkowej warstwy w celu sprawdzenia, czy plik można było rzeczywiście usunąć, a następnie przywrócenie go to już inna sprawa.
Ponadto w przypadku wszystkich scenariuszy, w których należy zsynchronizować dane między bibliotekami lub SPO i on-prem, ten wyzwalacz jest również bardzo przydatny.
Jeśli masz jakieś pytania, zostaw je w komentarzach poniżej. Dzięki!
Robert
Cześć. Opisany przez Ciebie Flow działa poprawnie. Chciałem jednocześnie podczas przywracania pliku zmienic jego nazwę (na przedrostek restored_*), niestety opisywane na stronach wszelakich rozwiazania nie dzialają.
Wysłanie requestu POST i body w formie:
{’__metadata’:{’type’:’SP.Data.RecycleBinItem’},’FileLeafRef’:’@{items(’Apply_to_each’)?[’DeletedDateLocalFormatted’]}_@{triggerBody()?[’FileNameWithExtension’]}’}
powoduje ze zwracane BODY ma forme:
{
„d”: {
„Restore”: null
}
}
pomimo ze RAW INPUT ma poprawne dane wejsciowe. Nie bardzo wiem czy mozna to obejść
Tomasz Poszytek
A czy nie możesz najpierw przywrócić pliku i spróbować zmienić jego nazwę w kolejnym zapytaniu? Gdy plik już powróci do pierwotnej biblioteki?