Somme d'une plage de cellules colorées et par cellule pointée
Bonjour à tous,
J'ai un script pour comptabiliser dans une plage et par l'intermédiaire d'une "x" les jours fériés dont la cellule est coloré en "#ffcc00" (orange) ça fonctionne par une formule adaptée "=countColoredCellsByValue("E17:E47";"C17:C47";"#ffcc00";"x")" les "x" sont dans la plage "E" et les couleurs dans la plage "C" j'ai activé un déclencheur "Lors d'une modification" mais rien ne se passe, sauf quand je supprime la formule et que je l'a remet " ça me met "chargement en cours" et j'obtiens le bon résultat et si je laisse tel quel ça fini par se comptabiliser mais c'est long, TROP LONG. je tourne en rond, si quelqu'un a une idée ?
Cordialement,
Alex
Salut,
Essaye ce script autonome :
(tu peux aussi dégager le onEdit et juste appeler la fonction counter, avec un déclencheur à chaque modif mais ça risque de ralentir le fichier)
const SS = SpreadsheetApp.getActiveSpreadsheet();
const SHEET = SS.getSheetByName('Feuille 1'); // Modifier avec le nom de votre feuille
const RANGE = SHEET.getRange(1, 3, SHEET.getLastRow(), 3); // Plage englobant les colonnes C, D et E
function onEdit(e) { // cette fonction vérifie l'event d'édition e à lieu dans la feuille SHEET et au sein de la RANGE si oui = > counterColors_and_x
var range = e.range;
var sheet = range.getSheet();
const column = range.getColumn();
if (sheet.getName() === SHEET.getName() && RANGE.getColumn() <= column && column <= RANGE.getLastColumn()) {
counterColors_and_x()
}
}
function counterColors_and_x() {
var celCounter = 'A1'; // cellule où insérer le compteur
var colorToCheck = "#ffcc00"; // couleur à check
var valueToCheck = "x"; // valeur à check
var data = RANGE.getValues();
var colors = RANGE.getBackgrounds();
var count = 0;
for (var i = 0; i < data.length; i++) {
if (data[i][2] == valueToCheck && colors[i][0] == colorToCheck) {
count++;
}
}
SHEET.getRange(celCounter).setValue(count);
}
Bonjour et merci pour le retour.
J'ai pensé à "onEdit " hier quand j'ai fait pour @PierreJean, je vais tester ton script, merci.
Super ça fonctionne, je précise pour les personnes que ça fonctionne pour "une feuille" (Feuille 1)
@Pierre j'ai essayé de le faire déclencher sur toutes les feuilles ou il y a des jours fériés mais pour mon cas il ne réagit que sur "Novembre"
const SS = SpreadsheetApp.getActiveSpreadsheet();
function onEdit(e) {
var range = e.range;
var sheet = range.getSheet();
var sheets = SS.getSheets(); // Obtenez toutes les feuilles du classeur
for (var i = 0; i < sheets.length; i++) {
var currentSheet = sheets[i];
var rangeInCurrentSheet = currentSheet.getRange(1, 3, currentSheet.getLastRow(), 3); // Plage englobant les colonnes C, D et E de chaque feuille
const column = range.getColumn();
if (sheet.getName() === currentSheet.getName() && rangeInCurrentSheet.getColumn() <= column && column <= rangeInCurrentSheet.getLastColumn()) {
counterColors_and_x(currentSheet, rangeInCurrentSheet);
}
}
}
function counterColors_and_x(sheet, RANGE) {
var celCounter = 'C51'; // cellule où insérer le compteur
var colorToCheck = "#ffcc00"; // couleur à check
var valueToCheck = "x"; // valeur à check
var data = RANGE.getValues();
var colors = RANGE.getBackgrounds();
var count = 0;
for (var i = 0; i < data.length; i++) {
if (data[i][2] == valueToCheck && colors[i][0] == colorToCheck) {
count++;
}
}
sheet.getRange(celCounter).setValue(count);
}
Voici le Script pour toutes les feuilles d'un classeur. Merci à @Pierre
const SS = SpreadsheetApp.getActiveSpreadsheet();
function onEdit(e) {
var range = e.range;
var sheet = range.getSheet();
var sheets = SS.getSheets(); // Obtenez toutes les feuilles du classeur
for (var i = 0; i < sheets.length; i++) {
var currentSheet = sheets[i];
var rangeInCurrentSheet = currentSheet.getRange(1, 3, currentSheet.getLastRow(), 3); // Plage englobant les colonnes C, D et E de chaque feuille
const column = range.getColumn();
if (sheet.getName() === currentSheet.getName() && rangeInCurrentSheet.getColumn() <= column && column <= rangeInCurrentSheet.getLastColumn()) {
counterColors_and_x(currentSheet, rangeInCurrentSheet);
}
}
}
function counterColors_and_x(sheet, RANGE) {
var celCounter = 'C51'; // cellule où insérer le compteur
var colorToCheck = "#ffcc00"; // couleur à check
var valueToCheck = "x"; // valeur à check
var data = RANGE.getValues();
var colors = RANGE.getBackgrounds();
var count = 0;
for (var i = 0; i < data.length; i++) {
if (data[i][2] == valueToCheck && colors[i][0] == colorToCheck) {
count++;
}
}
sheet.getRange(celCounter).setValue(count);
}
La couleur est à mettre dans la colonne "C" et les "x" dans la colonne "E"
Il faut activer un déclencheur pour "onEdit" et sur "Lors d'une modification"
Cdlt
Alex
Bonjour @Sébastien, peux-tu supprimer cette fenêtre ? Merci
Bonjour,
Si j'ai bien compris, tu adaptes le script afin qu'il itère sur toutes les feuilles (qui sont des mois de l'année), sauf que ça ne fonctionne que pour la feuille du mois de novembre ?
Si tel est le cas, à ta place je debbugerai le code étape par étape :
const SS = SpreadsheetApp.getActiveSpreadsheet();
function onEdit(e) {
var range = e.range;
var sheet = range.getSheet();
var sheets = SS.getSheets(); // Obtenez toutes les feuilles du classeur
for (var i = 0; i < sheets.length; i++) {
var currentSheet = sheets[i];
//DEBUG 1 : toutes les feuilles sont-elle itérées ?
console.log(currentSheet.getSheetName())
var rangeInCurrentSheet = currentSheet.getRange(1, 3, currentSheet.getLastRow(), 3); // Plage englobant les colonnes C, D et E de chaque feuille
const column = range.getColumn();
//DEBUG 2 : quel est la colonne de l'édit ?
console.log(column)
if (sheet.getName() === currentSheet.getName() && rangeInCurrentSheet.getColumn() <= column && column <= rangeInCurrentSheet.getLastColumn()) {
//DEBUG 3 : le test sheet name = currentsheet & column est dans la plage rangeInCurrentSheet est passé
console.log('test passé, lancement de la function counter pour la feuille '+currentSheet)
counterColors_and_x(currentSheet, rangeInCurrentSheet);
}
}
}
function counterColors_and_x(sheet, RANGE) {
var celCounter = 'C51'; // cellule où insérer le compteur
var colorToCheck = "#ffcc00"; // couleur à check
var valueToCheck = "x"; // valeur à check
var data = RANGE.getValues();
var colors = RANGE.getBackgrounds();
var count = 0;
for (var i = 0; i < data.length; i++) {
if (data[i][2] == valueToCheck && colors[i][0] == colorToCheck) {
count++;
}
}
sheet.getRange(celCounter).setValue(count);
}
Bonjour, merci Pierre, j'ai finalement trouvé, j'avais juste pas supprimé les anciennes colonnes des autres feuilles ce qui fait que le script ne pouvais pas faire avec les colonnes C, D et E