Własne funkcje w Google Spreadsheets

Od czasów powsta­nia Google Docs (a szcze­gól­nie Spre­ad­she­ets) zasta­na­wia­łem się czy da się zrobić w tym coś konkret­nego. Mam tu na myśli własne funk­cje, jakieś wykresy, a nie tylko „wylicz mi sumę z pól A1:A5”. Doku­men­ta­cja prawie tylko po angiel­sku, do tego jesz­cze często mało obszerne infor­ma­cje na temat np. tytu­ło­wych custom func­tions.

Jako iż wynaj­muję miesz­ka­nie, co miesiąc muszę poświę­cać 10 min. aby wyli­czyć właści­cie­lowi należną mu kwotę za media. To o 9 min. za dużo! A pomy­lić się po drodze jesz­cze można… Ułatwi­łem sobie tworząc arkusz, który wymaga tylko wpisa­nia liczby z licznika.

Stwo­rzymy sobie arkusz kalku­la­cyjny w Google Spre­ad­she­ets (jeżeli oczy­wi­ście komuś nie prze­szka­dza, ż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ęp­ni­łem wszyst­kim „arkusz badaw­czy” do wglądu. Może­cie oglą­dać, ale nie może­cie nic zmie­niać (zaraz bym tam czytał o powięk­sza­niu peni­sów). Natu­ral­nie powpi­sy­wa­łem losowe warto­ści, to się nie sugerować :-)

Własne funk­cje w G. Docs możemy sobie pisać w Java­scrip­cie. Tools -> Scripts -> Script Editor. W moim przy­padku zrobi­łem funk­cję wyli­cza­ją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 rzuto­wa­niem do floatów ceny jednost­ko­wej są przez to, że Google uparło się, że wszystko licz­bowe w komórce skon­wer­tuje do postaci z dwoma miej­scami po prze­cinku. Wiemy, że np. cena za KWh prądu to zazwy­czaj coś takiego jak 0,3567545487566575676 zł i trzeba użyć pola tekstowego :-)

Oczy­wi­ście nieład­nie by było gdyby funk­cja nie dosta­jąc żadnej warto­ści wyrzu­cała szpetny error. Dlatego jeżeli nic nie jest wpisane, wyświe­tla w komórce czekam na dane… Dodat­kowo pod sam koniec przy wyli­cza­niu różnicy robimy proste spraw­dze­nie czy ktoś nie „mach­nął się” odczy­tu­jąc z licz­nika mniej­szą wartość od poprzed­niej. Zapewne od razu zapy­ta­cie: a co jak mi wymie­nili licz­nik? Na mój gust trzeba by wpisać jedno­ra­zowo jakiś offset przy przej­ściu ze starego licz­nika na nowy, np.: =liczMedium(E6;F6;G5;475+G6).

Zuży­cie roczne wyli­czam poprzez =(MAX(G3:G14)-MIN(G3:G14), czyli szukam maksy­mal­nej i mini­mal­nej liczby i odej­muję. Jeżeli zmie­nili nam licz­nik to znowu będziemy mieli zafał­szo­wane dane. Należy wydzie­lić zakres starego licz­nika i nowego np. tak: =(MAX(G3:G5)-MIN(G3:G5))+(MAX(G6:G14)-MIN(G6:G14)).

Na koniec zapewne zapy­ta­cie jak zrobić taki do niczego nam niepo­trzebny baje­rancki wykres? Ano żeby go zrobić, potrze­bu­jemy zgru­po­wać poroz­rzu­cane dane w jednej tabelce. Najle­piej zrobić to w osob­nym arku­szu (u mnie Sheet2) linku­ją­cym do komó­rek z pierw­szego arku­sza. Aby odwo­łać się wpisu­jemy =Sheet1!A1. Wykres z kolei linkuje do zakresu z drugiego arku­sza =Sheet2!A1:E13

Jak coś jest niezro­zu­miałe to pytać. Wpis dedy­kuję wszyst­kim „wynaj­mo­wa­czom” nieuto­pio­nym w doży­wot­nim kredy­cie hipo­tecz­nym, peace!

Podobne wpisy:

  1. The Google has you? (czy jesz­cze nie?)
  2. Google Chrome — pierw­sze wrażenia
  3. Last.fm — wpędza­nie się w kłopoty na własne życzenie?
  4. O tym jak A. Hitler prze­mó­wił w niemych filmach

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <p> <pre lang="" line="" escaped=""> <q cite=""> <strike> <strong>