code.gs is de standaard file name van een Apps Script en wordt je als eerste aangeboden.
Je kan dit gebruiken om je hoofdprogramma in te schrijven, waarbij je gebruik maakt van extra code files voor andere stukken code
De volgende code geeft je een frame om te starten met een programma door de onInstall en onOpen simple triggers te definiëren.
Verdere code binnen deze onderdelen kan je toevoegen.
/**
* @NotOnlyCurrentDoc
*/
/**
* The event handler triggered when installing the add-on.
* @param {Event} e The onInstall event.
*/
function onInstall(e) {
onOpen(e);
}
/**
* The event handler triggered when opening the spreadsheet.
* @param {Event} e The onOpen event.
*/
function onOpen(e) {
}
De onOpen handler kan gebruikt worden om een add-on menu structuur te voorzien in je sheet.
De functies die je aanroept kunnen geen parameters hebben en worden best in code.gs gezet.
/**
* AliassesWrite
* Write sheet aliasses to FS
*/
function AliassesWrite(){
AliasEmailsWrite("Aliasses", "AliasEmails")
}
/**
* The event handler triggered when opening the spreadsheet.
* @param {Event} e The onOpen event.
*/
function onOpen(e) {
var ui = SpreadsheetApp.getUi()
var menu = ui.createAddonMenu()
menu
.addItem('Config Firestore connection', 'setKeyFile')
.addItem('Crawler','Crawler' )
.addItem('Write Aliasses','AliassesWrite')
.addToUi();
}
Het gebruik van properties laat je toe om een vorm van "globale setting/variable" toe te kennen, die je nadien kan gebruiken in je code.
Wanneer we de code bekijken van setKeyFile(), kunnen we hierin verschillende onderdelen herkennen.
We gebruiken twee van de drie soorten properties, zijnde deze die gekoppeld zijn aan een specifieke gebruiker
var userProperties = PropertiesService.getUserProperties();
en deze die gekoppeld zijn aan het document
var docProperties = PropertiesService.getDocumentProperties();
De rede is, dat een specifieke gebruiker toegang heeft tot de api key file, maar we toch wensen dat achteraf het script kan worden uitgevoerd in dit document, ongeacht de gebruiker.
Anders gezegd: enkel een admin gebruiker mag de koppeling opzetten met een FireStore DB, maar iedereen mag ze gebruiken, die toegang heeft tot dit document op de shared drive.
Het lezen van een property waarde doe je dmv docProperties.getProperty('Collection')
op de toegekende var.
Het schrijven van een waarde doe je dmv
docProperties.setProperty('RecCount', 0)
waarbij de eerste parameter de key is en de tweede de value.
De bepaling van een user, doc, of script propertie gebeurt dus bij de toekenning van de variabele.
Om een app te maken die "automatisch" loopt, dien je een "trigger" te voorzien.
In dit voorbeeld zijn twee triggers voorzien, voor een sheet die gekoppeld is aan een formulier.
we herkennen de trigger die ontstaat bij het indienen van het formulier
onFormSubmit()
en deze die gebeurt bij het editeren van het formulier
onEdit()
De try/catch omkadering van het script zorgt ervoor dat een fout bij de uitvoering (geen access tot db, foute key etc) resulteerd in een alert message, zodat de gebruiker geĂŻnformeerd wordt.
Tevens wordt er een foutmelding in de Execution log geschreven
Logger.log(e)
die nadien raadpleegbaar is door de maker van het script.
Het vragen naar gegevens en het verwerken ervan kan je via de SpreadsheetApp.getUi() interface.
Met
ui.alert(`Unable to read key file`)
kan je de user informeren.
Met
var uiValue = ui.prompt('Please provide your Private key file URL.', ui.ButtonSet.OK);
kan je de user een waarde laten invullen, waarna deze op OK moet drukken.
Het lezen van de ingevulde waarde doe je door aan de toegekende var de waarde te vragen met
uiValue.getResponseText()
/**
* Get keyfile URl and save it to a userPoperty of the script.
* Set installable triggers onFormSubmit and OnEdit
*
*/
function setKeyFile() {
try { //Set userProperty
var ui = SpreadsheetApp.getUi();
var userProperties = PropertiesService.getUserProperties();
//const Key_file = 'api.key';
var docProperties = PropertiesService.getDocumentProperties();
//config only 1 time per document
let collectionval = docProperties.getProperty('Collection')
Logger.log(`Collection =${collectionval}`)
if (collectionval == "" || collectionval == null) {
var uiValue = ui.prompt('Please provide your Private key file URL.', ui.ButtonSet.OK);
userProperties.setProperty('Key_file', uiValue.getResponseText());
Logger.log(`readfile =${uiValue.getResponseText()}`)
const read = readKeyFile(userProperties.getProperty('Key_file'));
if (read) {
Logger.log(`readfile =${read}`)
uiValue = ui.prompt('Please provide FireStore Collection.', ui.ButtonSet.OK);
docProperties.setProperty('Collection', uiValue.getResponseText());
docProperties.setProperty('RecCount', 0)
Logger.log(`Collection= ${uiValue.getResponseText()}`)
//Create installable trigger for form submission and onEdit
var sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("WriteToFireStore")
.forSpreadsheet(sheet)
.onFormSubmit()
.create();
ScriptApp.newTrigger("WriteToFireStoreAll")
.forSpreadsheet(sheet)
.onEdit()
.create();
//WriteToFireStoreAll();
} else {
ui.alert(`Unable to read key file`)
}
} else {
ui.alert(`Connection exist to Firestore DB collection /${docProperties.getProperty('Collection')}`)
}
} catch (e) {
ui.alert(e)
Logger.log(e)
}
}