57 votes

Feuille de calcul Google : script pour changer la couleur de la rangée lorsqu'une cellule change de texte ;

J'ai un googlespreadsheet où je garde une liste de bogues et chaque fois que je corrige un bogue, je change le statut de "Non commencé" à "Terminé". Je veux écrire un script pour la feuille de calcul Google Docs de telle sorte que chaque fois que je change le statut en "Complete", la ligne entière est mise en évidence dans une certaine couleur.

Je sais que Google Spreadsheet dispose déjà de la fonction "changer la couleur du texte", mais cette fonction ne change que la couleur de la cellule et non celle de la ligne entière.

57voto

genegc Points 388
//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;
    } 
  }
}

15 votes

Comment indiquer à Google Docs d'exécuter cette fonction, lorsque le texte change ?

8 votes

@genegc pouvez-vous ajouter des commentaires à votre réponse ? Certaines personnes pourraient avoir besoin de directives sur ce qu'il faut faire avec le code que vous avez posté.

1 votes

Voir la réponse de l'utilisateur2532030

42voto

user2532030 Points 121

Je réalise que c'est un vieux fil de discussion, mais après avoir vu beaucoup de scripts comme celui-ci, j'ai remarqué que vous pouvez le faire en utilisant simplement le formatage conditionnel.

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

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

=RegExMatch($D2,"Complete")

ou

=OR(RegExMatch($D2,"Complete"),RegExMatch($D2,"complete")) puis définissez la plage pour couvrir toutes les lignes, par ex. A2:Z10

Vous pourriez ensuite ajouter d'autres règles pour les "non démarrés", etc. Le $ est très important. Il indique une référence absolue. Sans lui, la cellule A2 se trouverait en D2, mais B2 se trouverait en E2, et vous obtiendriez donc un formatage incohérent sur une ligne donnée.

4 votes

Note : En utilisant la dernière version de google docs, la réponse de l'utilisateur2532030 est la plus facile à utiliser. Dans mon cas, je voulais mettre en surbrillance une ligne en fonction de la valeur "Y" d'une cellule. J'ai mis en surbrillance la ligne supérieure, j'ai fait un clic droit sur le formatage conditionnel. Définissez "La formule personnalisée est" = =RegExMatch($G1, "Y"), range =1:1000. Cela a trié toute la feuille.

0 votes

Bonne solution. Merci :)

3 votes

C'est une bonne solution. Mais au lieu d'utiliser l'opérateur OR pour attraper à la fois les minuscules et la notation Pascal, vous devriez tirer parti du support regex pour l'insensibilité à la casse comme ceci : =RegExMatch($D2, "(?i)complete"). Cela correspondra à toutes les représentations littérales du mot "complete", y compris "cOmPlEtE" et.c.. J'ai testé ceci, et Google Apps supporte l'instruction case-ignore.

30voto

sharas Points 690

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

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

J'ai donc écrit une méthode 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");
            }   
        }
    }
}

6voto

La réponse de l'utilisateur 2532030 est la réponse correcte et la plus simple.

Je veux juste ajouter que dans le cas où la valeur de la cellule déterminante n'est pas appropriée pour une correspondance RegEx, j'ai trouvé la syntaxe suivante pour fonctionner de la même manière, seulement avec des valeurs numériques, des relations et autres :

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

Si la colonne 2 d'une ligne (ligne 2 dans script, mais le $ en tête signifie qu'il peut s'agir de n'importe quelle ligne) est textuellement égale à "Complet", faites X pour la plage de la feuille entière (à l'exclusion de la ligne d'en-tête (c'est-à-dire en commençant par A2 au lieu de A1)).

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

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

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

Une dernière chose : Il est fort probable que 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, ça ne va pas flotter...

3voto

pnuts Points 13391

Je pense que c'est plus simple (bien que sans script) en supposant que les Status est ColumnS.

Sélectionnez ColumnS et supprimez le formatage de celle-ci. Sélectionnez la plage entière à formater et Format, Formatage conditionnel..., Formater 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 a find pour cela) et mettra en évidence une ligne où ColumnS contient des éléments tels que Now complete (mais aussi Not yet complete ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X