Skip to content

Instantly share code, notes, and snippets.

@arnodeceuninck
Created January 19, 2022 23:01
Show Gist options
  • Save arnodeceuninck/00b85676a12343752b53f08b23adfba1 to your computer and use it in GitHub Desktop.
Save arnodeceuninck/00b85676a12343752b53f08b23adfba1 to your computer and use it in GitHub Desktop.
Situatieschets: In de examenkalender van Fabiant representeert de achtergrondkleur de persoon die da examen heeft Je hebt een lijst dan met de namen op hun achtergrondkleur, die definieert welke kleur er bij wie hoort Mijn code: Maakt van de gegeven cellen een string met alle namen van de mensen die dan een examen hebben
/**
* Zoekt de namen die horen bij de achtergrondkleuren
*
* @param vakCellen De cellen met de achtergrondkleur van de personen waarvan je de naam wil
* @param namenRange Een range cellen met als values de namen van de personen en als achtergrondkleur de achtergrondkleur van die personen
* @return De nam van de person die overeenkomen met de achtergrondkleur
* @customfunction
*/
function PERSONEN(vakCellen,namenRange) {
var activeRange = SpreadsheetApp.getActiveRange();
var activeSheet = activeRange.getSheet();
var formula = activeRange.getFormula(); // De formule die is ingegeven in de cell die we willen berekenen, bv. "=PERSONEN(A25:A31; I2:I29)"
// We hebben nu de formule als tekst, hieruit kunnen we de range zelf gaan halen door er een regex op toe te passen
// De vakCellen is alles van het haakje tot de puntcomma
var vakCellenNotation = formula.match(/\((.*)\;/).pop(); // bv. "A25:A31"
// De namenRange cellen is alles van de puntcomma (+spatie) tot het sluit haakje
var naamCellenNotation = formula.match(/\;( )?(.*)\)/).pop(); // bv. "I2:I29"
// We hebben nu de stringrepresentatie van die cellen range, maar willen de range zelf
var vakCellenRange = activeSheet.getRange(vakCellenNotation);
var naamCellenRange = activeSheet.getRange(naamCellenNotation);
// // Nice, we hebben nu de ranges, neem nu de matrix met achtergrondkleuren van iedere range
// // Dit returnt een string[][] met hexcodes van de achtergrond
// var vakkenBg = vakCellenRange.getBackgrounds();
// var namenBg = naamCellenRange.getBackgrounds();
// // We fixen ook ineens een string[][] met alle namen
// var namen = range.getValues();
// Nu wil ik een dict maken, zodat ik makkelijk een achtergrondkleur naar een naam kan mappen
// Misschien dat er een efficientere manier is dan op index i en j hierover te itereren, ma dit werkt tot nu toe, dus ik blijf eraf
var bgToName = {};
for (let i = 1; i <= naamCellenRange.getNumColumns(); i++) {
for (let j = 1; j <= naamCellenRange.getNumRows(); j++) {
const cell = naamCellenRange.getCell(j, i)
const naam = cell.getValue()
const achtergrondkleur = cell.getBackground()
bgToName[achtergrondkleur] = naam
}
}
// Life is good, we kunnen nu over alle vakCellen gaan itereren en de persoon dat da vak heeft toevoegen aan een lijst
var personenList = []
for (let i = 1; i <= vakCellenRange.getNumColumns(); i++) {
for (let j = 1; j <= vakCellenRange.getNumRows(); j++) {
const cell = vakCellenRange.getCell(j, i)
const achtergrondkleur = cell.getBackground()
if (achtergrondkleur in bgToName){
// Only add people if the background color is known (e.g. don't add someone when the background is white and there hasn't been a name defined with a white background)
const naam = bgToName[achtergrondkleur]
personenList.push(naam)
}
}
}
var personenString = personenList.join(",");
return personenString;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment