Od czasów powstania Google Docs (a szczególnie Spreadsheets) zastanawiałem się czy da się zrobić w tym coś konkretnego. Mam tu na myśli własne funkcje, jakieś wykresy, a nie tylko „wylicz mi sumę z pól A1:A5”. Dokumentacja prawie tylko po angielsku, do tego jeszcze często mało obszerne informacje na temat np. tytułowych custom functions.
Jako iż wynajmuję mieszkanie, co miesiąc muszę poświęcać 10 min. aby wyliczyć właścicielowi należną mu kwotę za media. To o 9 min. za dużo! A pomylić się po drodze jeszcze można… Ułatwiłem sobie tworząc arkusz, który wymaga tylko wpisania liczby z licznika.
Stworzymy sobie arkusz kalkulacyjny w Google Spreadsheets (jeżeli oczywiście komuś nie przeszkadza, że Google oprócz tego co ma w mailach i czego szuka, będzie również wiedziało ile zużywa ciepłej wody itd.)
Udostępniłem wszystkim „arkusz badawczy” do wglądu. Możecie oglądać, ale nie możecie nic zmieniać (zaraz bym tam czytał o powiększaniu penisów). Naturalnie powpisywałem losowe wartości, to się nie sugerować :-)
Własne funkcje w G. Docs możemy sobie pisać w Javascripcie. Tools -> Scripts -> Script Editor. W moim przypadku zrobiłem funkcję wyliczającą miesięczną opłatę za konkretne medium. Wyglada tak:
function liczMedium(stalaOplata, cenaJednostkowa, staryStan, nowyStan) { if (staryStan == '' || nowyStan == '') return 'czekam na dane...'; else if (typeof staryStan != 'number' || typeof nowyStan != 'number') return 'stany licznika musza byc liczba!'; if (cenaJednostkowa == '') return 'Nie podano ceny jednostkowej!'; stalaOplata = (stalaOplata == '')?0:stalaOplata; // nie kazde medium ma opate przesylowa stalaOplata = parseFloat(stalaOplata); // rzutuj do floata cenaJednostkowa = parseFloat(cenaJednostkowa); // rzutuj do floata var roznica = parseFloat(nowyStan - staryStan); // roznice tez do floata if (roznica < 0) return 'Błąd - nowy stan licznika nie może być mniejszy od starego'; return stalaOplata + (cenaJednostkowa * roznica); // dla kazdego medium takie samo dzialanie }
Te dziwne machloje z rzutowaniem do floatów ceny jednostkowej są przez to, że Google uparło się, że wszystko liczbowe w komórce skonwertuje do postaci z dwoma miejscami po przecinku. Wiemy, że np. cena za KWh prądu to zazwyczaj coś takiego jak 0,3567545487566575676 zł i trzeba użyć pola tekstowego :-)
Oczywiście nieładnie by było gdyby funkcja nie dostając żadnej wartości wyrzucała szpetny error. Dlatego jeżeli nic nie jest wpisane, wyświetla w komórce czekam na dane… Dodatkowo pod sam koniec przy wyliczaniu różnicy robimy proste sprawdzenie czy ktoś nie „machnął się” odczytując z licznika mniejszą wartość od poprzedniej. Zapewne od razu zapytacie: a co jak mi wymienili licznik? Na mój gust trzeba by wpisać jednorazowo jakiś offset przy przejściu ze starego licznika na nowy, np.: =liczMedium(E6;F6;G5;475+G6).
Zużycie roczne wyliczam poprzez =(MAX(G3:G14)-MIN(G3:G14), czyli szukam maksymalnej i minimalnej liczby i odejmuję. Jeżeli zmienili nam licznik to znowu będziemy mieli zafałszowane dane. Należy wydzielić zakres starego licznika i nowego np. tak: =(MAX(G3:G5)-MIN(G3:G5))+(MAX(G6:G14)-MIN(G6:G14)).
Na koniec zapewne zapytacie jak zrobić taki do niczego nam niepotrzebny bajerancki wykres? Ano żeby go zrobić, potrzebujemy zgrupować porozrzucane dane w jednej tabelce. Najlepiej zrobić to w osobnym arkuszu (u mnie Sheet2) linkującym do komórek z pierwszego arkusza. Aby odwołać się wpisujemy =Sheet1!A1. Wykres z kolei linkuje do zakresu z drugiego arkusza =Sheet2!A1:E13
Jak coś jest niezrozumiałe to pytać. Wpis dedykuję wszystkim „wynajmowaczom” nieutopionym w dożywotnim kredycie hipotecznym, peace!

O autorze