web-dev-qa-db-ja.com

テーブル内の特定の値の自動色付け

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

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

1が含まれるすべてのセルに色を付けます。

37
Verhogen

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

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

編集:

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

57
Kekoa

トリックは、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 Docsスクリプトイベントコールバックの性質上、サーバー側で実行されるため、不正使用を防ぐために、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に設定します。 これはより適切な値に変更される可能性があります 。秘Theは、値と現在の安値をテストすることです。低い場合は、新しい低い値をマークします。

セル番号に最小値をマークして明示的に設定することで簡単に降りることができますが、複数のセルに最小値がある場合をカバーしたかったのです。

最小値を含む複数のセルを処理するには、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ができないことはあまりありません。

このコードの作成/テストに使用したスプレッドシートに パブリックリンク を作成しました。試してみてください。

26
Evan Plaice