Hur man använder Google Sheets som en databas (ansvarsfullt)

medan databasteknik och andra verktyg har kommit långt, är det fortfarande svårt att slå det ödmjuka kalkylbladets mångsidighet och intuitivitet. Medan du använder dem för känsliga, kritiska applikationer som att lagra COVID-19-patientdata är dåligt råd, det faktum att alla vet hur man använder ett kalkylblad betyder att de är bra för mindre tvärfunktionella projekt där en icke-utvecklare kan behöva undersöka eller redigera data.

i den här guiden visar jag dig hur du använder Google Sheets som en databas, komplett med ett API-gränssnitt tillgängligt via HTTP. Vi använder Autocode, en nod.JS API-utvecklingsplattform och redaktör med inbyggd autofullständig, för att distribuera en enkel app och hantera Googles autentiseringsprocess. Jag kommer också att undersöka begränsningarna i Google Sheets, inklusive skalbarhet, och där det är vettigt att börja titta på mer komplexa alternativ.

# Returns all people in the database whose names start # with "bil", case-insensitive$ curl --request GET --url \ 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/name/istartswith/?query=bil'

du behöver inget annat än ett Google-konto och ett gratis Autocode-konto för att komma igång. Kom igen!

först måste du klona din egen kopia av mallen Google Sheet genom att klicka här och sedan trycka på Använd mall uppe till höger. Detta lägger till exempelkalkylbladet i ditt personliga Google-konto.

När du har gjort det, klicka här för att öppna startappen i Autocode. Peka runt källkoden om du vill, installera sedan appen till ditt Autocode-konto genom att trycka på den gröna knappen. När du uppmanas att länka ett Google-ark följer du instruktionerna i flödet för att länka ditt Google-konto och väljer sedan kalkylbladet du just klonade.

Efter det ska din app vara redo att gå! Försök komma åt några av slutpunkterna via deras webbadresser och se vad som returneras/vad som händer med din nya kalkylarkdatabas. Du kan kolla in avsnittet Endpoints nedan, till exempel samtal.

begränsningar

den tl; dr var lätt, eller hur? Så varför är inte allt byggt på Google Sheets?

medan en backend som tar 30 sekunder att ställa in och som alla kan interagera med är extremt tilltalande, finns det några uppenbara begränsningar. Ett kalkylblad som en databas som beskrivs ovan stöder naturligtvis inte flera tabeller eller relationer mellan rader. Det finns inte heller något begrepp att tillämpa typer för en viss kolumn, transaktioner, inbyggda säkerhetskopior eller kryptering, så känslig/kritisk data (som COVID-19 patientdata) lagras förmodligen bäst någon annanstans.

När det gäller skalbarhet har Google Sheets en hård gräns på 5 000 000 celler (inklusive tomma celler). När jag försökte verifiera detta genom att skapa ett kalkylblad med så många värden, stötte jag emellertid på betydande problem i prestanda före den tröskeln:

Massoperationer som att klistra in ett stort antal celler saktade, började sedan misslyckas vid cirka 1m celler. Navigationen var i allmänhet trög.

mina experiment kring att göra API-samtal gav liknande resultat. Query hastighet verkade skala linjärt med antalet celler:

frågor blev opraktiskt långsamma runt 500 000 cellmärket, men var fortfarande under 2 sekunder för en 100 000 cellfråga. Därför, om du förutser en dataset större än några hundra tusen celler, skulle det förmodligen vara smart att välja ett mer skalbart alternativ.

hur det fungerar

När du länkar ditt klonade Google-ark till din app och installerar det på ditt konto hanterar Autocode automatiskt autentisering mellan din app och ditt Google-konto med hjälp av appens token (se raden const lib = require('lib')({token: process.env.STDLIB_SECRET_TOKEN}) högst upp på alla slutpunkter).

för de faktiska frågorna innehåller varje slutpunkt nod.js-kod som anropar en metod från googlesheets.fråga API. Dessa API: er har en parameter som heter range formaterad i A1-notation som motsvarar den del av kalkylbladet som API-anropet ska betrakta som en del av databasen.

let queryResult = await lib.googlesheets.query.select({ range: `A:E`, bounds: 'FULL_RANGE', where: });

Arange värdet avA:E är i huvudsak stenografi för ”Använd alla rader i kolumnerna A till E i kalkylbladet som min databas”. Frågan tolkar den första raden i varje kolumn i det intervallet som fältnamnet på värdena i den kolumnen. Med tanke på mallen du klonade kommer ovanstående fråga att kontrollera alla värden i a-kolumnen (med namnet Name) för rader med ett värde som matchar frågan.

dessa API-anrop använder KeyQL-frågespråket. Om du är intresserad av ett djupt dyk kan du kolla in det för fler exempel.

anropande slutpunkter

som tidigare nämnts är dessa slutpunkter tillgängliga via HTTP, så du kan ringa till dem via fetchcURL, eller vilken annan HTTP-klient du föredrar. Du kan använda din webbläsare direkt:

och du kan till och med använda samma lib-node-Nodpaket som slutpunkterna använder för att anropa Google Sheets API: er:

dina slutpunkter svarar på antingen GET-eller POST-förfrågningar. Parametrar analyseras från querystring för GET-förfrågningar och request body för post-förfrågningar. Varje slutpunkt har standardparametrar inställda för tydlighetens skull. Du kan hitta exempel för varje slutpunkt nedan.

slutpunkter

funktioner / Välj / jobb / innehåller.js

denna slutpunkt är ett exempel på encontains KeyQL-fråga. Det Letar efter rader i det länkade Google-arket där fältet Job innehåller en substring (skiftlägeskänslig) som matchar parametern query. Från exemplarket returnerar det:

$ curl --request GET --url \ 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/job/contains/?query=ist'

funktioner/Välj/born_on/date_gt.js

denna slutpunkt är ett exempel på endate_gt KeyQL-fråga. Det Letar efter rader i det länkade Google-arket där fältet Born On är efter query parameter, formaterad som 2000/01/01. Från exemplarket returnerar det:

$ curl --request GET --url \ 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/born_on/date_gt/?query=2000/01/01'

funktioner/Välj/namn/istartswith.js

denna slutpunkt är ett exempel på enistartswith KeyQL-fråga. Det Letar efter rader i det länkade Google-arket därName fältet börjar medquery parameter (skiftlägeskänslig). Från exemplarket returnerar den:

$ curl --request GET --url \ 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/name/istartswith/?query=bil'

funktioner/infoga.js

denna slutpunkt är ett exempel på en insert-fråga. Den överför inmatningsparametrarna till parametern fieldsets I googlesheets.fråga.infoga
API. Om du till exempel vill lägga till Bill Gates I kalkylbladet kan du göra följande begäran (alla parametrar är små bokstäver):

$ curl --request POST \ --header "Content-Type: application/json" \ --data '{"name":"Bill Gates","job":"CEO","fictional":false,"bornOn":"10/28/1955"}' \ --url 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/insert/'

Obs: Autocode API: er svarar inte uteslutande en HTTP-metod över en annan, och förlitar sig istället på beskrivande namngivning för att undvika förvirring över funktionalitet.

funktioner / uppdatering.js

denna slutpunkt är ett exempel på en uppdateringsfråga. Den ställer inUpdated At – fältet för personer vars namn exakt matchar parameternname och uppdaterar andra fält baserat på inmatningsparametrar. Den använder googlesheets.fråga.uppdatera API.om du till exempel vill uppdatera fältet JobI fältet Bilbo Bagginstill Ring BearerI kalkylbladet kan du göra följande begäran (alla parametrar är små bokstäver):

$ curl --request POST \ --header "Content-Type: application/json" \ --data '{"name":"Bilbo Baggins","job":"Ring Bearer"}' \ --url 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/update/'

OBS: Detta kan påverka flera rader om mer än en rad matchar frågevillkoren.

funktioner / radera.js

denna slutpunkt är ett exempel på en delete-fråga. Det tar bort rader
av personer vars namn exakt matchar parametern name. Den använder googlesheets.fråga.radera API. Om du till exempel vill ta bort Bilbo Baggins från kalkylarket kan du göra följande begäran:

$ curl --request GET --url \ 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/delete/?name=Bilbo%20Baggins'

Obs! Detta kan påverka flera rader om mer än en rad matchar frågevillkoren.

tack!

Om du har några frågor eller feedback är det bästa att gå med i Autocode community Slack-kanalen. Du kan få en inbjudan från fliken Community i det övre fältet på webbplatsen. Du kan också nå ut till mig direkt på Twitter @Hacubu.

Om du vill hålla dig uppdaterad om det senaste från Autocode kan du följa @AutocodeHQ. Glad hacking!

Lämna ett svar

Din e-postadress kommer inte publiceras.