# Opmaak automatiseren in Sheets [[TOC]] ## 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. ```javascript 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); } ``` :::tip title="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 ```javascript 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 ```javascript 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 ```javascript 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 title="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. ::: :::warn title="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 ```javascript 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 ```javascript 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 ```javascript 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 :::howto title="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)`. ::: :::faq ### 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.