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

Opmaak automatiseren in Sheets

Automatiseer celstijlen, conditionele opmaak en nummervormaten in Google Sheets via Apps Script voor consistente rapportages.

Basisopmaak van cellen

Apps Script geeft je volledige controle over de visuele opmaak van cellen in Google Sheets. Je stelt achtergrondkleuren, lettertypen, randen en uitlijning in via de Range API.

function basisOpmaak() {
  const blad = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const bereik = blad.getRange('A1:E1');

  bereik.setBackground('#1A73E8');
  bereik.setFontColor('#FFFFFF');
  bereik.setFontSize(12);
  bereik.setFontWeight('bold');
  bereik.setFontFamily('Google Sans');
  bereik.setHorizontalAlignment('center');
  bereik.setVerticalAlignment('middle');
  bereik.setWrap(true);
  bereik.setRowHeight(40);
}
lightbulb

Batch je opmaak-aanroepen

Elke setBackground(), setFontColor() of vergelijkbare aanroep op een losse cel kost een aparte server-call en is traag bij grote bladen. Pas opmaak daarom toe op een zo groot mogelijk Range in één keer, in plaats van per cel in een lus.

Randen instellen

function stelRandenIn() {
  const blad = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const bereik = blad.getRange('B2:D10');

  bereik.setBorder(true, true, true, true, true, true);

  bereik.setBorder(
    true, true, true, true, true, true,
    '#DADCE0',
    SpreadsheetApp.BorderStyle.SOLID
  );

  blad.getRange('B2:D2').setBorder(
    null, null, true, null, null, null,
    '#1A73E8',
    SpreadsheetApp.BorderStyle.SOLID_MEDIUM
  );
}

De argumenten van setBorder() staan in de volgorde boven, onder, links, rechts, verticaal en horizontaal. Geef null op om een zijde ongewijzigd te laten, zoals in de derde aanroep waar alleen de onderrand wordt gezet.

Nummervormaten

function stelNummervormaten() {
  const blad = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  blad.getRange('C2:C100').setNumberFormat('€#,##0.00');
  blad.getRange('D2:D100').setNumberFormat('dd-MM-yyyy');
  blad.getRange('E2:E100').setNumberFormat('0.0%');
  blad.getRange('F2:F100').setNumberFormat('#,##0');
  blad.getRange('G2:G100').setNumberFormat('[h]:mm:ss');
}

Conditionele opmaak

function conditioneleOpmaak() {
  const blad = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const bereik = blad.getRange('B2:B100');

  const regels = blad.getConditionalFormatRules();

  const roodRegel = SpreadsheetApp.newConditionalFormatRule()
    .whenNumberLessThan(60)
    .setBackground('#FCEAEA')
    .setFontColor('#C5221F')
    .setRanges([bereik])
    .build();

  const groenRegel = SpreadsheetApp.newConditionalFormatRule()
    .whenNumberGreaterThanOrEqualTo(80)
    .setBackground('#E6F4EA')
    .setFontColor('#137333')
    .setRanges([bereik])
    .build();

  const tekstRegel = SpreadsheetApp.newConditionalFormatRule()
    .whenTextContains('URGENT')
    .setBackground('#FEF7E0')
    .setFontColor('#B06000')
    .setBold(true)
    .setRanges([blad.getRange('A2:A100')])
    .build();

  regels.push(roodRegel, groenRegel, tekstRegel);
  blad.setConditionalFormatRules(regels);
}
info

Volgorde bepaalt de winnaar

Conditionele opmaakregels worden in volgorde geëvalueerd. De eerste regel die overeenkomt, wint. Zet hogere-prioriteit regels dus eerder in de array. Begin altijd met getConditionalFormatRules() en push je nieuwe regels op die lijst, anders overschrijf je bestaande regels.

warning

setConditionalFormatRules overschrijft alles

setConditionalFormatRules() vervangt de volledige set regels op het blad. Roep je het aan zonder eerst de bestaande regels op te halen, dan verlies je alle handmatig ingestelde opmaak. Lees daarom eerst uit met getConditionalFormatRules().

Celstijlen kopiëren en wissen

function kopieerEnWisStijlen() {
  const blad = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const bronBereik = blad.getRange('A1:E1');
  const doelBereik = blad.getRange('A11:E11');

  bronBereik.copyTo(doelBereik, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);

  blad.getRange('F2:F100').clearFormat();
}

Tabellen en alternerende kleuren

function alternerendeKleuren() {
  const blad = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = blad.getDataRange();
  const aantalRijen = data.getNumRows();

  for (let i = 2; i <= aantalRijen; i++) {
    const kleur = i % 2 === 0 ? '#F8F9FA' : '#FFFFFF';
    blad.getRange(i, 1, 1, data.getNumColumns()).setBackground(kleur);
  }
}

Voor zebra-strepen op vaste tabellen is de ingebouwde knop Opmaak, Alternerende kleuren vaak sneller. De aanpak hierboven is handig wanneer je de strepen wilt aansturen vanuit een script dat ook data wegschrijft.

Bevroren rijen en kolommen

function bevriestRijenKolommen() {
  const blad = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  blad.setFrozenRows(1);
  blad.setFrozenColumns(1);

  Logger.log(`Bevroren rijen: ${blad.getFrozenRows()}`);
  Logger.log(`Bevroren kolommen: ${blad.getFrozenColumns()}`);
}

Stappenplan

Rapportage-sheet automatisch opmaken

  1. Lees de data uit een bronsheet met getDataRange().getValues().
  2. Schrijf de data naar een rapportage-sheet.
  3. Formatteer de headerrij met setBackground(), setFontWeight() en setFontColor().
  4. Stel nummervormaten in op de valuta-, datum- en percentage-kolommen.
  5. Voeg conditionele opmaak toe voor je KPI-drempelwaarden.
  6. Zet alternerende rijkleuren voor de leesbaarheid.
  7. Bevries de eerste rij en kolom met setFrozenRows(1) en setFrozenColumns(1).
Hoe verwijder ik alle conditionele opmaakregels?

Gebruik blad.setConditionalFormatRules([]) om alle regels in één keer te wissen.

Kan ik opmaak toepassen op basis van een formule?

Ja, gebruik whenFormulaSatisfied('=A1>B1') in je newConditionalFormatRule()-builder voor formule-gebaseerde conditionele opmaak.

Hoe pas ik opmaak toe op een hele rij op basis van een celwaarde?

Stel de range in op de hele rij, bijvoorbeeld A2:Z2, en gebruik een formule-gebaseerde regel met een absolute kolomreferentie zoals whenFormulaSatisfied('=$C2="Actief"'). De dollarteken-referentie zorgt dat elke kolom naar dezelfde beslissingskolom kijkt.

Is er een grens aan het aantal conditionele opmaakregels?

Google publiceert geen hard maximum, maar veel losse regels vertragen je blad merkbaar. Combineer waar mogelijk regels via aangepaste formules in plaats van tientallen losse regels aan te maken.

Waarom verdwijnt mijn handmatige opmaak na het draaien van een script?

Waarschijnlijk roep je setConditionalFormatRules() aan zonder de bestaande regels eerst op te halen. Begin altijd met getConditionalFormatRules(), push je nieuwe regels op die lijst en zet de gecombineerde lijst pas daarna terug.

Hoe maak ik opmaak sneller op grote bladen?

Pas opmaak toe op een zo groot mogelijk Range in één aanroep in plaats van cel voor cel in een lus. Elke losse aanroep kost een server-call en dat telt snel op bij honderden cellen.

Opmaakautomatisering in Sheets bespaart tijd en zorgt voor consistente rapportages. Combineer het met data-updates in een wekelijkse trigger voor automatisch bijgewerkte, professioneel opgemaakte rapporten.