37

Google スプレッドシートの行の最小セルの色を自動的に変更する方法を探しています。したがって、次のようなテーブルの場合:

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

それらのすべてのセルに色1を付けます。

4

2 に答える 2

57

ドロップダウンメニューで、[フォーマット]->[条件付きフォーマット...]

次に、ルールと色を設定します。複数のセルを選択して、これを行うこともできます。

編集:

それはあなたが着色でできることの範囲です。セルの最小値を見つけるための複雑な数式を見つけて、それがセルの内容と一致する場合は色を付けることができますが、これが重要な場合は、Googleドキュメントの代わりにExcelを使用することをお勧めします。

于 2009-06-05T22:24:36.000 に答える
26

秘訣は、onEdit イベント トリガーを利用して、インテリジェンスを追加することです。

一見、条件付き書式が機能すると思いましたが、行ごとの最小値は、標準の条件付き書式には少し複雑すぎます。理解するのは少し難しいですが、実行できます。

完全なスクリプトは次のとおりです(テスト済みで動作中):

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

まず、onEdit イベント ハンドラーを利用して、スプレッドシートの変更でスクリプトをトリガーします。

function onEdit()

関数に onEdit という名前を付けることで、onEdit アクションをオーバーライドする必要があることが自動的に認識されます。

注: ただし、Docs のイベント ハンドラーは少し扱いに​​くいものです。ドキュメントは複数のユーザーによる複数の同時編集を処理できるため、イベント ハンドラーはサーバー側で処理されます。この構造の主な問題は、イベント トリガー スクリプトが失敗すると、サーバー上で失敗することです。デバッグ情報を確認したい場合は、イベントが失敗したときにデバッグ情報をメールで送信するトリガー メニューの下に明示的なトリガーを設定する必要があります。

行番号をフェッチします。

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

ここではかなり自明です。アクティブな範囲は、編集中のセルです。

列の数を取得します。

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

これについては、スプレッドシート全体のデータ範囲を確認する必要があります。

次に、問題の行のデータを含むデータ範囲を構築する必要があります。

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

コード内のコメントを読んで、値がどうあるべきかを確認してください。

次に、値のテストのために結果をキャッシュします。

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

Google ドキュメント スクリプト イベント コールバックの性質上、サーバー側で実行されるため、悪用を防ぐために、Google はスクリプトの実行に時間制限を設けています。値をキャッシュすることで、サーバーがスプレッドシートから値を取得するために不要なラウンド トリップを何度も行うことを回避できます。

次の 2 つの部分では、すべての魔法が発生します。

まず、行のすべてのセルを通過して最小値を見つけます。

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

簡単にするために、デフォルトの上限を 999 に設定しました。これは、より適切な値に変更できます。トリックは、値と現在の安値をテストすることです。低い場合は、新しい低い値をマークします。

セル番号に最小値をマークして明示的に設定することで簡単に解決できますが、複数のセルが最小値を持つケースをカバーしたかったのです。

最小値を含む複数のセルを処理するには、2 番目のパスが必要です。

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

行内のすべてのセルを通るループは同じままです。今回は、セルの値が選択した最小値と一致するかどうかを確認しているだけです。一致すると、フォントの色が青に変わります。それ以外の場合、フォントの色は黒に変更されます。


それはそれについて要約します。Google Apps Scripting がスプレッドシートやデータ セルを参照する方法に慣れるのは少し難しいですが、Docs でできないことはほとんどありません。

このコードの作成/テストに使用したスプレッドシートへの公開リンクを作成しました。お気軽にお試しください。

于 2012-01-02T14:42:55.357 に答える