Script om rijkleur te wijzigen wanneer een cel tekst verandert

Ik heb een Google-spreadsheet waarin ik een lijst met bugs bijhoud en wanneer ik een bug verhelp, verander ik de status van ‘Niet gestart’ in ‘Voltooid’. Ik wil een script schrijven voor de Google Docs-spreadsheet zodat wanneer ik de status verander naar “Voltooid”, de hele rij wordt gemarkeerd in een bepaalde kleur.

Ik weet al dat Google-spreadsheet al “kleur wijzigen op tekst” heeft, maar die functie verandert alleen de kleur van de cel en verandert niet de kleur van de hele rij.


Antwoord 1, autoriteit 100%

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

Antwoord 2, autoriteit 74%

Besef dat dit een oude thread is, maar na veel van dit soort scripts te hebben gezien, merkte ik dat je dit alleen kunt doen met voorwaardelijke opmaak.

Ervan uitgaande dat de “Status” Kolom D was:

Markeer cellen > klik met de rechtermuisknop > conditionele opmaak.
Selecteer “Aangepaste formule is” en stel de formule in als

=RegExMatch($D2,"Complete")

of

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

Bewerken (met dank aan Frederik Schøning)

=RegExMatch($D2,"(?i)Complete")stel vervolgens het bereik in om alle rijen te dekken, b.v. A2:Z10. Dit is niet hoofdlettergevoelig, dus komt overeen met compleet, Compleet of CoMpLeTe.

Je zou dan andere regels kunnen toevoegen voor “Niet gestart” etc. De $ is erg belangrijk. Het geeft een absolute referentie aan. Zonder dit zou cel A2 naar D2 kijken, maar B2 zou naar E2 kijken, dus je zou een inconsistente opmaak krijgen op een bepaalde rij.


Antwoord 3, autoriteit 53%

Ik heb het script van GENEGC gebruikt, maar ik vond het nogal traag.

Het is traag omdat het bij elke bewerking het hele vel scant.

Dus ik schreef een veel snellere en schonere methode voor mezelf en ik wilde deze delen.

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");
            }   
        }
    }
}

Antwoord 4, autoriteit 11%

Het antwoord van user2532030 is het juiste en meest eenvoudige antwoord.

Ik wil er alleen aan toevoegen dat in het geval dat de waarde van de bepalende cel niet geschikt is voor een RegEx-overeenkomst, ik vond dat de volgende syntaxis hetzelfde werkte, alleen met numerieke waarden, relaties enz. :

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

Als kolom 2 van een rij (rij 2 in script, maar de leidende $ betekent, dit kan elke rij zijn) tekstueel gelijk is aan “Voltooid”, gebruik dan X voor het bereik van het hele blad (exclusief koprij (dwz beginnend met A2 in plaats van A1)).

Maar het is duidelijk dat deze methode ook numerieke bewerkingen mogelijk maakt (ook al geldt dit niet voor de vraag van op), zoals:

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

Dus doe dingen als de waarde van col B in een rij hoger is dan de waarde van col C.

Nog een laatste ding:
Hoogstwaarschijnlijk geldt dit alleen voor mij, maar ik was zo stom om herhaaldelijk te vergeten Aangepaste formule iste kiezen in de vervolgkeuzelijst, en het op Tekst bevatte laten staan. Dit zal natuurlijk niet zweven…


Antwoord 5, autoriteit 5%

Ik denk dat het eenvoudiger is (hoewel zonder script) ervan uitgaande dat de kolom StatusColumnS is.

Selecteer ColumnS en wis de opmaak ervan. Selecteer het volledige bereik dat moet worden opgemaakt en Opmaak, Voorwaardelijke opmaak…, Cellen opmaken als… Custom formula isen:

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

met vulling naar keuze en Klaar.

Dit is niet hoofdlettergevoelig (verander daarvoor searchin find) en markeert een rij waarin ColumnS bijvoorbeeld Now completebevat (maar ook Not yet complete).

Other episodes