Moins de 5s pour compiler 12500 valeurs sur fond coloré.
Voici ce que j'ai fait
- admettons que j'ai une liste de rubriques comme ceci
- admettons que j'ai une feuille de données avec
- des codes en ligne
- des périodes en colonnes
- bien sûr rubriques, codes, périodes peuvent être autre chose
- j'ai donc 2 tableaux de synthèse
- la somme des données par code et rubrique
- la somme des données par période et rubrique
function onOpen() {
SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
.addItem('👉 Calculer par couleurs', 'calculerCouleurs')
.addToUi();
}
function calculerCouleurs() {
var d = new Date()
var rub = myDictionary()
var range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('données').getDataRange()
var valeurs = range.getValues()
var couleurs = range.getBackgrounds()
var resultat = []
for (var i=1;i<valeurs.length;i++){
for (var j=1;j<valeurs[0].length;j++){
if (isTypeNumber(valeurs[i][j])) resultat.push([rub.get(couleurs[i][j]),valeurs[i][j],valeurs[i][0],valeurs[0][j]])
}
}
var f = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BdD')
f.getRange(2,1,resultat.length,resultat[0].length).setValues(resultat)
Browser.msgBox('terminé en '+Math.round((new Date()-d)/1000)+' secondes')
}
function isTypeNumber(arg) {
return typeof arg == 'number';
}
function myDictionary() {
let myDico = new Map()
var range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('couleurs').getDataRange()
var valeurs = range.getValues()
var couleurs = range.getBackgrounds()
for (var i=0;i<valeurs.length;i++){
myDico.set(couleurs[i][0],valeurs[i][0])
}
return myDico
}
https://docs.google.com/spreadsheets/d/1Q7yfSDwKNC1RrIDUTg6AGDWEWp2_c6kMUPb-AvGwDn8/copy
à voir si cela s'adapte à ton fichier
il peut y avoir du reste des données sur plusieurs feuilles