Blogi

Googlen taulukkolaskennan käyttö sovelluksen backendinä

Henri Vesala Teknologia

MVP-ajatteluun kuuluu epäolennaisten asioiden karsiminen, jotta päästäisiin mahdollimman nopeasti ja edullisesti itse päämäärään. Tälläinen epäolennaisuus voisi olla esimerkiksi yksinkertaisten sovelluksen sisällönhallinta, jonne vain tarkkaan rajatulla joukolla on pääsy ja muokkausoikeudet.

Jo yksinkertainen järjestelmä, jossa pääkäyttäjä kirjautuu sisään, jotta hän voisi muokata sivuilla näkyvää tietoa, vaatii tietokantaa, sisäänkirjautumismekanismia, sekä varsinaista työkalua tiedon muokkaamiseen. Ohjelmistokehityksen lisäksi järjestelmä vaatisi myös tietokannan tai vastaavan ratkaisun, johon tieto tallennettaisiin. Tämä tuo taas lisää ylläpitotyötä, koska tietokanta on aina syytä päivittää tietoturvalliseksi. Tällaisen järjestelmän kehittäminen ja ylläpito on triviaalia, mutta vievät kuitenkin oman aikansa, joka voitaisiin käyttää mahdollisesti johonkin oleellisempaan.

Vaihtoehtoinen tapa toteuttaa ylläoleva toiminnallisuus on käyttää Googlen tarjoamaa selainpohjaista taulukkolaskentaa sovelluksen backendinä. Yllä kuvatut vaiheet ovat tällöin jo valmiiksi osa Googlen taulukkolaskentaa ja ainoaksi ratkaistavaksi ongelmaksi jää miten tiedon saa siirrettyä Googlelta kehitettävänä olevaan järjestelmään.

Fraktio lamantiini

Hyvää

    1. Ulkoistat varsinaisen tiedon ylläpidon (tietokannan) Googlelle, joka on pomminvarma tapa pitää tiedot aina saatavilla.
    2. Taulukkolaskenta on useimmille tuttu ja ymmärrettävä tiedon visuaalinen esitysmuoto.
    3. Ilmainen.
    4. Taulukon ylläpidon voi jakaa myös muiden ihmisten kanssa. Google tarjoaa kattavan käyttöoikeuksien hallinnan sen ylläpitämiin dokumentteihin.
    5. Google tarjoaa myös API:n tiedon viemiseen suoraan taulukkolaskentaan. Kätevään PHP-integraatioon on olemassa myös valmis Zend Framework 2 kirjasto: Zend Framework 2 – Using Google Spreadsheets. Tämä kirjasto mahdollistaa monimutkaisemman ja tietoturvallisemman integraation.
    6. Tallennettu tieto voidaan viedä muihin taulukkolaskentaohjelmiin tai CSV:n avulla tietokantaan käyttäen Googlen omia työkaluja.

Huonoa

    1. Ei sovellu kuin yksinkertaisiin tietorakenteisiin.
    2. Taulukko ei ole ole tehokas tapa käsitellä tietoa, jos sitä on paljon.
    3. Taulukon käyttäjä on täysin vastuussa siitä, ettei hän vahingossa muokkaa/poista vääriä rivejä. Syötteiden oikeellisuutta ei myöskään tarkasteta.
    4. Myöhemmin kuvatun ratkaisun kaltaisessa toteutuksessa kuka tahansa skriptisi osoitteen tunteva voi hakea kaiken tietosi, joten ratkaisu ei sovi arkaluontoisen tiedon säilyttämiseen.

Fraktio lamantiini

Tekninen tauhka

Seuraavaksi käydään läpi tekniikkaa, eli miten homma hoidetaan kotiin käytännössä:

    1. Tehdään uusi Google spreadsheet ja lisätään sinne halutut tiedot (Sheet1)
    2. Kyseistä skriptiä pääsee muokkaamaan spreadsheetin kautta: Tools -> Script editor
    3. Syötetaan alla oleva skripti editoriin ja muutetaan SPREADSHEET_ID ja SHEETjulkaistavaa spreadsheettia vastaavaksi.
      var SPREADSHEET_ID = '0AuIeE4iT5yi2dGVOM2J5a0hWNnNpVFRxWGxIVHItcnc';
      var SHEET = 'Json Sheet';
      
      function doGet(request) {
          var callback = request.parameters.jsonp;
          var range = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET).getDataRange();
          var jsonp = callback + '(' + Utilities.jsonStringify(range.getValues()) + ')';
          return ContentService.createTextOutput(jsonp).setMimeType(ContentService.MimeType.JAVASCRIPT);
      }
      
    4. Skripti pitää ajaa kertaalleen, jolloin se pyytää oikeutta päästä käsiksi sille syötettyyn spreadsheettiin. Ilman ajoa saat “authorization required” -ilmoituksia jatkossa.
    5. Julkaise skripti: Publish -> Deploy as web app... ja valitse, että anonyymit voivat käyttää skriptiä.
    6. Skriptisi on nyt julkinen, ja se palauttaa spreadsheetin tiedon JSONP:nä.
    7. Skripti ottaa vastaan JSONP-parametrin, jolla voi määrittää funktion mitä kutsutaan: ...exec?jsonp=example
    8. Kirjoitetaan ohjelmakoodi, joka osaa lukea JSONP:tä. Alla JavaScript-esimerkki.
      function example(content) {
          console.log(content);
      }
      
      var script = document.createElement('script');
      script.src = 'https://script.google.com/macros/s/SPREADSHEET_ID/exec?jsonp=example';
      document.body.appendChild(script);
      

PÄIVITYS 2014.11.03

Huomasin hiljattain, että scripti ei enää toimi chromella. Tämä johtuu siitä, että MIME-tyyppi ei ollut suoritetavaa javascriptiä vaan JSON:ia. Pienellä korjauksella homma toimii taas. Huomioikaa, että uusi korjattu skripti pitää julkaista uudelleen uudella versionumerolla.

Eli rivi: ~~return ContentService.createTextOutput(jsonp).setMimeType(ContentService.MimeType.JSON);~~ Korvataan tällä: return ContentService.createTextOutput(jsonp).setMimeType(ContentService.MimeType.JAVASCRIPT);

Asiaa korjatessani huomasin ilokseni, että google tarjoaa nykyään natiivisti mahdollisuuden saada taulukkolaskennassa olevat tiedot ulos JSONP:nähttps://spreadsheets.google.com/feeds/list/0AuIeE4iT5yi2dGVOM2J5a0hWNnNpVFRxWGxIVHItcnc/1/public/basic?alt=json-in-script&callback=example

Huomattavana erona tässä ja aikaisemmassa toteutuksessa on saatavan datan määrä ja rakenne. Uusi natiivi tapa antaa mahdollisuuden tarkastella mm. kenttien päivitys aikoja, eikä erillistä skriptiä siis tarvita. Haittapuolena on, että suurin osa tästä nice to have datasta on turhaa.