Rejestracja zmiany użytkownika w kolumnie typu person – SharePoint

Data publikacji: 2022-07-06

Czy  zastanawiałeś się kiedyś nad tym w jaki sposób dobrać się do wnętrza Twojej kolumny Sharepoint’owej i wyciągnąć z niej wszystkie informacje o historii zmian jakie w niej zachodziły, ale oczywiście w taki sposób, aby dało się je później wykorzystać na potrzeby procesów Power Automate?

W tym artykule opowiem Ci jak to zrobić, ale pozwól że najpierw wprowadzę Cię w mój case businessowy, na którego przykładzie będę bazował.

Słowem wstępu do mojego procesu, załóżmy, że na jednej liście przechowuje jakieś dane o użytkowniku z wykorzystaniem kolumny typu Person, a na drugiej liście chciałbym zarejestrować zmianę jaka w tej kolumnie zaszła, a następnie zapisać informacje o moim bieżącym i poprzednim użytkowniku na innej liście, jako swego rodzaju log.

Proces rozpoczyna się od kroku When an item is created or modified, a następnie inicjalizuje sobie 2 puste zmienne typu string – #emailPerson oraz #int. Ta pierwsza posłuży mi do przechowywania informacji o wszystkich adresach email z wydobytej historii zmian wewnątrz kolumny.

Druga zmienna #int posłuży mi do przechwycenia informacji o tym ile liter posiada każdy pojedynczy wymieniony adres email. A dlaczego tak? O tym zaraz..

Kolejnym krokiem jest użycie Send http request to Sharepoint w celu wydobycia informacji o zmianach zachodzących wewnątrz mojego rekordu na liście Sharepoint, aby dalej ze zwróconej w ten sposób odpowiedzi naszego nagłówka http przekonwertować uzyskane dane, za pomocą funkcji Parse JASON.

(Pamiętaj, aby za pierwszym razem otrzymany zwrot http request przekopiować do Generate from Sample – funkcji-  Parse JASON), aby móc kontynuować proces. )

I od teraz zaczyna się całą magia 😉. Ten krok rozpoczynam pętlą Apply to each 3, w której dla wszystkich adresów email, w kolumnie typu person sprawdzam, czy otrzymana wartość nie jest pusta, a następnie uzyskany wynik zapisuje w formie tekstowej funkcjami Append to string variable prosto do zainicjowanych wcześniej zmiennych.

Jak możecie zauważyć, w pierwszej zmiennej #emailPerson zapisują się wszystkie adresy email jako jeden ciąg znaków, a do drugiej zmiennej #int zapisuje się suma ilości znaków dla każdego wyodrębnionego adresu email rozdzielonego przecinkiem.

Pętla wykonując ruch zapisuje mi do zmiennej tekstowej każdy wyciągnięty adres email przez co struktura tych danych wewnątrz zmiennej #emailPerson prezentować będzie się w taki sposób:
adres1@developico.comadres2@developico.comadres3@developico.com – bez przecinków, po prostu jeden adres email po drugim.

W tym założeniu proszę zwrócić uwagę, że adres1@developico.com to adres email mojej najnowszej wprowadzonej zmiany w kolumnie typu Person – czyli moja pierwotna zmiana na głównej liście, a mnie interesuje następujący po nim adres email, czyli  adres2@developico.com – ten jeden wcześniej z kolei w historii wersji.

Dlatego w drugiej zmiennej #int zapisywałem informacje o tym ile znaków posiada każdy pojedynczy wyodrębniony adres email, ponieważ mam zamiar, w kolejnym kroku, za pomocą operacji tekstowych, wydobyć tylko drugi z kolei adres email, a resztę ciągu znaków usunąć.

Rozpoczynając od funkcji Compose: u mnie nazwanej char, w której to, za pomocą wyrażenia expresion @{int(first(split(variables(’int’),’,’)))}  wyciągam liczbę znaków mojego pierwszego w kolei adresu email, którego przechowuje wewnątrz zmiennej #int.

Następnie ze zmiennej #emialPerson usuwam znaki w ilości o długości ciągu przechowywanego w char rozpoczynając od lewej strony. Czyli podsumowując usuwam z mojego głównego ciągu znaków wartość sumaryczną znaków pierwszego znalezionego adresu email.

@{substring(variables(’emailPerson’),outputs(’char’),sub(length(variables(’emailPerson’)),outputs(’char’))) }

Na tym etapie chcąc przejść  uzyskania tylko nickname’u użytkownika rozpoczynam operację w której to usuwam wszystko co występuje po pierwszym znalezionym znaku „@”. @{first(split(outputs(’Compose_8′),’@’)) }

W ten oto sposób udało nam sam uzyskać Nickname (jak w konektorze #office365User) który wymagany jest w ostatecznym kroku przy zapisie użytkownika z wykorzystaniem Claimsa.

i:0#.f|membership|@{outputs(’Compose_9′)}

Podsumowując całość omawianego przeze mnie procesu.

Za pomocą funkcji http request udało mi się wydobyć całą historię wersji i zmian w kolumnach mojej listy, następnie te dane zostały odpowiednio przekonwertowane z użyciem funkcji Parse Jason w celu dalszego przetwarzania.

Następnie z otrzymanych rezultatów za pomocą pętli apply to each zapisałem sobie informacje o wszystkich przechwyconych wersjach tego rekordu, w moim przypadku kolumna typu Person.

Warunkując zwrócone adresy email i zapisując je do zmiennej w postaci jednego ciągu znaków, a do drugiej zmiennej przekazywałem sumę ich długości.
Finalnie za pomocą operacji tekstowych w uzyskanym ciągu znaków usunąłem pierwszy adres email z kolei, a następnie wszystko co wystąpiło po pierwszym znaku @.

Tak, aby za pomocą Claimsa użytkownika utworzyć rekord o zeszłej zmianie na nowej liście.