web-dev-qa-db-ja.com

セルのテキストが変更されたときに行の色を変更するスクリプト

バグのリストを保持するGoogleスプレッドシートがあり、バグを修正するたびにステータスを「未開始」から「完了」に変更します。 Google Docsスプレッドシートのスクリプトを作成して、ステータスを「完了」に変更するたびに行全体が特定の色で強調表示されるようにします。

Googleスプレッドシートには「テキストの色を変更する」機能があることは既に知っていますが、この関数はセルの色のみを変更し、行全体の色は変更しません。

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

これは古いスレッドであることに気づきますが、このようなスクリプトをたくさん見て、条件付き書式を使用するだけでこれができることに気付きました。

「ステータス」が列Dであると仮定します。

セルを強調表示>右クリック>条件付き書式設定。 [カスタム数式]を選択し、数式を次のように設定します

=RegExMatch($D2,"Complete")

または

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

編集(フレデリックシェーニングのおかげ)

=RegExMatch($D2,"(?i)Complete")その後、すべての行をカバーする範囲を設定します。 A2:Z10。これは大文字と小文字を区別しないため、complete、Complete、またはCoMpLeTeに一致します。

その後、「未開始」などのルールを追加できます。$は非常に重要です。絶対参照を示します。これがないと、セルA2はD2を参照しますが、B2はE2を参照するため、特定の行で一貫性のない書式設定が行われます。

41
user2532030

GENEGCのスクリプトを使用しましたが、かなり遅いことがわかりました。

すべての編集でシート全体をスキャンするため、時間がかかります。

だから私は自分のためにずっと速くてきれいな方法を書いて、それを共有したいと思った。

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

user2532030の答えは、最も簡単で正しい答えです。

追加したいのは、決定セルの値がRegEx一致に適していない場合、数値、関係などでのみ同じように機能する次の構文があることです。

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

任意の行の列2(スクリプトの行2、ただし先頭の$はこれが任意の行であることを意味する)がテキスト的に「Complete」に等しい場合、シート全体の範囲に対してXを実行します(ヘッダー行を除く(つまり、A2 A1))。

しかし、明らかに、この方法は次のような数値演算も可能にします(これはopの質問には当てはまりませんが)。

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

したがって、いずれかの行のcol Bの値がcol Cの値よりも大きい場合は、処理を行います。

最後の1つ:おそらく、これは私だけに当てはまりますが、繰り返し選択するのを忘れるほど愚かでしたカスタム式はドロップダウンで、Text containsのままにします。明らかに、これは浮かない...

Status列がColumnSであると仮定すると、(スクリプトはありませんが)より簡単だと思います。

ColumnSを選択し、そこからフォーマットをクリアします。フォーマットする範囲全体を選択し、フォーマット、条件付きフォーマット...、次の場合にセルをフォーマット... Custom formula isおよび:

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

選択の塗りつぶしと Done

これは大文字と小文字を区別せず(そのためにsearchfindに変更します)、ColumnSにNow completeのようなものが含まれる行を強調表示します(ただしNot yet completeも)。

4
pnuts