web-dev-qa-db-fra.com

Script pour changer la couleur de la ligne quand une cellule change de texte

J'ai une feuille de calcul Google dans laquelle je garde une liste de bogues et chaque fois que je corrige un bogue, je passe de "Non commencé" à "Complet". Je souhaite rédiger un script pour la feuille de calcul Google Documents, de sorte que chaque fois que je modifie le statut sur "Compléter", la ligne entière est mise en surbrillance dans une certaine couleur.

Je sais déjà que la feuille de calcul Google a déjà "changer la couleur du texte", mais cette fonction ne fait que changer la couleur de la cellule et ne modifie pas la couleur de la ligne entière.

53
MadSeb
//Sets the row color depending on the value in the "Status" column.
function setRowColors() {
  var range = SpreadsheetApp.getActiveSheet().getDataRange();
  var statusColumnOffset = getStatusColumnOffset();

  for (var i = range.getRow(); i < range.getLastRow(); i++) {
    rowRange = range.offset(i, 0, 1);
    status = rowRange.offset(0, statusColumnOffset).getValue();
    if (status == 'Completed') {
      rowRange.setBackgroundColor("#99CC99");
    } else if (status == 'In Progress') {
      rowRange.setBackgroundColor("#FFDD88");    
    } else if (status == 'Not Started') {
      rowRange.setBackgroundColor("#CC6666");          
    }
  }
}

//Returns the offset value of the column titled "Status"
//(eg, if the 7th column is labeled "Status", this function returns 6)
function getStatusColumnOffset() {
  lastColumn = SpreadsheetApp.getActiveSheet().getLastColumn();
  var range = SpreadsheetApp.getActiveSheet().getRange(1,1,1,lastColumn);

  for (var i = 0; i < range.getLastColumn(); i++) {
    if (range.offset(0, i, 1, 1).getValue() == "Status") {
      return i;
    } 
  }
}
56
genegc

Réalisez que c'est un vieux fil, mais après avoir vu beaucoup de scripts comme celui-ci, j'ai remarqué que vous pouvez le faire en utilisant simplement la mise en forme conditionnelle.

En supposant que le "statut" était la colonne D:

Mettez en surbrillance les cellules> clic droit> mise en forme conditionnelle. Sélectionnez "Formule personnalisée est" et définissez la formule comme

=RegExMatch($D2,"Complete")

ou

=OR(RegExMatch($D2,"Complete"),RegExMatch($D2,"complete"))

Edit (merci à Frederik Schøning)

=RegExMatch($D2,"(?i)Complete") puis définissez la plage pour couvrir toutes les lignes, par exemple. A2:Z10. Ceci est insensible à la casse, donc correspondra à complete, Complete ou CoMpLeTe.

Vous pouvez ensuite ajouter d'autres règles pour "Pas commencé" etc. Le $ est très important. Cela dénote une référence absolue. Sans elle, la cellule A2 regarderait D2, mais B2 regarderait E2, ce qui donnerait un formatage incohérent sur une ligne donnée.

41
user2532030

J'ai utilisé le script GENEGC, mais je l'ai trouvé assez lent.

Il est lent car il analyse toute la feuille à chaque édition.

J'ai donc écrit une méthode beaucoup plus rapide et plus propre pour moi-même et je voulais la partager.

function onEdit(e) {
    if (e) { 
        var ss = e.source.getActiveSheet();
        var r = e.source.getActiveRange(); 

        // If you want to be specific
        // do not work in first row
        // do not work in other sheets except "MySheet"
        if (r.getRow() != 1 && ss.getName() == "MySheet") {

            // E.g. status column is 2nd (B)
            status = ss.getRange(r.getRow(), 2).getValue();

            // Specify the range with which You want to highlight
            // with some reading of API you can easily modify the range selection properties
            // (e.g. to automatically select all columns)
            rowRange = ss.getRange(r.getRow(),1,1,19);

            // This changes font color
            if (status == 'YES') {
                rowRange.setFontColor("#999999");
            } else if (status == 'N/A') {
                rowRange.setFontColor("#999999");
            // DEFAULT
            } else if (status == '') { 
                rowRange.setFontColor("#000000");
            }   
        }
    }
}
29
BlackTea

la réponse de user2532030 est la réponse correcte et la plus simple.

Je veux juste ajouter que, dans le cas où la valeur de la cellule de détermination ne convient pas pour une correspondance RegEx, la syntaxe suivante fonctionne de la même manière, mais avec des valeurs numériques, relations et.c .:

[Custom formula is]
=$B$2:$B = "Complete"
Range: A2:Z1000

Si la colonne 2 d'une ligne (la ligne 2 du script, mais que le signe $ signifie en premier, il peut s'agir d'une ligne) est textuellement égale à "Complète", effectuez X pour l'étendue de la feuille entière (à l'exclusion de la ligne d'en-tête (c'est-à-dire à partir de A2 au lieu de A1)).

Mais évidemment, cette méthode permet aussi des opérations numériques (même si cela ne s'applique pas à la question d'op), comme:

=$B$2:$B > $C$2:$C

Donc, faites des choses, si la valeur de la colonne B dans une ligne est supérieure à la valeur de la colonne C.

ne dernière chose: Très probablement, cela ne s'applique qu'à moi, mais j'ai été assez stupide pour oublier à plusieurs reprises de choisir La formule personnalisée est dans le menu déroulant, en le laissant à Le texte contient . Évidemment, cela ne va pas flotter ...

Je pense plus simple (bien que sans script) en supposant que la colonne Status est ColumnS.

Sélectionnez ColumnS et effacez sa mise en forme. Sélectionnez toute la plage à formater et Format, Mise en forme conditionnelle ..., Mettre en forme les cellules si ... Custom formula is et:

=and($S1<>"",search("Complete",$S1)>0)

avec remplissage de choix et Done.

Ce n'est pas sensible à la casse (changez search en find pour cela) et mettra en surbrillance une ligne où ColumnS contient des éléments similaires à Now complete (mais aussi Not yet complete).

4
pnuts