programing

셀이 텍스트를 변경할 때 행 색상을 변경하는 스크립트

nasanasas 2021. 1. 10. 17:25
반응형

셀이 텍스트를 변경할 때 행 색상을 변경하는 스크립트


버그 목록을 보관하고 버그를 수정할 때마다 상태를 "시작되지 않음"에서 "완료"로 변경하는 Google 스프레드 시트가 있습니다. 상태를 "완료"로 변경할 때마다 전체 행이 특정 색상으로 강조 표시되도록 Google 문서 스프레드 시트 용 스크립트를 작성하고 싶습니다.

이미 Google 스프레드 시트에 "텍스트 색상 변경"이 있지만이 기능은 셀의 색상 만 변경하고 전체 행의 색상은 변경하지 않습니다.


//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;
    } 
  }
}

이것이 오래된 스레드라는 것을 깨달았지만 이와 같은 많은 스크립트를 본 후에 조건부 서식을 사용하여이 작업을 수행 할 수 있음을 알았습니다.

"상태"가 D 열이라고 가정합니다.

셀 강조 표시> 마우스 오른쪽 버튼 클릭> 조건부 서식. "Custom Formula Is"를 선택하고 공식을 다음과 같이 설정합니다.

=RegExMatch($D2,"Complete")

또는

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

편집 (Frederik Schøning에게 감사)

=RegExMatch($D2,"(?i)Complete")그런 다음 모든 행을 포함하도록 범위를 설정하십시오 A2:Z10. 대소 문자를 구분하지 않으므로 complete, Complete 또는 CoMpLeTe와 일치합니다.

그런 다음 "시작되지 않음"등에 대한 다른 규칙을 추가 할 수 있습니다. $는 매우 중요합니다. 절대 참조를 나타냅니다. 그것이 없으면 셀 A2는 D2를 볼 수 있지만 B2는 E2를 볼 것이므로 주어진 행에서 일관되지 않은 형식을 얻습니다.


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

user2532030의 대답은 정확하고 가장 간단한 대답입니다.

I just want to add, that in the case, where the value of the determining cell is not suitable for a RegEx-match, I found the following syntax to work the same, only with numerical values, relations et.c.:

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

If column 2 of any row (row 2 in script, but the leading $ means, this could be any row) textually equals "Complete", do X for the Range of the entire sheet (excluding header row (i.e. starting from A2 instead of A1)).

But obviously, this method allows also for numerical operations (even though this does not apply for op's question), like:

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

So, do stuff, if the value of col B in any row is higher than col C value.

One last thing: Most likely, this applies only to me, but I was stupid enough to repeatedly forget to choose Custom formula is in the drop-down, leaving it at Text contains. Obviously, this won't float...


I think simpler (though without a script) assuming the Status column is ColumnS.

Select ColumnS and clear formatting from it. Select entire range to be formatted and Format, Conditional formatting..., Format cells if... Custom formula is and:

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

with fill of choice and Done.

This is not case sensitive (change search to find for that) and will highlight a row where ColumnS contains the likes of Now complete (though also Not yet complete).

ReferenceURL : https://stackoverflow.com/questions/3703676/script-to-change-row-color-when-a-cell-changes-text

반응형