Een externe API aanroepen vanuit Apps Script opent de deur naar elke dienst met een REST-API. Je koppelt Workspace aan betaalproviders, CRM-systemen, AI-modellen of je eigen backend. In dit artikel leer je GET- en POST-requests sturen met UrlFetchApp, authenticatie toevoegen, de respons verwerken en fouten netjes afvangen.
De basis: UrlFetchApp
Alle HTTP-verkeer naar buiten loopt via UrlFetchApp.fetch(). In de eenvoudigste vorm geef je alleen een URL mee en krijg je een respons-object terug:
function haalData() {
const response = UrlFetchApp.fetch('https://api.voorbeeld.nl/status');
const tekst = response.getContentText();
const data = JSON.parse(tekst);
Logger.log('Status: ' + data.status);
}
getContentText() geeft de body als string, die je met JSON.parse() omzet naar een bruikbaar object.
UrlFetchApp-opties
Het tweede argument van fetch() is een opties-object met velden als method, headers, payload, contentType, muteHttpExceptions, followRedirects en timeoutSeconds. De standaard time-out is 360 seconden. De volledige lijst staat op developers.google.com/apps-script/reference/url-fetch. Lees die voordat je de structuur gokt.
Een POST-request met JSON
Voor het versturen van data gebruik je een POST met een JSON-payload:
function stuurData() {
const payload = { naam: 'Patrick', actie: 'registreer' };
const opties = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload)
};
const response = UrlFetchApp.fetch('https://api.voorbeeld.nl/registreer', opties);
Logger.log(response.getResponseCode());
}
Let op: payload moet een string zijn bij JSON, dus gebruik altijd JSON.stringify(). Voor de andere HTTP-werkwoorden zet je method op get, post, put, patch of delete.
Authenticatie met een API-sleutel
De meeste API's vereisen authenticatie via een header, vaak een Bearer-token of een API-sleutel. Bewaar die sleutel veilig in de Script Properties:
function authRequest() {
const sleutel = PropertiesService.getScriptProperties().getProperty('API_KEY');
const opties = {
method: 'get',
headers: {
'Authorization': 'Bearer ' + sleutel
}
};
const response = UrlFetchApp.fetch('https://api.voorbeeld.nl/profiel', opties);
return JSON.parse(response.getContentText());
}
Zet sleutels nooit in je broncode
Zet API-sleutels en wachtwoorden nooit hardgecodeerd in je broncode. Iedereen met toegang tot het script ziet ze dan, en bij deling lekken ze direct. Bewaar geheimen in PropertiesService.getScriptProperties() en lees ze pas op het moment van gebruik uit.
Fouten netjes afvangen
Standaard gooit fetch() een uitzondering bij een foutcode zoals 404 of 500, waardoor je script stopt. Met muteHttpExceptions: true krijg je de respons toch terug en kun je zelf op de statuscode reageren:
function veiligeFetch() {
const opties = { method: 'get', muteHttpExceptions: true };
const response = UrlFetchApp.fetch('https://api.voorbeeld.nl/data', opties);
const code = response.getResponseCode();
if (code === 200) {
return JSON.parse(response.getContentText());
}
Logger.log('Fout ' + code + ': ' + response.getContentText());
return null;
}
Mute en check de statuscode
Zet bij externe API's altijd muteHttpExceptions: true en controleer zelf de responscode. Zo onderscheid je een geslaagde aanroep van een fout, log je nuttige informatie en stopt je hele script niet bij een enkele mislukte request.
De vier stappen op een rij
Elke API-koppeling volgt hetzelfde patroon:
- URL bepalen: kies het juiste endpoint van de externe API.
- Opties bouwen: stel
method,headersenpayloadin. - Aanroepen: roep
UrlFetchApp.fetch()aan metmuteHttpExceptions: true. - Verwerken: controleer de responscode en parse de JSON-respons.
Meerdere requests tegelijk
Moet je tientallen aanroepen doen, bijvoorbeeld een rij in een spreadsheet per regel verrijken, dan is een loop met losse fetch-aanroepen traag. Met UrlFetchApp.fetchAll() voer je een lijst requests parallel uit:
function batchRequests() {
const requests = [
{ url: 'https://api.voorbeeld.nl/a', muteHttpExceptions: true },
{ url: 'https://api.voorbeeld.nl/b', muteHttpExceptions: true }
];
const responses = UrlFetchApp.fetchAll(requests);
return responses.map(r => r.getResponseCode());
}
Let op het dagelijkse quotum voor UrlFetchApp-aanroepen op je accounttype en de time-out van standaard 360 seconden per aanroep.
Een API-koppeling opzetten
- Lees de API-documentatie en noteer endpoint, methode en authenticatie.
- Zet je API-sleutel in Project-instellingen, Scripteigenschappen.
- Bouw een functie met het juiste opties-object en
muteHttpExceptions: true. - Test eerst met een eenvoudig GET-endpoint en log de respons.
- Voeg foutafhandeling toe en verwerk de data verder in Workspace.
Hoe verstuur ik formuliergegevens in plaats van JSON?
Laat contentType weg of zet hem op application/x-www-form-urlencoded en geef payload als object mee; Apps Script codeert het dan automatisch naar form-data.
Mijn request geeft een 403, wat nu?
Vaak een authenticatieprobleem. Controleer of je sleutel klopt, of de header de juiste naam heeft en of je account toegang heeft tot het endpoint.
Kan ik meerdere requests tegelijk doen?
Ja, met UrlFetchApp.fetchAll() voer je een lijst requests parallel uit, wat veel sneller is dan een loop met losse fetch-aanroepen.
Waar bewaar ik mijn API-sleutel veilig?
In PropertiesService.getScriptProperties(). Die waarden staan los van je broncode en lekken niet mee bij het delen van het script.
Waarom krijg ik een time-out bij een trage API?
Een enkele fetch wacht standaard maximaal 360 seconden. Reageert de API niet binnen die tijd, dan faalt de aanroep. Zet zo nodig timeoutSeconds lager en bouw een nieuwe poging in plaats van eindeloos wachten.
Hoe debug ik wat ik precies verstuur?
Gebruik UrlFetchApp.getRequest(url, opties). Die geeft het samengestelde request terug zonder het te versturen, zodat je headers en payload kunt inspecteren voordat je het echt afvuurt.
Volgende stap
Met UrlFetchApp koppel je Workspace aan de buitenwereld. Wil je juist data ontvangen van externe systemen, lees dan webhooks ontvangen en verwerken. Voor het veilig en onderhoudbaar houden van dit soort koppelingen, zie best practices.