wake-up-neo.net

Skript zum Ändern der Zeilenfarbe, wenn eine Zelle den Text ändert

Ich habe eine Google-Tabelle, in der ich eine Liste mit Fehlern behebe. Wenn ich einen Fehler behebe, ändere ich den Status von "Nicht gestartet" in "Abgeschlossen". Ich möchte ein Skript für die Google Text & Tabellen-Tabelle schreiben, sodass die gesamte Zeile in einer bestimmten Farbe hervorgehoben wird, wenn ich den Status auf "Abgeschlossen" ändere.

Ich weiß bereits, dass in der Google-Tabelle "Farbe für Text ändern" bereits vorhanden ist. Diese Funktion ändert jedoch nur die Farbe der Zelle und nicht die Farbe der gesamten Zeile.

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

Erkenne, dass dies ein alter Thread ist, aber nachdem ich so viele Skripte gesehen habe, ist mir aufgefallen, dass Sie dies nur mit bedingter Formatierung tun können.

Angenommen, der "Status" war Spalte D:

Markieren Sie Zellen> Rechtsklick> Bedingte Formatierung. Wählen Sie "Benutzerdefinierte Formel ist" und legen Sie die Formel als fest

=RegExMatch($D2,"Complete")

oder

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

Edit (danke an Frederik Schøning)

=RegExMatch($D2,"(?i)Complete") dann den Bereich so einstellen, dass er alle Zeilen abdeckt, z. A2:Z10. Dies ist unabhängig von der Groß- und Kleinschreibung, daher wird es mit complete, Complete oder CoMpLeTe verglichen.

Sie können dann andere Regeln für "Nicht gestartet" usw. hinzufügen. Das $ ist sehr wichtig. Es bezeichnet eine absolute Referenz. Ohne sie würde Zelle A2 auf D2 schauen, aber B2 würde auf E2 schauen, so dass Sie in jeder gegebenen Zeile eine inkonsistente Formatierung bekommen würden.

41
user2532030

Ich habe das Skript von GENEGC verwendet, fand es aber ziemlich langsam.

Dies ist langsam, da bei jeder Bearbeitung das gesamte Blatt gescannt wird.

Also schrieb ich viel schneller und sauberer für mich und ich wollte es teilen.

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

die Antwort von user2532030 ist die richtige und einfachste.

Ich möchte nur hinzufügen, dass in dem Fall, in dem der Wert der bestimmenden Zelle nicht für eine RegEx-Übereinstimmung geeignet ist, die folgende Syntax funktioniert, nur mit numerischen Werten, Beziehungen usw.:

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

Wenn Spalte 2 einer Zeile (Zeile 2 im Skript, aber das führende $ bedeutet, dass dies eine beliebige Zeile sein kann) in Textform "Vollständig" ist, geben Sie für den Bereich des gesamten Blatts X an (mit Ausnahme der Kopfzeile (dh beginnend mit A2 anstelle von "Vollständig") A1)).

Aber offensichtlich erlaubt diese Methode auch numerische Operationen (obwohl dies nicht für die Frage von op gilt), wie:

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

Machen Sie also Sachen, wenn der Wert von Spalte B in einer Zeile höher als der Wert von Spalte C ist.

Eine letzte Sache: Höchstwahrscheinlich trifft dies nur auf mich zu, aber ich war dumm genug, wiederholt zu vergessen, zu wählen. Benutzerdefinierte Formel ist in der Dropdown-Liste bei belassen. Text enthält . Offensichtlich wird dies nicht schweben ...

Ich denke einfacher (wenn auch ohne Skript), wenn die Status -Spalte ColumnS ist.

Wählen Sie ColumnS und löschen Sie die Formatierung. Wählen Sie den gesamten zu formatierenden Bereich und Formatieren, Bedingte Formatierung ..., Zellen formatieren, wenn ... Custom formula is Und:

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

mit Fülle der Wahl und Done.

Dies unterscheidet nicht zwischen Groß- und Kleinschreibung (ändern Sie search in find) und hebt eine Zeile hervor, in der ColumnS den Wert Now complete Enthält (obwohl auch Not yet complete). .

4
pnuts