Feuille de calcul Google: Script pour modifier la couleur de la ligne lorsqu’une cellule change de texte;

J’ai une feuille de route où je garde une liste de bogues et chaque fois que je corrige un bogue, je change le statut de “non commencé” à “complet”. Je souhaite écrire un script pour la google spreadsheet Docs de sorte que chaque fois que je change le statut en “Terminé”, la ligne entière soit mise en évidence dans une certaine couleur.

Je sais déjà que Google Spreadsheet a déjà “changer la couleur sur le texte” mais cette fonction ne change que la couleur de la cellule et ne change pas la couleur de la ligne entière.

    //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; } } } 

    Réalisez qu’il s’agit d’un ancien thread, mais après avoir vu beaucoup de scripts comme celui-ci, j’ai remarqué que vous pouviez le faire simplement en utilisant une mise en forme conditionnelle.

    En supposant que le “statut” était la colonne D:

    Mettez en surbrillance les cellules> cliquez avec le bouton 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 complet, complet ou coMpLeTe.

    Vous pouvez alors append d’autres règles pour “Not Started”, etc. Le $ est très important. Il dénote une référence absolue. Sans elle, la cellule A2 regarderait D2, mais B2 regarderait E2, donc vous obtiendriez un format incohérent sur une ligne donnée.

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

    C’est lent car il scanne la feuille entière à chaque édition.

    J’ai donc écrit une méthode plus rapide et plus propre pour moi 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") { // Eg 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 // (eg 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"); } } } } 

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

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

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

    Si la colonne 2 de n’importe quelle ligne (ligne 2 dans le script, mais le premier signe $ signifie, n’importe quelle ligne) est textuellement égale à “Complete”, faites X pour la gamme entière (sauf la ligne d’en-tête A1)).

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

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

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

    Une dernière chose: Très probablement, cela ne concerne que moi, mais j’ai été assez stupide pour oublier à plusieurs resockets de choisir la formule personnalisée dans la liste déroulante, en la laissant à Texte contient . De toute évidence, cela ne flottera pas …

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

    Sélectionnez ColumnS et enlevez le formatage. Sélectionnez toute la plage à formater et Format, Mise en forme conditionnelle, Formater les cellules si … La Custom formula is et:

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

    avec plein de choix et fait .

    Ceci n’est pas sensible à la casse (modifiez la search pour find cela) et mettra en surbrillance une ligne où ColumnS contient les goûts de Now complete (mais Not yet complete ).