Addon om de resultaten van google forms, die gebruikt worden als een quiz, via hun sheet date te laten toevoegen aan een Firestore database.
Het principe kan gebruikt worden in een G4E domain om alle quiz data van alle gebruikers en cursussen op te slaan in een centrale database, of in verschillende databases of collections binnen een FS db.
De gevens die worden opgeslagen zijn:
Email address: "machielswalter@gmail.com"
Adres, indien aanwezig in de quiz
Score: 0
Totaal score wordt gegeven in %, berekening gebeurt aan de hand van de behaalde score en houd rekening met het aantal punten per vraag.
Zo kan je extra gewicht leggen op bepaalde vragen.
Timestamp: 16 May 2022 at 12:56:25 UTC+2
Dit is het tijdstip waarop het formulier werd ingediend door de gebruiker
changed: "2022-05-15T10:56:28.604Z"
Dit is het tijdstip waarop de data is aangepast in de db.
Deze tijd wordt ook aangepast indien de sheet "manueel" wordt geëditeerd, waarna alle records dezelfde tijd krijgen. (single record editing nog niet geïmplementeerd)
docname: "2B-elektrische kring_10_Mon May 16 2022 06:56:25 GMT-0400(Eastern Daylight Time)"
Deze wordt samengesteld uit de quizname en het record nummer en de datum waarop de test is afgelegd.
formURL: "https://docs.google.com/forms/d/1oVzTC_YdxnAD4Ki7ded_qtbhIkVI---/viewform"
URL waarbij de quiz kan gedaan worden
quizname: "2B-elektrische kring"
Wordt bepaald aan de hand van de Spreadsheet naam, die bestaat uit de form naam+(response) : vb 2B-elektrische kring (Responses)
responsesURL: "https://docs.google.com/forms/d/1oVzTC_YdxnAD---/edit#responses"
Deze link verwijst rechtstreeks naar de antwoord van de form, zodat detail antwoorden en overzichten kunnen bekeken worden
Iedere Form moet een unieke spreadsheet hebben, waardoor deze de naam draagt van de form.
In deze spreasheet zit maar één sheet.
Deze sheeft bevat als eerst kolommen:
Timestamp
email (optional)
score
vragen/antwoorden
De score in % wordt berekend binnen de app.
In de sheet is de voorstelling gebaseerd op aantal_behaalde_punten/max_aantal_punten
De Firestore key file wordt bewaard op een shared drive, zodat de toegang beperkt kan worden tot de user die de configuratie moet uitvoeren.
De URL moet ingegevens worden bij de configuratie van de addon en wordt bewaard in de user properties .
De data uit de key file wordt bewaard in de document properties, waardoor deze enkel geldig zijn voor dit document en enkel bekend hoeven te zijn voor diegene die de eerste config uitvoert (user die toegang heeft tot keyfile)
Het achterhalen van deze key waardes nadien wordt hierdoor onmogelijk.
Het collection path wordt meegegeven bij de configuratie en wordt, indien het niet bestaat, gegenereerd bij de eerste schrijfactie.
De schrijfactie wordt gedaan met een "update" actie met mask=true, waardoor enkel velden die niet bestaan, gemaakt worden of die bestaan geupdate worden.
let updatedoc = firestore.updateDocument(`${collectionpath}/${document.docname}`, document, mask = true);
Het manueel editeren van de sheet, eventueel om een fout email adres te corrigeren, resulteert in een update van alle records in de db en een nieuwe "changed" veldwaarde.
Het is mogelijk om simultaan verschillende "verzend" acties alsook manuele aanpassingen te hebben, waardoor de mogelijkheid zou bestaan dat er data verloren gaat.
Vermits Apps Script niet standaard de "triggers" serialiseert, is er een implementatie voorzien die dit mogelijk maakt, zodat er geen data verloren gaat en alle data uiteindelijk steeds in de Firestore database terecht komt.
Hiervoor wordt er gebruik gemaakt van lock mechanismes en recordcounters in de document property.
Hierdoor kan het script slechts individueel uitgevoerd worden en worden meerdere simultane triggers op hetzelfde formulier, geserialiseerd.
Dit verhindert ook dubbele data, die kan ontstaan door "multiple triggers" in een form, iets wat blijkbaar soms voorkomt.
LockService.getScriptLock().waitLock(300000), zorgt ervoor dat er maar één instantie van het script simultaan access heeft tot de FireStore en scriptcode.
OnFormSubmit() schrijft alle nog niet bewaarde records naar de db
OnEdit() schrijft alle records naar de db.