W Nintex dla on-premisowych wersji SharePoint począwszy od 2010 (nawet w edycjach Standard) możliwe było używanie akcji, które pozwalały na wołanie Excel Services dostępnych na platformie SharePoint i w ten sposób na pracę z danymi, z plików xls i xlsx. Jednak w SharePoint Online ta usługa nie jest dostępna (ok, można z niej korzystać poprzez REST API, jednak nie w takim zakresie, jak można w on-premise), nie istnieje też możliwość skorzystania z niej poprzez dostępne akcje w Nintex for Office 365 czy Nintex Workflow Cloud. Zatem nie istnieje prosty sposób, by zrealizować taki scenariusz. Nasunęło mi się pytanie (zainspirowane licznymi z kolei pytaniami stawianymi na forum Community Nintex), w jaki sposób można to zrobić?

Najczęściej mawianym obejściem było zapisanie pliku xlsx do formatu csv, a następnie odczytanie jego zawartości i przetwarzanie jej poprzez użycie kolekcji (planuję napisać o tym oddzielny post).

Jednak ostatnio zauważyłem, że Microsoft Flow posiada już dostępne akcje, które właśnie używają Excel Services dostępnych w SharePoint Online. Co więcej, każdy ma dostęp do bezpłatnej wersji Microsoft Flowi tych akcji również. Teraz nie pozostało mi nic, tylko spróbować.

Ważne! Należy pamiętać, że bezpłatna wersja MS Flow nie działa na zasadzie wyzwalania przez zdarzenie, a poprzez regularne odpytywanie SharePoint, czy dane zdarzenie wystąpiło. W sytuacji, gdy w chwili odpytania nie nastąpi oczekiwane zdarzenie, możliwy jest scenariusz, w którym proces MS Flow w ogóle się nie uruchomi.

W płatnej wersji nie istnieje takie ryzyko, ponieważ działa ona bardziej na zasadzie Remote Event Receivera.

W każdym razie, spróbowałem 🙂

Ograniczenia Flow w zakresie akcji Excel

Od początku. Chciałbym po krótce opisać ograniczenia tego rozwiązania. Jednak Flow (a może bardziej Excel Services w O365), nie jest tak elastyczny, jak mógłbym się spodziewać:

  1. By jakkolwiek móc pracować z danymi, z pliku Excel, dane te muszą być umieszczone w tabeli lub zakresie. Także mając dane, należy je zaznaczyć kursorem, a następnie dać im nazwę (Rename an Excel table – Office SupportExcel Tutorial: How to Name Excel Tables For Beginners Excel 2016 Tutorial Excel 2013 Tutorial – YouTube):
    1. Zaznacz zakres danych;
    2. W zakładce „Narzędzia” wybierz opcję „Formatuj jako tabelę”;
    3. Przejdź do zakładki „Projektowanie”;
    4. Ustaw nazwę tabeli w lewym, górnym rogu okna aplikacji.
  2. Jeśli zdecydujesz, by w jakiś sposób parametryzować konfigurację akji i w polu „File name” wstawisz zmienną, wówczas Flow nie będzie potrafić automatycznie wybrać nazwy tabeli/ zakresu z wew. pliku oraz nie zbuduje zmiennych na podstawie kolumn znajdujących się w zakresie. Tak samo się stanie, gdy w polu „Table name” użyjesz zmiennej, a nie konkretnej wartości tekstowej:
    Microsoft Flow URL to the OneDrive
  3. Jeśli zdecydujesz, by dane z Excela były zapisywane do listy SharePoint, wówczas ponownie – nazwa listy musi być zdefiniowana, nie może być zmienną, ponieważ w takim wypadku poniwnie nie będzie możliwe wyświetlenie nazw kolumn listy przez Flow i tym samym związanie wartości z Excel,  z kolumnami w SharePoint:
    Microsoft Flow Insert Data from Excel

Aczkolwiek można zrobić obejście, poprzez użycie akcji „HTTP Request” w celu pobrania nazw kolumn dla listy, a nastęnie drugiej, w celu wstawienia danych do tej listy. Jednak to już sporo zachodu.

Rozwiązanie krok, po kroku

Po tym, gdy już zaakceptujesz wszystkie ograniczenia i użycie raczej zaszytych na sztywno zmiennych w przepływie (wszak wciąż można tworzyć osobny workflow per lista/ biblioteka) działające rozwiązanie oparte jest o poniższe elementy:

  1. Biblioteka SharePoint do importu pliku – to tutaj zaczyna się proces i to na tej bibliotece działa workflow Nintex. W moim scenariuszu, proces Nintex „bierze” wgrany plik Excel i przenosi go do OneDrive for Business, do określonego folderu (tego, z którego potem ma korzystać proces w Flow). Następnie, gdy już zostanie wgrany plik, proces Nintex poprzez użycie akcji „Web Request” uruchamia proces w Microsoft Flow:
    Nintex contact OneDrive

    1. Pole „Authorizing user” – atrybut widoczny w akcji „One Drive upload file” – oczekuje na poprawny adres e-mail. Jest to istotne, ponieważ na ten adres wysłany zostanie mail z prośbą o autoryzowanie aplikacji Nintex do używania OneDrive for Business. Treść takiego maila jest następująca:
      NIntex mail with OneDrive authorization
      Gdy użytkownik kliknie łącze „Provide OneDrive account credentials and authorize access” wyrazi zgodę, by aplikacja otrzymała dostęp do danych konta i mogła współtworzyć w OD4B:
      OneDrive Authorization monitJest to także element procesu. Wyrażenie zgody lub odmowa spowoduje wyzwolenie dalszych akcji obecnych w przepływie. 

      Zgodnie z dokumentacją (źródło: OneDrive upload file) workflow będzie czekać do 7 dni na decyzję użytkownika. Po tym czasie zakończy się.

    2. „Body” – pole w akcji „Web Request” oczekuje na poprawny ciąg JSON (Flow oczekuje ciągu JSON jako treść żądania). Ponieważ w Nintex for O365 istnieje znany już błąd, który uniemożliwia bezpośrednie zdeklarowanie ciągu JSON jako zmiennej (ponieważ otwierająća i zamykająca klamra są wycinane), rekomenduję następujące obejście: Zadeklaruj zmienną JSON, jednak w której klamra otwierająca i zamykająca są zastąpione konkretnymi tokenami, następnie użyj dwa razy akcji Regex, aby zamienić te tokeny odpowiednio na klamrę otwierającą i zamykającą.
  2. Lista SharePoint – ta, do której zostaną zaimportowane dane z Excel. W moim wypadku ma 3 kolumnyt – dwie tekstowe i jedną typu data.
  3. OneDrive for Business – w moim przypadku musi być w nim określony folder, który następnie jest użyty w procesie Flow. Z tego folderu brany jest plik, który uprzednio zostanie wgrany przez Nintex.
  4. Proces Microsoft Flow – odpowiedzialny za przetworzenie pliku Exel i przegranie danych, wiersz po wierszu, do listy SharePoint z punkut 2:
    Microsoft Flow process overview

Działający przykład

  • Stworzyłem prosty plik Excel:

Simple Excel File

  • Wgrałem go do biblioteki dokumentów

Jeśli nie planujesz dodatkowej logiki, np. w postaci jakiegoś procesu akceptacji wgranego pliku, możesz po prostu ograniczyć się w zrozwiązaniem do samego tylko folderu w OD4B, na którym będzie „nasłuchiwać” Flow i w razie dodania nowego pliku, uruchomi odpowiedni proces.

  • Wgranie pliku uruchomiło mój przepływ Nintex. Następnie otrzymałem maila z prośbą o autoryzację dostępu. Gdy to zrobiłem, mój plik został wgrany:
    Microsoft Flow choosing a file for import
  • Następnie wyśwwietliłem stronę ze statusem procesu w Flow i patrzyłem, jak plik jest przetwarzany i wiersz, po wierszu, zapisywany do SharePoint:

Microsoft Flow execution monitoring

Co ciekawe, dla prostego pliku, który miał raptem 3 kolumny i 10 wierszy, Flow potrzebował niemal minutę na zakończenie przetwarzania i wgranie danych do SharePoint. Dla dużych plików ten proces może trwać długie minuty, o ile nie godziny.

  • Voilla! Lista wypełniona danymi z Excel:

SharePoint Online data imported from Excel via Microsoft Flow

Następne kroki

W zasadzie wszystko zależy od konkretnych wymagań. Na przykład, po zaimportowaniu danych, można uruchomić przepływ na liście, który dla każdego wiersza rozpocznie proces zbierania akeptacji.

W kolejnym poscie pokażę, w jaki sposób zaimportować dane z pliku Excel, który został zapisany do formatu CSV.

Dziękuję za lekturę!