Google sheets script : Condition si une plage contient une couleur spécifique

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Je cherche à réaliser un script me permettant de mettre en forme une cellule cible si dans ma plage de référence se trouve une cellule avec une couleur de fond spécifique.

Ainsi, si une cellule de ma plage 'A1:E1' a un fond rouge donc 'F1' prends la valeur 'ALERTE' avec une police rouge. Sinon, 'F1' prends la valeur 'OK' avec une police verte.

Le code suivant ne fonctionne pas :


var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();

const red = '#ff0000';
const green = '#00ff00';

var referenceRange = sheet.getRange('A1:E1');
var rangeColor = referenceRange.getBackgroundColor();
var targetRange = sheet.getRange('F1');

  if (rangecolor === red)
{
targetRange.setFontColor(red).setValue('ALERTE')
} 
else
{
targetRange.setFontColor(green).setValue('OK')
};

Une solution ?

+0 -0

Bonjour DonKnacki,

Merci de prendre le temps de me répondre.

Le problème ne vient pas du .setFontColor

Le problème vient du fait que je ne récupère que la couleur du fond de la cellule 'A1’.

Si je mets un fond rouge en A1, cela me donne en 'F1' : "ALERTE"; Par contre, si il n’y a pas de rouge en A1 mais qu’il y en a dans les autres cellules de la plage, cela me donne en 'F1' : "OK".

J’ai essayer avec getBackgroundColors => 'F1' renvoit toujours : "OK".

En gros, je voudrai qu’à partir du moment où il y a une cellule rouge sur la plage, ça me renvoit "ALERTE" en 'F1’.

+0 -0

Bonjour,

tu ne peux pas savoir ce que referenceRange.getBackgroundColor() va retourner, referenceRange est une plage, (d’après tes messages il retourne la couleur de la premiere cellule du range: A1), si tu veux vérifier pour n’importe qu’elle cellule de la plage il faut faire une boucle sur chaque cellule du range.

Salut,

Ce qu’on appelle une boucle en programmation c’est le fait de demander à l’ordinateur de répéter une certaine action tant qu’une condition est vraie.

Habituellement, on sépare les boucles en deux catégories : celles où la condition c’est "tant que nombre de répétition < nombre demandé" et les autres.

Dans ton cas, ton range possède un tableau de cellules comme tu peux le voir ici.

"parcourir les cellules" c’est donc faire une boucle qui va chercher la cellule [i] tant que i n’est pas égal au nombre de cellules.

En terme de code ça donne ça :


const range = SpreadsheetApp.getRange("A1:E1")
// on prend les colonnes une par une (c'est ce que fait i++) jusqu'à atteindre getNumColumns()
// comme on est dans le range, contrairement à la fonction getValues, la première cellule est à 1,1 et non à 0,0
for(let col = 1; col <= range.getNumColumns(); i++)  {
    for(let row = 1; row <= range.getNumRows(); i++) {
        const cell =range.getCellAt(row, col)
        //ici tu peux jouer sur les formats
        cell.getBackgroundColor() // <- obtient le background de la cellule courante
    }
}

Bonjour artragis,

Merci beaucoup pour ton aide !

J’ai tenté quelque chose avec tes explications :

function myFunction()
{

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();

const red = '#ff0000';
const green = '#00ff00';

var referenceRange = sheet.getRange('A1:E1');
var targetRange = sheet.getRange('F1');

for(let col = 1; col <= referenceRange.getNumColumns(); col++)
{
for(let row = 1; row <= referenceRange.getNumRows(); row++)
{
const cell =referenceRange.getCell(row, col)
var rangeColor = cell.getBackgroundColor()
}
}

if (rangeColor === red)
{
targetRange.setFontColor(red).setValue('ALERTE')
} 
else
{
targetRange.setFontColor(green).setValue('OK')
};
}

J’ai changer getCellAt() pour getCell car ça me retournait une erreur : getCellAt is not a funtion

J’ai aussi changer i++ pour col++ puis row++ car ça me retournait : i is not defined

Malheureusement, cela ne marche pas :honte:

+0 -0

Désolé, j’étais fatigué hier, j’ai fait quelques fautes d’inattention, ton réflexe a été le bon.

Si tu veux mettre à jour toutes les cellules, il faut absolument que ton code de mise à jour soit fait à l’intérieur de la boucle.

function myFunction()
{

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();

const red = '#ff0000';
const green = '#00ff00';

var referenceRange = sheet.getRange('A1:E1');
var targetRange = sheet.getRange('F1');

for(let col = 1; col <= referenceRange.getNumColumns(); col++) {
    for(let row = 1; row <= referenceRange.getNumRows(); row++) {
        const cell =referenceRange.getCell(row, col)
        var rangeColor = cell.getBackgroundColor()
        if (rangeColor === red) {
            targetRange.getCell(row, col).setFontColor(red).setValue('ALERTE')
        } 
        else {
            targetRange.getCell(row, col).setFontColor(green).setValue('OK')
        }
    }
}


}

Je morfierais encore un peu le code , dans la version de @artragis , targetRange contient une seule cellule F1 donc je ne sais pas ce que targetRange.getCell(row, col) va mettre à jour à chaque tour de boucle, on risque de ne voir que le résultat de la couleur de la cellule E1 si ca ne provoque pas une erreur. De plus dans ce cas, le parcours se fait sur une seule ligne on peux enlever la boucle ``row.

function myFunction()
{
\\code non testé ;)
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();

const red = '#ff0000';
const green = '#00ff00';

var referenceRange = sheet.getRange('A1:E1');
var targetRange = sheet.getRange('F1');

var alerte = false; 

for(let col = 1; col <= referenceRange.getNumColumns(); col++) {
        const cell =referenceRange.getCell(1, col);
        if (cell.getBackgroundColor() === red) {
          alerte = true;        
    }
};
if (alerte == true) {
    targetRange.setFontColor(red).setValue('ALERTE')
} 
else {
    targetRange.setFontColor(green).setValue('OK')
};

}
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte