Zmiana nazwy załączników na liście SharePoint przy pomocy Power Automate

Data publikacji: 2021-11-20
sharepoint_attachements_name

W artykule opisałem, w jaki sposób w PowerAutomate stworzyć flow zmieniający nazwę załączników przypisanych do rekordu znajdującego się na liście SharePoint. W opisanym przykładzie jako wyzwalacz wykorzystuję PowerApps. W podanych formułach wykorzystałem angielską składnię formuł (przecinki zamiast średników).

Wyobraźmy sobie scenariusz, w którym korzystamy z aplikacji PowerApps połączonej z listą SharePoint, która służy nam do zapisywania wydatków w trakcie podróży służbowej. Każdy z wydatków musimy udokumentować dołączając odpowiedni plik do wniosku.

Ze względu na wymagania biznesowe, chcemy, żeby każdy załącznik miał nazwę zgodną ze wzorcem:

IDrekordu_PierwotnaNazwaZalacznika

Problem w tym, że użytkownicy aplikacji czasami o tym zapominają i dodają załącznik niespełniający tego kryterium. Jak zatem osiągnąć zamierzony przez nas efekt?

Jedną z metod jest wykorzystanie Power Automate i utworzenie flow zmieniającego nazwę załącznika na liście. W naszym przypadku flow jest wywoływany z poziomu Power Apps za pomocą funkcji Run. Jako parametr przekazujemy ID rekordu, którego dotyczy zmiana.

W aplikacji do zapisu załącznika, wykorzystujemy formularz i funkcję SubmitForm, a następnie korzystamy z funkcji Patch i metody LastSubmit do zapisania danych do konkretnego rekordu.

Tak zapisany rekord przechodzi przez kilka etapów akceptacji, na których do wniosku mogą być dodawane kolejne załączniki.

Żeby flow działał od początku (a więc przy dodaniu kompletnie nowego rekordu), pomiędzy funkcją SubmitForm a funkcją uruchamiającąflow, musimy dodać funkcję UpdateContext. Przypisze ona ID rekordu, który wcześniej dodaliśmy do zmiennej lokalnejlocWniosekID.

Nasza formuła może wyglądać następująco:

SubmitForm(Wniosek); // Wysłanie wniosku do listy SharePoint

UpdateContext({locWniosekID: Wniosek.LastSubmit.ID}); // Przypisanie do zmiennej ID wniosku na podstawie LastSubmit

’ChangeAttachmentName’.Run(locWniosekID) // Uruchomenieflow

Zajmijmy się teraz przygotowaniem flow, który będzie zmieniał nazwę załączników.

Tworzymy flowChangeAttachmentNamei jako typ wybieramy instant. Jako wyzwalacz zaznaczamy PowerApps.

Pierwszą akcją jest inicjalizacja zmiennej o nazwie wniosekID, typie String i wartości pobranej z aplikacji (Ask in PowerApps).

Następnie pobieramy rekord, którego załączniki będziemy zmieniać (akcja Pobierz rekord/Get item):

W moim wypadku to lista Wniosek w witrynie SandboxIgora.

W kolejnym kroku korzystamy z akcji Pobierz załączniki (Get attachments) jako Id wybierając wcześniej zainicjalizowaną zmienną wniosekID:

Następnie tworzymy pętlę Zastosuj do każdego (Apply to each) z warunkiem „DisplayNamestarts with wniosekID”.

Dzięki temu sprawdzamy czy nazwa załącznika zaczyna się od ID wniosku (możliwy jest scenariusz, w którym użytkownik zapisał wniosek zgodnie z opisanymi wcześniej wymogami).

W rozgałęzieniu warunku mamy:

Jeśli nazwa załącznika zaczyna się od ID wniosku, nic z takim załącznikiem nie robimy.

Jeśli jest inaczej, pobieramy zawartość załącznika (Get attachment content) i dodajemy załącznik, jako File Name wpisując formułę:

concat(variables(’wniosekID’), '_’, items(’Apply_to_each’)?[’DisplayName’])

(W maju 2021, kiedy powstaje ten artykuł musiałem przekopiować “items(’Apply_to_each’)?[’DisplayName’]”, ponieważ w wyrażeniach nie miałem możliwości dodania go z zawartości dynamicznej – trzeba tylko uważać na znak “@”).

W przypadku załącznika, który do tej pory nazywał się train_ticket.pdf otrzymamy nazwę 1_train_ticket.pdf (zakładając, że pracujemy na rekordzie o ID równym 1).

Załóżmy, że startowaliśmy z trzy załącznikami do rekordu o ID równym 1:

train_ticket.pdf

hotel.pdf

lunch.pdf

W tej chwili powinniśmy mieć sześć załączników:

 

train_ticket.pdf

hotel.pdf

lunch.pdf

1_train_ticket.pdf

2_hotel.pdf

3_lunch.pdf

Poprzednio wykorzystana pętla jedynie dodała nowe pliki z odpowiednią nazwą. Musimy teraz usunąć załączniki niespełniające kryterium nazewnictwa. Robimy to tworząc dodatkową pętlę:

Tym razem do załączników, których nazwa nie zaczyna się od ID rekordu po prostu stosujemy akcję Usuń załącznik (Deleteattachment).

Po wykonaniu się pętli do rekordu o ID 1 powinniśmy mieć trzy załączniki:

1_train_ticket.pdf

2_hotel.pdf

3_lunch.pdf

Powyższy przykład nie jest jedynym sposobem na zmianę nazwy załącznika.

Jako wyzwalacz moglibyśmy również wykorzystać Whenanitemiscreated, ale nasz scenariusz zakładał, że wniosek może być edytowany na kolejnych etapach akceptacji, i na tych etapach mogą pojawiać się załączniki, których na początku nie było.

Jak zatem sprawdzić, czy pojawił się nowy załącznik?

Musimy wprowadzić drobną modyfikację w Power Apps. Na właściwościOnAddFile karty załącznika dodajemy funkcję:

UpdateContext({fileWasAdded: true})

a na właściwości OnSelect przycisku wysyłającego Patch do listy dodajemy:

If(fileWasAdded, 'ChangeAttachmentName’.Run(selectedItem.ID))

W tym wypadku “selectedItem” odnosi się do rekordu wybranego z galerii na poprzednim ekranie.

Dzięki powyższej zmianie, mamy pewność, że flow uruchomi się tylko w momencie, w którym rzeczywiście dodamy nowy załącznik do rekordu na dalszych etapach akceptacji.