37 Stimmen

Automatische Einfärbung eines bestimmten Wertes, wo immer er in einer Tabelle gefunden wird

Ich suche nach einer Möglichkeit, die Farbe der kleinsten Zelle in einer Zeile in Google Sheets automatisch zu ändern. Also, für eine Tabelle wie:

1 | 2 | 3
4 | 2 | 1
2 | 1 | 6

würden alle Zellen mit der Farbe 1 in ihnen.

57voto

Kekoa Punkte 26946

Im Dropdown-Menü, Format->Bedingte Formatierung...

Legen Sie dann Ihre Regeln und Ihre Farbe fest. Sie können auch mehrere Zellen auswählen und dies tun.

Edita:

Das ist das Ausmaß dessen, was man mit Färbung machen kann. Sie können vielleicht eine komplexe Formel finden, um das Minimum der Zellen zu ermitteln, und dann, wenn das mit dem übereinstimmt, was in der Zelle ist, diese einfärben, aber Sie sollten vielleicht Excel statt Google Docs verwenden, wenn das für Sie wichtig ist.

26voto

Evan Plaice Punkte 13682

Der Trick besteht darin, den onEdit-Ereignisauslöser anzuzapfen und etwas Intelligenz hinzuzufügen

Auf den ersten Blick dachte ich, die bedingte Formatierung würde funktionieren, aber die Mindestanzahl pro Zeile ist ein wenig zu komplex für die standardmäßige bedingte Formatierung. Es ist ein wenig knifflig herauszufinden, aber es kann getan werden.

Hier ist das vollständige Skript (getestet und funktionierend):

function onEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  var r = s.getActiveRange();
  var row = r.getRow();
  var cols = s.getDataRange().getNumColumns();

  // crate a range for the row using getRange(row, column, numRows, numColumns)
  var rowRange = s.getRange(row, 1, 1, cols);
  var rowValues = rowRange.getValues();

  // check all the values in the row
  var val = 999;
  for(var i = 0; i < cols; i++) {
    if(val > rowValues[0][i] && rowValues[0][i] !== "") {
      val = rowValues[0][i];
    }
  }
  for(var j = 0; j < cols; j++) {
    if(rowValues[0][j] === val) {
      s.getRange(row,(j + 1)).setFontColor("blue");
    } else {
      s.getRange(row,(j + 1)).setFontColor("black");
    }
  }
}

Zuerst greifen Sie auf die onEdit-Ereignishandler zu, um das Skript mit den Änderungen in der Kalkulationstabelle auszulösen.

function onEdit()

Wenn Sie eine Funktion onEdit nennen, weiß sie automatisch, dass Sie die onEdit-Aktion außer Kraft setzen wollen.

Hinweis: Event-Handler in Docs sind allerdings ein wenig knifflig. Da Docs mehrere gleichzeitige Bearbeitungen durch mehrere Benutzer verarbeiten kann, werden die Event-Handler serverseitig gehandhabt. Das Hauptproblem bei dieser Struktur ist, dass wenn ein Ereignisauslöser-Skript fehlschlägt, es auf dem Server fehlschlägt. Wenn Sie die Debug-Informationen sehen wollen, müssen Sie einen expliziten Trigger im Trigger-Menü einrichten, der Ihnen die Debug-Informationen per E-Mail sendet, wenn das Ereignis fehlschlägt, oder es wird stillschweigend fehlschlagen.

Holen Sie die Zeilennummer:

var r = s.getActiveRange();
  var row = r.getRow();

Das ist ziemlich selbsterklärend. Der aktive Bereich ist die Zelle, die bearbeitet wird.

Erfassen Sie die Anzahl der Spalten:

var cols = s.getDataRange().getNumColumns();

Hierfür müssen Sie den Datenbereich für das gesamte Arbeitsblatt überprüfen.

Als nächstes müssen Sie einen Datenbereich konstruieren, der die Daten für die betreffende Zeile enthält:

var rowRange = s.getRange(row, 1, 1, cols);

Lesen Sie die Kommentare im Code, um herauszufinden, wie die Werte lauten sollten.

Anschließend werden die Ergebnisse zur Prüfung der Werte zwischengespeichert:

var rowRange = s.getRange(row, 1, 1, cols);

Aufgrund der Art der Skripterstellung in Google Text & Tabellen werden Event-Callbacks serverseitig ausgeführt. Um Missbrauch zu verhindern, setzt Google ein Zeitlimit für die Skriptausführung. Durch das Zwischenspeichern der Werte ersparen Sie dem Server viele unnötige Umwege, um die Werte aus der Kalkulationstabelle zu holen.

Die nächsten beiden Teile sind der eigentliche Zauber.

Zunächst werden alle Zellen der Zeile durchlaufen, um den Mindestwert zu ermitteln.

  var val = 999;
  for(var i = 0; i < cols; i++) {
    if(val > rowValues[0][i] && rowValues[0][i] !== "") {
      val = rowValues[0][i];
    }
  }

Der Einfachheit halber habe ich eine Standardobergrenze von 999 festgelegt. Dieser Wert könnte auf einen angemesseneren Wert geändert werden . Der Trick besteht darin, den Wert mit dem aktuellen Tiefstand zu vergleichen. Wenn er niedriger ist, markieren Sie den neuen Tiefstwert.

Man könnte es sich leicht machen, indem man die Zellennummer mit dem niedrigsten Wert markiert und explizit festlegt, aber ich wollte Fälle abdecken, in denen mehrere Zellen den niedrigsten Wert haben.

Die Behandlung mehrerer Zellen, die das Minimum enthalten, erfordert einen zweiten Durchgang:

for(var j = 0; j < cols; j++) {
  if(rowValues[0][j] === val) {
    s.getRange(row,(j + 1)).setFontColor("blue");
  } else {
    s.getRange(row,(j + 1)).setFontColor("black");
  }
}

Die Schleife durch alle Zellen der Zeile bleibt gleich. Diesmal prüfen wir nur, ob die Zellwerte mit dem gewählten Minimum übereinstimmen. Wenn dies der Fall ist, ändert sich die Schriftfarbe zu blau. Andernfalls wird die Schriftfarbe in Schwarz geändert.


Das bringt es auf den Punkt. Es ist etwas schwierig, sich an die Art und Weise zu gewöhnen, in der Google Apps Scripting mit der Referenzierung von Tabellenkalkulationen und Datenzellen umgeht, aber es gibt nicht viel, was Docs nicht kann.

Ich habe eine Öffentlicher Link zu der Kalkulationstabelle, die ich zum Schreiben/Testen dieses Codes verwendet habe. Sie können ihn gerne ausprobieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X