Dit script leest een Spreadsheet met de kolommen email, voornaam, achternaam, wachtwoord en OU, en maakt voor iedere rij een Workspace-account aan. Handig als je tientallen nieuwe medewerkers in één keer wilt onboarden zonder het admin-paneel rij voor rij te doorlopen.
Je hebt hiervoor een super-admin account nodig (of een service-account met domain-wide delegation) en de Admin SDK Directory-service moet aan staan in je domein.
Voorbereiding
Zet eerst de juiste kolommen klaar in je Spreadsheet. Gebruik rij 1 als koprij en begin de gebruikersdata op rij 2. Een zesde kolom houden we leeg, daar schrijft het script de status (OK of een foutmelding) terug.
Apps Script en de Admin SDK klaarzetten
- Open een nieuw Apps Script-project op script.google.com.
- Klik in het linkermenu op Services (het plusje) en voeg Admin SDK API toe. De service heet in code
AdminDirectory. - Plak het script hieronder en vervang
VERVANG_DOOR_SHEET_IDdoor de ID uit de URL van je Spreadsheet. - Draai de functie één keer handmatig en accepteer de OAuth-toestemming met je super-admin account.
Script
function createUsersFromSheet() {
const sheetId = 'VERVANG_DOOR_SHEET_ID';
const sheet = SpreadsheetApp.openById(sheetId).getSheets()[0];
const rows = sheet.getDataRange().getValues();
for (let i = 1; i < rows.length; i++) {
const [email, firstName, lastName, password, orgUnit] = rows[i];
if (!email) continue;
try {
AdminDirectory.Users.insert({
primaryEmail: email,
name: { givenName: firstName, familyName: lastName },
password: password || generatePassword(),
changePasswordAtNextLogin: true,
orgUnitPath: orgUnit || '/'
});
sheet.getRange(i + 1, 6).setValue('OK');
} catch (e) {
sheet.getRange(i + 1, 6).setValue('FOUT: ' + e.message);
}
}
}
function generatePassword() {
const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789!@#$%';
let out = '';
for (let i = 0; i < 16; i++) {
out += chars.charAt(Math.floor(Math.random() * chars.length));
}
return out;
}
De toevoeging changePasswordAtNextLogin: true dwingt de gebruiker bij de eerste login een eigen wachtwoord te kiezen. De generatePassword-helper springt in zodra een wachtwoordcel leeg is, zodat je geen wachtwoorden in het sheet hoeft te zetten.
Veiligheid
Zet geen wachtwoorden in het sheet
Wachtwoorden in een Spreadsheet zijn leesbaar voor iedereen met deelrechten en blijven in de revisiegeschiedenis staan. Laat het script de wachtwoorden genereren en zet changePasswordAtNextLogin op true, zodat de gebruiker direct een eigen wachtwoord kiest.
Test eerst op één regel
Begin met één testrij in een aparte test-OU. Controleer of het account correct verschijnt in de Admin Console voordat je de hele lijst laat lopen. Zo voorkom je dat een fout in je kolomvolgorde tientallen verkeerde accounts oplevert.
Een paar aandachtspunten:
- Het script vereist een super-admin sessie of een service-account met domain-wide delegation.
- De Admin SDK kent een quotum. Bij honderden gebruikers kun je tegen rate limits aanlopen. Bouw dan een
Utilities.sleep(500)in de lus in. - Maak de doel-OU's vooraf aan in de Admin Console. Een verwijzing naar een niet-bestaande
orgUnitPathlevert een foutmelding op. - Bewaar je sheet met de statuskolom na afloop, zo heb je een audit-trail van wat wel en niet lukte.
Meer voorbeelden en de volledige methodelijst vind je in de officiële Admin SDK Directory-documentatie voor Apps Script.
Welke rechten heb ik nodig om dit script te draaien?
Je voert het script uit met een Google Workspace super-admin account, of je gebruikt een service-account met domain-wide delegation en het scope admin.directory.user. Een gewone gebruiker kan geen accounts aanmaken.
Waar vind ik de Spreadsheet-ID?
De ID is het lange stuk in de URL tussen /d/ en /edit, bijvoorbeeld in docs.google.com/spreadsheets/d/ABC123/edit is ABC123 de ID. Die plak je in de variabele sheetId.
Wat gebeurt er als een rij mislukt?
De try-catch vangt de fout op en schrijft de melding in de zesde kolom van die rij, terwijl de lus gewoon doorgaat met de volgende gebruiker. Zo blokkeert één foute regel niet de hele batch.
Kan ik gebruikers in verschillende organisatie-eenheden plaatsen?
Ja. Vul per rij het volledige pad in de OU-kolom in, bijvoorbeeld /Sales/Amsterdam. Laat je de cel leeg, dan komt de gebruiker in de root-OU / terecht. Maak de OU's vooraf aan in de Admin Console.
Hoe voorkom ik dat ik tegen rate limits aanloop bij grote lijsten?
Voeg een korte pauze toe in de lus met Utilities.sleep(500). Bij honderden accounts spreid je de aanroepen zo, of je verdeelt de lijst over meerdere runs.