Top

Przywracanie usuniętych w SharePoint plików z Power Automate


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:

  1. Wywołaj endpoint http://<sitecollection>/<site>/_api/web/RecycleBin używając akcji „Send an HTTP request to SharePoint”.
  2. 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.
  3. Sparsuj otrzymany JSON.
  4. 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!


Tomasz Poszytek

Cześć! Nazywam się Tomasz. Jestem ekspertem w dziedzinie automatyzacji procesów i budowaniu rozwiązań dla biznesu z użyciem Power Platform. Jestem Microsoft MVP i Nintex vTE.

2 komentarze
  • 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ść

    15 listopada, 2021 at 3:36 pm Odpowiedz
    • 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?

      21 listopada, 2021 at 1:15 am Odpowiedz

Wyślij komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.