Naar inhoud
lightbulb Welkom op de nieuwe kennisbank | We hebben de docs volledig vernieuwd met meer dan 160 features. Bekijk wat nieuw isarrow_forward

V8 runtime in Apps Script: voordelen en migratie

Leer wat de V8 JavaScript runtime aan Apps Script toevoegt, hoe je moderne syntax gebruikt en hoe je oude Rhino-scripts migreert nu Rhino is uitgefaseerd.

Wat is de V8 runtime

Apps Script draait je code op een JavaScript-engine. Jarenlang waren er twee runtimes: de originele Rhino-engine en de moderne V8-engine. V8 is dezelfde engine die ook Chrome en Node.js aandrijft. Sinds januari 2026 is V8 de enige beschikbare runtime.

warning

Rhino is uitgefaseerd

Google heeft de Rhino-runtime op 31 januari 2026 uitgefaseerd. Scripts die nog op Rhino stonden, draaien sindsdien niet meer. Alle projecten gebruiken nu V8. Als je een oud script tegenkomt dat stopte met werken, is een Rhino-naar-V8-migratie meestal de oorzaak.

Controleer welke runtime je project gebruikt:

Runtime van een project controleren

  1. Open de Apps Script-editor.
  2. Klik op Projectinstellingen (het tandwiel in de linkerbalk).
  3. Bekijk de optie Chrome V8-runtime gebruiken. Bij actuele projecten staat deze aan.

Moderne JavaScript-functies

V8 ondersteunt moderne ECMAScript-syntax (ES2019 en nieuwer): arrow functions, destructuring, default parameters en template literals.

const leeftijdBerekening = (geboortejaar) => new Date().getFullYear() - geboortejaar;

const {naam, email, ...rest} = {naam: 'Anna', email: 'anna@voorbeeld.nl', score: 95, actief: true};

const [eerste, tweede, ...overige] = [1, 2, 3, 4, 5];

const configuratie = {
  timeout: 30,
  maxRetries: 3,
  endpoint: 'https://api.voorbeeld.nl',
};

const {timeout = 10, maxRetries = 1, endpoint} = configuratie;
Logger.log(`Timeout: ${timeout}, Endpoint: ${endpoint}`);

Classes en overerving

class BaseVerwerker {
  constructor(naam) {
    this.naam = naam;
    this.verwerkTeller = 0;
  }

  verwerk(data) {
    this.verwerkTeller++;
    return this._verwerkImpl(data);
  }

  _verwerkImpl(data) {
    throw new Error('Implementeer _verwerkImpl in subklasse');
  }

  getStats() {
    return {naam: this.naam, verwerkt: this.verwerkTeller};
  }
}

class EmailVerwerker extends BaseVerwerker {
  constructor() {
    super('EmailVerwerker');
  }

  _verwerkImpl(data) {
    GmailApp.sendEmail(data.ontvanger, data.onderwerp, data.body);
    return true;
  }
}

class SheetVerwerker extends BaseVerwerker {
  constructor(bladNaam) {
    super('SheetVerwerker');
    this.bladNaam = bladNaam;
  }

  _verwerkImpl(data) {
    SpreadsheetApp.getActiveSpreadsheet()
      .getSheetByName(this.bladNaam)
      .appendRow(data.rij);
    return true;
  }
}
info

Waarom classes prettig zijn

In V8 gebruik je class-syntax met constructor, methods, getters/setters en extends. Dit maakt objectgeoriënteerde code veel leesbaarder dan de prototype-patronen die in Rhino nodig waren.

Template literals

function bouwEmailBody(naam, datum, bedrag) {
  return `
Beste ${naam},

Uw factuur van ${bedrag.toLocaleString('nl-NL', {style: 'currency', currency: 'EUR'})}
is ontvangen op ${datum.toLocaleDateString('nl-NL')}.

Met vriendelijke groet,
Cloud Captains
  `.trim();
}

const emailBody = bouwEmailBody('Anna Jansen', new Date(), 1250.00);
Logger.log(emailBody);

Optional chaining en nullish coalescing

function verwerkKlant(klant) {
  const stad = klant?.adres?.stad ?? 'Onbekend';
  const telefoonnummer = klant?.contact?.telefoon ?? 'Geen nummer';
  const eersteProfiel = klant?.profielen?.[0]?.type ?? 'Standaard';

  Logger.log(`${stad} | ${telefoonnummer} | ${eersteProfiel}`);
}

verwerkKlant({naam: 'Anna', adres: {stad: 'Amsterdam'}});
verwerkKlant({naam: 'Bob'});

Migratie van Rhino naar V8

Oude Rhino-code blijft werken op V8, maar je kunt hem moderniseren. Een typisch voorbeeld: een lus met var herschrijven naar filter en map.

function verwerkRijen(data) {
  const resultaten = [];
  for (var i = 0; i < data.length; i++) {
    var rij = data[i];
    if (rij[2] == true) {
      resultaten.push(rij[0] + ' ' + rij[1]);
    }
  }
  return resultaten;
}

function verwerkRijenV8(data) {
  return data
    .filter(rij => rij[2] === true)
    .map(rij => `${rij[0]} ${rij[1]}`);
}

Bekende migratievalkuilen

Naast moderniseren zijn er gedragsverschillen die een werkend Rhino-script kunnen breken op V8. Test daarom altijd grondig en controleer het uitvoeringslogboek.

Onderwerp Verschil
for...in op arrays Rhino tolereert dit, V8 geeft onverwachte resultaten. Gebruik for...of of forEach.
arguments in arrow functions Arrow functions hebben geen eigen arguments-object.
Date.parse en datumformaten V8 is strikter; gebruik expliciete datumconstructie of ISO-formaat.
Date.prototype.getYear() Verouderd; gebruik getFullYear().
Gereserveerde woorden als naam V8 weigert reserved keywords als variabele- of functienaam.
function v8_let_const_scope() {
  for (let i = 0; i < 3; i++) {
    Utilities.sleep(0);
    Logger.log(i);
  }
}
warning

Let op single-threading

V8 accepteert async/await syntactisch, maar Apps Script is single-threaded en kent geen echte asynchrone I/O. Service-aanroepen zoals UrlFetchApp of SpreadsheetApp blijven synchroon. Gebruik async/await dus niet om service-calls parallel te verwachten.

Werkt mijn oude Rhino-script nog in 2026?

Nee. Google heeft de Rhino-runtime op 31 januari 2026 uitgefaseerd. Scripts die niet waren gemigreerd, draaien sindsdien niet meer. De migratie naar V8 is daarmee geen keuze meer maar een voorwaarde om je script te laten werken.

Hoe migreer ik een script naar V8?

Activeer V8 in Projectinstellingen, controleer je code op de bekende gedragsverschillen, voer alle tests uit en publiceer daarna een nieuwe versie of deployment. Voor veel identieke kopiescripts biedt Google ook een bulk-migratieprocedure.

Ondersteunt V8 async/await?

Syntactisch wel, maar Apps Script blijft single-threaded zonder echte asynchrone I/O. Service-aanroepen voer je gewoon synchroon uit.

Welke functies werken alleen in Rhino?

Praktisch geen. Wel verdwenen er verouderde constructies zoals XML-literals, Object.prototype.toSource() en conditionele catch-clausules. Die moet je vervangen door moderne equivalenten.

Hoe controleer ik in code op welke runtime ik draai?

Sinds 2026 draait alles op V8, dus een runtime-check is overbodig. Wil je het toch programmatisch weten, dan is typeof globalThis !== 'undefined' waar in V8.

V8 brengt moderne JavaScript naar Apps Script. Arrow functions, destructuring, classes en template literals maken je code korter, leesbaarder en minder foutgevoelig. Omdat Rhino is uitgefaseerd, draait elk project nu op V8.