Praca z codziennie nadpisywanym plikiem Excel i jego zawartością, obsługa błędów

Praca z okresowo nadpisywanymi plikami w Power Automate niesie za sobą kilka pułapek. Załóżmy że nasze zautomatyzowane skrypty codziennie wrzucają na Sharepoint plik z danymi. Plik jest zapisywany pod tą samą nazwą, zatem się nadpisuje. Naszym zadaniem jest w zależności od wartości w kolumnie „alert” wysłać wiadomości w Teams do różnych użytkowników z contentem z excela. Dane w pliku nie są zapisane w tabeli (jak zwykle w generowanych plikach xlsx przez programy SQL-owe). W przypadku błędu flow ma wysłać wiadomość z ostrzeżeniem.

Rozwiązaniem jest utworzenie poniższego flow:

Przede wszystkim należy utworzyć tabelę w pliku, ponieważ niemal wszystkie funkcje Excelowe w Power Automate działają na tabelach, bez możliwości odniesienia się do konkretnych wierszy i kolumn. Używamy do tego funkcji Create Table:

Pierwszą myślą mogłoby być podanie w argumencie File nazwy pliku np. wybierając z proponowanych wartości w liście rozwijanej. Jest to jednak pułapka, ponieważ dane pliku w Power Automate są zapisywane jako unikalne klucze dla każdego pliku. Flow działałoby tak długo, jak nasz plik nie byłby nadpisany. Nawet jeśli nadpiszemy plik z tą samą nazwą w tej samej lokalizacji, flow wykaże błąd – brak pliku, ponieważ nowy plik zawiera inne dane identyfikacyjne. Dlatego w argumencie podajemy ID pliku z kroku Get File Metadata using path:

Ta niezwykle użyteczna funkcja pobiera nam metadane pliku m.in. id pliku, z określonej lokalizacji dla określonej nazwy.

Następnym krokiem jest pobranie wierszy z utworzonej tabeli excelowej w pliku:

gdzie także jako plik podajemy ID pliku pobrane z wcześniejszego stepu. Wybieramy też tabelę jako output z poprzedniego stepu – outputs('Create_table')?['body/name'].

Następnie budujemy krok Apply To Each, czyli pętlę która przechodzi przez wszystkie pobrane wiersze:

Argumentem jest oczywiście output z kroku List Rows in Table: outputs('List_rows_present_in_a_table')?['body/value']

W pętli sprawdzamy nasz warunek

Wymaga to wpisania ręcznego przez nas argumentu: items('Apply_to_each')?['alert']. Znak zapytania oznacza przejście wgłąb naszego itema, a w nawiasie kwadratowym wpisujemy nazwę kolumny. Wartość wypada wpisać w cudzysłowie – z powodu różnych błędów Power Automate nie zawsze prawidłowo porówna wartości bez cudzysłowia.

Następnie jeżeli warunek jest spełniony wysyłamy wiadomość użytkownikowi na Teams

Aby podać wartość wiersza w treści wiadomości insertujemy identyczne expression jak w conditionie: items('Apply_to_each')?['nazwa_kolumny']

Gotowe 🙂

Obsługa błędów

Może jednak się wydarzyć sytuacja, że w pliku jest już utworzona tabela (bo np. nowy plik nie został wrzucony i nie nadpisał poprzedniego). Proces wykaże błąd, ponieważ nie można utworzyć tabeli w miejscu gdzie już jakaś istnieje. Wtedy chcemy wysłać wiadomość o błędzie.

Prostą obsługę błędów zapewnia akcja „Add a parallel branch”

Oraz wybranie w ustawieniach kroku który ma zostać wykonany po błędzie w sekcji Run After – „Has failed”, „Is skipped”