Z basenu do kodu automatyzacja obecności

Seria: automatyzacja obecności / część 1

Arkusze obecności w klubie pływackim — problem, który warto było zautomatyzować

Od papierowego dziennika, Librusa i ręcznego kopiowania arkuszy na telefonie do walidacji danych, tygodniowych kart, miesięcznych podsumowań i raportów wysyłanych z Google Apps Script.

Skąd wziął się problem

Przez kilka lat byłem związany ze środowiskiem pływackim — najpierw jako asystent trenera w Warcie Poznań, w formie wolontariatu, później już jako trener pływania w Posnanii. Właśnie w Posnanii zacząłem mocniej łączyć codzienną pracę trenerską z informatyką.

Jednym z pierwszych problemów, który naprawdę zaczął mnie męczyć, była ewidencja obecności. Na papierze brzmi to banalnie: zawodnik był na treningu albo go nie było. W praktyce bardzo szybko okazało się, że zwykła lista obecności nie wystarcza.

Treningi odbywały się codziennie, grup było kilka, część zawodników była ze szkoły, część spoza niej, a do tego dochodziły normalne sytuacje z basenu: spóźnienia, wcześniejsze wyjścia, nieobecności usprawiedliwione i treningi wykonane tylko częściowo.

Obecność to nie tylko tabelka

W szkolnych systemach typu Librus obecność działa dobrze dla lekcji: ktoś jest obecny, nieobecny albo spóźniony. W treningu pływackim to nie zawsze wystarcza.

Jeżeli zawodnik spóźnił się na trening, sama informacja o spóźnieniu nie mówi, ile pracy faktycznie wykonał. Jeżeli wyszedł wcześniej, problem jest podobny. Z punktu widzenia trenera różnica między zawodnikiem, który wykonał całą jednostkę, a zawodnikiem, który przepłynął tylko jej część, jest istotna.

Dlatego zacząłem używać prostego systemu procentowego: brak wpisu nie liczył się do obecności, 0 oznaczało nieobecność, wartości pomiędzy 0 a 1 oznaczały częściową obecność, a 1 pełną obecność.

To nadal był prosty model, ale dawał dużo lepszą kontrolę niż zwykłe „obecny / nieobecny”.

Stary arkusz obecności z wartościami 0 i 1 oraz podsumowaniem frekwencji
Pierwsza wersja była prosta: zawodnicy w wierszach, treningi w kolumnach i podstawowe liczenie frekwencji.

Ręczny proces szybko przestał wystarczać

Pierwsze rozwiązanie było zwykłym arkuszem Google Sheets. W wierszach byli zawodnicy, w kolumnach dni danego tygodnia. Arkusz miał nazwę dnia i datę, a podstawowe formuły liczyły frekwencję zawodnika oraz obecność całej grupy.

To działało, ale wymagało ręcznej pracy. Co tydzień trzeba było kopiować arkusz, przygotowywać nowe daty, poprawiać formatowanie i pilnować, żeby wszystko się zgadzało. Często robiłem to na smartfonie, co samo w sobie było niewygodne.

Do tego dochodziło współdzielenie pliku z innymi trenerami. Jedna osoba wpisywała 1, ktoś inny próbował wpisać coś w innym formacie, ktoś przez pomyłkę wpisywał 10, a później trzeba było sprawdzać, dlaczego zawodnik ma 110% obecności. Ktoś mógł zmienić formatowanie, ktoś usunąć formułę, ktoś wpisać dane w złe miejsce.

Sam arkusz nie był problemem. Problemem był brak zasad, które pilnowałyby poprawności danych.

Komunikat walidacji w Google Sheets: podaj liczbę od 0 do 1
Walidacja zatrzymywała błędne wartości, na przykład 10 wpisane zamiast 1.

Papier, Librus i kilka źródeł prawdy

Na początku obecność funkcjonowała równolegle w kilku miejscach. Była lista papierowa, był Librus i był arkusz. Obecność wpisywałem podczas treningu, codziennie, osobno dla grup.

Przy dzienniku papierowym problemem było nawet samo przekazywanie go między osobami. Jeżeli dziennik był u jednego trenera, ktoś inny nie miał do niego dostępu. Jeżeli trzeba było coś sprawdzić później, najpierw trzeba było wiedzieć, gdzie fizycznie znajduje się zeszyt.

Librus rozwiązywał część problemów szkolnych, ale nie wszystkie. Na treningach pojawiały się też osoby spoza szkoły, których obecności nie mogłem wpisać w Librusie, a nadal potrzebowałem ich danych do statystyk.

Jeszcze większy problem pojawił się przy grupie licealnej, w której byli zawodnicy z różnych roczników — od siódmej klasy podstawówki do trzeciej klasy liceum. W praktyce oznaczało to wpisywanie danych w różnych miejscach, w różnych tabelach i w różnych kontekstach. To było po prostu irytujące i zabierało masę czasu.

Po co właściwie zbierać takie dane

Obecność nie była zbierana tylko po to, żeby mieć tabelkę. Dane o frekwencji pomagały sprawdzać zaangażowanie zawodników i dawały konkretne argumenty w rozmowach z rodzicami.

To było ważne na przykład wtedy, gdy trzeba było wyjaśnić, dlaczego dany zawodnik jedzie na Mistrzostwa Polski albo dlaczego nie zostaje zabrany. Jeżeli decyzja opiera się tylko na wrażeniu trenera, łatwo wejść w dyskusję. Jeżeli można pokazać regularność pracy i frekwencję z dłuższego okresu, rozmowa wygląda inaczej.

Na tamtym etapie nie była to jeszcze pełna analiza treningowa. To był raczej pierwszy krok: uporządkowanie podstawowych danych i sprawienie, żeby można było im zaufać.

Pierwsza automatyzacja

Pierwsza wersja była ręcznie przygotowywanym arkuszem, ale już z prostymi formułami. Później rozwiązanie zaczęło ewoluować: pojawiły się osobne tabele tygodniowe, walidacja wpisywanych danych, zabezpieczenia przed zmianą kluczowych elementów i automatyczne tworzenie nowych arkuszy.

Docelowo arkusze tworzyły się same w nocy z niedzieli na poniedziałek. Poprzednie karty były ukrywane, dzięki czemu łatwiej było znaleźć aktualny tydzień. Dane były walidowane, zakresy chronione, a trenerzy nie musieli co tydzień zaczynać od porządkowania pliku.

Raz w tygodniu powstawał raport tygodniowy, a raz w miesiącu raport podsumowujący. Raporty były wysyłane mailowo z Google Apps Script do trenerów oraz trenerki koordynatorki.

Lista zawodników i grupImiona, nazwiska i przypisanie do arkusza grupy.
Arkusz tygodniowyNowa karta tworzona automatycznie dla danego tygodnia.
Walidacja danychArkusz pilnuje wartości obecności i chroni formuły.
Podsumowanie tygodniaFrekwencja zawodników i obecność całej grupy.
Podsumowanie miesiącaZebranie danych z kolejnych tygodni.
Raport mailowyWysyłka do trenerów i trenerki koordynatorki.
Struktura zakładek w arkuszu: tygodnie oraz podsumowania miesięczne
Automatycznie tworzone tygodnie i podsumowania miesięczne ograniczały ręczne kopiowanie arkuszy.
Fragment kodu Google Apps Script tworzącego arkusze tygodniowe
Część automatyzacji odpowiadała za tworzenie arkuszy, daty, zabezpieczenia i raporty. Kod rozbiję dokładniej w kolejnych częściach serii.

Co to realnie ułatwiło

Największą zmianą nie było samo liczenie procentów. Największą zmianą było uporządkowanie procesu.

Automatyzacja pomagała w kilku konkretnych rzeczach:

  • tworzeniu nowych arkuszy tygodniowych,
  • ustawianiu dat treningów,
  • pilnowaniu poprawnego formatu danych,
  • ochronie formuł i kluczowych zakresów,
  • ukrywaniu starych albo niepotrzebnych kart,
  • liczeniu frekwencji zawodników i całych grup,
  • przygotowywaniu raportów tygodniowych i miesięcznych,
  • wysyłaniu podsumowań do odpowiednich osób.

Dzięki temu trener mógł skupić się na wpisaniu danych treningowych, a nie na pilnowaniu, czy arkusz znowu trzeba skopiować, sformatować i poprawić.

Ewolucja: od obecności do kilometrażu

Z czasem zmienił się też sam charakter danych. Kiedy Librus wszedł na zajęcia na basenie, część informacji o obecności można było obsłużyć w systemie szkolnym. Wtedy arkusze zaczęły pełnić inną rolę — zamiast samej obecności zaczęliśmy wpisywać kilometraż, czyli dane, których Librus nie był w stanie dobrze obsłużyć.

To pokazuje ważną rzecz: dobra automatyzacja nie musi być wieczna w jednej formie. Może zmieniać się razem z procesem. Najpierw rozwiązuje problem obecności, później zaczyna wspierać analizę wykonanej pracy.

Arkusz z kilometrażem i podsumowaniem wykonanej pracy
Gdy obecność zaczęła być obsługiwana gdzie indziej, arkusz ewoluował w stronę zapisu wykonanej pracy.

Co będzie dalej

Ten wpis jest początkiem serii o automatyzacji obecności. W kolejnych częściach pokażę, jak można było podejść do budowy takiego rozwiązania krok po kroku: od prostego arkusza, przez strukturę danych, walidację, automatyczne tworzenie tygodni, aż po raporty wysyłane z Google Apps Script.

W następnej części przejdziemy do struktury arkusza: zawodników, grup, tygodni, dat treningów i sposobu oznaczania obecności.

Czytaj część 2

Czytaj dalej w serii

Automatyzacja obecności

  1. Część 1 Problem, który warto było zautomatyzować
  2. Część 2 Jak ułożyć arkusz obecności, żeby dało się go automatyzować
Wróć do listy wpisów