PowerApps

Czasami, gdy pracujemy z PowerApps, dodajemy nowe połączenia, takie jak Microsoft Flow lub do usług zewnętrznych, a następnie decydujemy, że nie potrzebujemy ich już więcej i wobec tego usuwamy je, jednak zapominając o ich uprzednim usunięciu w PowerApps. To prowadzi nas do sytuacji, gdy próbując wyeksportować później aplikację jako package, mamy do czynienia z bardzo trudnym do debugowania problemem.

Kiedy taka sytuacja ma miejsce?

Wyobraź sobie, że masz przycisk, który po kliknięciu uruchamia Flow. Albo wysyła e-mail przez connector Office365 Outlook. Podczas pracy z aplikacją, zdajesz sobie sprawę, że przepływ jest nieprawidłowy lub connector używa złych poświadczeń. Usuwasz przepływ lub łącznik.

Następnie zdajesz sobie sprawę, że przycisk w PowerApp powoduje błąd, ponieważ jest związany z nieistniejącym Flow/ Connectorem. W związku z tym zwyczajnie usuwasz ten kod z akcji „onclick” przycisku lub zastępujesz go innym, lub… całkowicie usuwasz przycisk z aplikacji, zamiast NAJPIERW usunąć powiązanie Flow/ Connection z aplikacji, klikając na przycisk, następnie „Action->Flows”, a następnie z powiązanej listy – „Remove from app”, jak poniżej:

Removing Flow connection from the PowerApps button
Usuwanie powiązania z Flow z przycisku w PowerApps

Następnie publikujesz aplikację i… zapominasz o całej sytuacji. Wiele wersji później decydujesz się wyeksportować aplikację, jednak zamiast tego po chwili pokazuje się czerwony pasek (czerwony!!!) informujący, że: „Nie można znaleźć przepływu „GUID”.” lub „Nie można znaleźć połączenia „GUID”.”.

Error exporting PowerApps as a package
Błąd podczas eksportowaniu PowerApps jako paczki

Czemu eksport się nie udaje?

Błąd pokazuje się dlatego, że mechanizm eksportu próbuje pobrać wszystkie połączenia zdefiniowane w aplikacji dlatego, aby podczas importowania aplikacji późniejszy użytkownik mógł je samodzielnie zdefiniować i podać poświadczenia (jeśli potrzebne). Ponieważ to konkretne połączenie nie istnieje (ponieważ zostało usunięte), ale nadal istnieje odniesienie do niego z aplikacji, mechanizm eksportu nie może go znaleźć, uzyskać do niego dostępu, a tym samym zakończyć swojego działania.

Jak to debugować?

Nie byłoby nic złego w tym problemie, gdyby nie fakt, że jako powód otrzymujemy jedynie identyfikator GUID brakującego połączenia, nie zaś jego nazwę lub jakiekolwiek inne informacje, które mogłyby nam pomóc w debugowaniu.

Niemniej jednak, nawet gdybyśmy wiedzieli, czego brakuje, nie wiem, czy istnieje sposób by przywrócić brakujące połączenie, zachowując jego GUID.

Tymczasem, aby dowiedzieć się, czego brakuje, najprostszym sposobem jest wykonanie następujących czynności (używam Visual Studio Code w tym celu):

  1. Zapisz aplikację lokalnie, na swoim komputerze,
  2. Zmień rozszerzenie pliku z *.msapp na*.zip,
  3. NIE ROZPAKOWUJ PLIKU! Po prostu otwórz go używając np. 7zip,
  4. Otwórz plik: {zip}\References\DataSources.json,
  5. Szukaj wyświetlonego w błędzie numeru GUID,
  6. Kliknij „F1” i wpisz „Format Document” by otrzymać ładnie sformatowany kod JSON,
  7. Szukaj atrybutu „Name” wewnątrz obiektu zawierającego poszukiwany GUID, wewnątrz atrybutu „AddinConnectorId„.
Missing connection for a given GUID
Brakujące połączenie dla podanego GUID

Tak, to jest nazwa brakującego połączenia. Czy już Ci coś dzwoni? Myślę, że powinno, ponieważ jest to jedyna informacja w tym temacie.

Jak to naprawić?

Jeśli przycisk związany z problemem nadal znajduje się w Twojej aplikacji i szczęśliwie nie został zastąpiony niczym innym lub wiesz, w której wersji dokonano zmiany i nie powstało ich już kilkadziesiąt od tamtego czasu, możesz po prostu kliknąć na przycisk, następnie „Action->Flows”, a następnie z powiązanej listy – „Remove from app”, jak poniżej:

Removing Flow connection from the PowerApps button
Usuwanie powiązania z Flow z przycisku w PowerApps

Na koniec opublikuj nową wersję aplikacji i spróbuj ponownie. Problem powinien być rozwiązany.

A co jeśli prosty sposób nie zadziała?

Opcjonalnie spróbuj otworzyć menu „View” -> „Data sources” i tam znaleźć niepodłączony Flow. Potem po prostu go usuń i znów – zapisz i opublikuj aplikację:

Removing missing connection from PowerApps
Usuwanie brakującego połączenia z PowerApps

A co jeśli nie mogę znaleźć niepodłączonego połączenia?

Jedyne rozwiązanie, jakie do tej pory znalazłem, to praca nad plikami wewnątrz zapisanego lokalnie pliku *.msapp. Zasadniczo są to dwa pliki, które zwykle zawierają wyświetlany identyfikator GUID:

Files containing searched GUID
Pliki zawierające poszukiwany GUID
  • Properties.json – plik zlokalizowany w root-cie pliku msapp,
  • DataSources.json – plik obecny w podkatalogu „References”.

Aby rozpocząć poprawki, najpierw wykonaj poniższe kroki:

  • Zapisz aplikację lokalnie, na swoim komputerze (File, potem Save as):
Save PowerApps locally on your computer
Zapis aplikacji PowerApps na komputerze
  • Zmień rozszerzenie pliku z *.msapp na*.zip,
  • NIE ROZPAKOWUJ PLIKU! Po prostu otwórz go używając np. 7zip,
  • Skopiuj dwa pliki, wspomniane powyżej, na zewnątrz archiwum.

I teraz możesz już zacząć naprawę 🙂

DataSources.json

Kroki są następujące (ponownie przy użyciu Visual Studio Code):

  • Otwórz DataSources.json,
  • Kliknij „F1” i wpisz „Format Document” by otrzymać sformatowany kod JSON,
  • Szukaj GUID,
  • Gdy znajdziesz, zaznacz cały obiekt, który zawiera poszukiwany GUID i usuń,
Finding the missing GUID in DataSources.json file
Poszukiwanie brakującego GUIDu w pliku DataSources.json
  • Teraz naciśnij „CTRL+A” by zaznaczyć całą zawartość pliku,
  • I ponownie kliknij „F1”, i wpisz „Join Lines” by otrzymać finalnie plik z zawartością wyświetlaną w jednej linijce.
Joining code lines into a single one in Visual Studio Code
Łączenie wielu linii kodu do jednej używając Visual Studio Code

Na koniec przenieś plik z powrotem do pliku ZIP, aby zastąpić istniejący plik. Gotowe!

Properties.json

To jest drugi plik, który należy naprawić. Wykonanie tego kroku jest nieco bardziej skomplikowane. Czynności są następujące (za pomocą Visual Studio Code):

  • Otwórz Properties.json,
  • Naciśnij „F1” i wpisz „Format Document” by otrzymać sformatowany kod JSON
  • Szukaj GUID,
  • Powinien się znajdować wewnątrz wyescapowanego ciągu JSON , będącego wartością zmiennej „LocalConnectionReferences„,
  • Skopiuj jego zawartość jednak bez otwierającego i zamykającego cudzysłowa,
  • Wklej skopiowany kod w nowym pliku,
  • Zmień typ dokumentu na JSON:
Change document type to JSON in Visual Studio Code
Zmiana typu dokumentu na JSON korzystając z Visual Studio Code
  • Zamień wyeskapowane cudzysłowy zwykłymi (\\" to ") by otrzymać prawidłowy JSON
Replace escaped quotes with not escaped
Zamiana wyescapowanych cudzysłowów zwykłymi
  • Naciśnij „F1” i wpisz „Format Document” by otrzymać prawidłowo sformatowany kod JSON,
  • Usuń blok zawierający poszukiwany kod GUID,
  • „CTRL+A” by zaznaczyć cały kod,
  • Ponownie naciśnij „F1” i wpisz „Join Lines” by złączyć cały kod w jedną linię,
  • Teraz zamień cudzysłowy " na wyescapeowane: \\",
  • Skopiuj kod i zamień nim wartość atrybutu „LocalConnectionReferences” wewnątrz pliku „Properties.json”.

Na koniec zastąp plikiem ten, istniejący wew. archiwum. Zrobione!

Wgrywanie naprawionego pliku

Ostatnim krokiem jest zamiana rozszerzenia pliku z *.zip do *.msapp. Po zrobieniu tego możemy kontynuować.

Teraz otwórz plik jako aplikację w designerze PowerApps. By to zrobić, otwórz stronę: https://us.create.powerapps.com/studio/.

Teraz kliknij „Open” i „Browse”, i przejdź do pliku, który chcesz otworzyć:

Opening local msapp file in PowerApps
Otwieranie lokalnego pliku msapp w PowerApps

Następnie poczekaj, aż aplikacja zostanie załadowana. Po załadowaniu niestety musisz na nowo skonfigurować wszystkie połączenia, zweryfikować i poprawić błędy. Na koniec zapisz ją jako nową (lub zastąp istniejącą) aplikację, a następnie spróbuj wyeksportować ją ponownie jako pakiet. Działa jak marzenie! 🙂

Jeśli masz jakieś pytania lub komentarze, podziel się nimi poniżej!