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

Rechercher des sujets similaires à "somme plage colorees pointee"