Indienen: Wanneer een speler bewijsmateriaal uploadt of een trainer zich aanmeldt, roept de frontend de dienVerzoekIn functie aan.
Queue: Het verzoek komt automatisch in de tabel VERZOEKEN_QUEUE te staan.
Notificatie: De beheerders (PadelStijn@gmail.com en Stijn.Gabeler@gmail.com) ontvangen direct een e-mail via MailApp.
Goedkeuring: Zodra de beheerder de status in de sheet aanpast naar GOEDGEKEURD, zorgt het script automatisch dat de juiste rollen worden toegekend en dat de gebruiker per e-mail op de hoogte wordt gebracht.
/**
* PadelOS - Certificering & Onboarding Workflow
* Beheerders: PadelStijn@gmail.com & Stijn.Gabeler@gmail.com
*/
const ADMIN_EMAILS = ["PadelStijn@gmail.com", "Stijn.Gabeler@gmail.com"];
/**
* Functie om een verzoek in te dienen (Speler certificering of Trainer aanmelding)
*/
function dienVerzoekIn(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("VERZOEKEN_QUEUE") || ss.insertSheet("VERZOEKEN_QUEUE");
var userId = e.parameter.userId || "Onbekend";
var type = e.parameter.type || "SPELER_CERTIFICERING"; // SPELER_CERTIFICERING of TRAINER_ONBOARDING
var bewijsUrl = e.parameter.bewijsUrl || "";
var toelichting = e.parameter.toelichting || "";
var datum = new Date();
// Wegschrijven naar de queue sheet
sheet.appendRow([userId, type, "IN_BEHANDELING", bewijsUrl, toelichting, datum]);
// Notificatie sturen naar de Administrators
stuurAdminNotificatie(type, userId, toelichting);
return ContentService.createTextOutput(JSON.stringify({"status": "SUCCESS", "message": "Verzoek succesvol ingediend!"}))
.setMimeType(ContentService.MimeType.JSON);
}
/**
* Functie waarmee de Admin het verzoek goedkeurt of afwijst
*/
function verwerkVerzoekAdmin(rowindex, nieuweStatus, rolCode) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("VERZOEKEN_QUEUE");
var range = sheet.getDataRange().getValues();
if (rowindex < 1 || rowindex >= range.length) return;
var userId = range[rowindex][0];
var type = range[rowindex][1];
// Status bijwerken in de queue
sheet.getRange(rowindex + 1, 3).setValue(nieuweStatus); // Kolom 3 = Status
if (nieuweStatus === "GOEDGEKEURD") {
toeKennenRolEnCertificaat(userId, type, rolCode);
}
}
/**
* Kent de juiste rollen en status toe aan de gebruiker
*/
function toeKennenRolEnCertificaat(userId, type, rolCode) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (type === "SPELER_CERTIFICERING") {
// Update profiel status naar Certified
var profielSheet = ss.getSheetByName("PROFIELEN");
updatetabelWaarde(profielSheet, "USER_ID", userId, "CERTIFIED_STATUS", "JA");
} else if (type === "TRAINER_ONBOARDING") {
// Voeg rol toe in GEBRUIKER_ROLLEN
var rollenSheet = ss.getSheetByName("GEBRUIKER_ROLLEN");
rollenSheet.appendRow([generateId("ROL"), userId, rolCode || "TRAINER", "ACTIVE"]);
// Voeg toe aan trainer beschikbaarheid / poule
var trainerSheet = ss.getSheetByName("TRAINER_BESCHIKBAARHEID");
trainerSheet.appendRow([generateId("TR"), userId, "BESCHIKBAAR", new Date(), "", "Regionale Poule", "ACTIVE"]);
}
// Stuur bevestigingsmail naar de gebruiker
stuurGebruikerBevestiging(userId, type, nieuweStatus = "GOEDGEKEURD");
}
/**
* Stuurt e-mailnotificatie naar de administrators
*/
function stuurAdminNotificatie(type, userId, toelichting) {
var onderwerp = "PadelOS - Nieuw verzoek: " + type;
var bericht = "Er is een nieuw verzoek ingediend in PadelOS.\n\n" +
"Type: " + type + "\n" +
"Gebruiker ID: " + userId + "\n" +
"Toelichting: " + toelichting + "\n\n" +
"Log in op het beheerpaneel om dit goed te keuren.";
ADMIN_EMAILS.forEach(function(adminEmail) {
MailApp.sendEmail(adminEmail, onderwerp, bericht);
});
}
/**
* Stuurt e-mail naar de gebruiker over de status van het verzoek
*/
function stuurGebruikerBevestiging(userId, type, status) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var gebruikersSheet = ss.getSheetByName("GEBRUIKERS");
var email = zoekWaardeInSheet(gebruikersSheet, "ID", userId, "EMAIL");
if (!email) return;
var onderwerp = "Update over je PadelOS verzoek: " + type;
var bericht = "Goed nieuws! Je verzoek (" + type + ") is door de beheerder beoordeeld en heeft de status: " + status + " gekregen.\n\n" +
"Je kunt nu gebruikmaken van de bijbehorende functionaliteiten in PadelOS.";
MailApp.sendEmail(email, onderwerp, bericht);
}
/**
* Hulpfuncties voor databeheer
*/
function zoekWaardeInSheet(sheet, zoekKolom, zoekWaarde, doelKolom) {
var data = sheet.getDataRange().getValues();
var headers = data[0];
var zCol = headers.indexOf(zoekKolom);
var dCol = headers.indexOf(doelKolom);
for (var i = 1; i < data.length; i++) {
if (data[i][zCol] == zoekWaarde) {
return data[i][dCol];
}
}
return null;
}
function updatetabelWaarde(sheet, zoekKolom, zoekWaarde, doelKolom, nieuweWaarde) {
var data = sheet.getDataRange().getValues();
var headers = data[0];
var zCol = headers.indexOf(zoekKolom);
var dCol = headers.indexOf(doelKolom);
for (var i = 1; i < data.length; i++) {
if (data[i][zCol] == zoekWaarde) {
sheet.getRange(i + 1, dCol + 1).setValue(nieuweWaarde);
break;
}
}
}
function generateId(prefix) {
return prefix + "_" + Math.random().toString(36).substr(2, 9).toUpperCase();
}
Het specifieke goedkeuringsscherm en een automatische e-mailnotificatie voor een certificering is ontwikkelt in Google Apps Script 25.09.2026 door Stijn Gabeler.eu