58

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

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

4

5 に答える 5

58
//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;
    } 
  }
}
于 2010-10-05T01:32:55.347 に答える
30

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");
            }   
        }
    }
}
于 2012-12-05T20:26:08.163 に答える
6

user2532030 の答えは、正しくて最も単純な答えです。

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

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

任意の行の列 2 (スクリプトでは行 2 ですが、先頭の $ は、これが任意の行である可能性があることを意味します) のテキストが "Complete" に等しい場合、シート全体の Range に対して X を実行します (ヘッダー行を除く (つまり、ヘッダー行の代わりに A2 から開始) A1)))。

しかし、明らかに、このメソッドは数値演算も可能にします (ただし、これは op の質問には適用されません)。

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

したがって、任意の行の列 B の値が列 C の値よりも高い場合は、処理を行います。

最後に 1 つ: おそらく、これは私だけに当てはまりますが、私は愚かで、ドロップダウンで [カスタム数式] を選択するのを繰り返し忘れて、 [テキストを含む] のままにしました。明らかに、これは浮きません...

于 2014-11-12T09:06:56.357 に答える