Google电子表格:当单元格更改文本时更改行颜色的脚本;

Mad*_*Seb 53 google-sheets google-apps-script gs-conditional-formatting

我有一个googlespreadsheet,我保留一个错误列表,每当我修复一个错误,我将状态从"未启动"更改为"完成".我想为Google Docs电子表格编写一个脚本,这样每当我将状态更改为"完成"时,整个行都会以某种颜色突出显示.

我已经知道Google Spreadsheet已经"改变了文本颜色",但该功能只改变了单元格的颜色,并没有改变整行的颜色.

gen*_*egc 55

//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;
    } 
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 当文本发生变化时,您如何告诉Google Docs执行此功能? (13认同)
  • @genegc你能不能给你的anwser添加一些评论?有些人可能需要一些指导如何处理您发布的代码. (6认同)

use*_*030 40

意识到这是一个旧线程,但在看到这样的大量脚本后,我注意到你可以使用条件格式化来实现这一点.

假设"状态"是D列:

突出显示单元格>右键单击>条件格式.选择"自定义公式为"并将公式设置为

=RegExMatch($D2,"Complete")

要么

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

编辑(感谢FrederikSchøning)

=RegExMatch($D2,"(?i)Complete")然后设置范围以涵盖所有行,例如A2:Z10.这不区分大小写,因此将匹配complete,Complete或CoMpLeTe.

然后,您可以为"未开始"等添加其他规则.$非常重要.它表示绝对参考.如果没有它,单元格A2将查看D2,但B2将查看E2,因此您将在任何给定行上获得不一致的格式.

  • 注意:使用最新版本的google docs,user2532030的答案是最简单的使用方法.在我的情况下,我想突出显示基于单元格为"Y"的行.我突出显示了顶行,右键单击条件格式.设置"自定义公式Is"= = RegExMatch($ G1,"Y"),范围= 1:1000.这对整张纸进行了分类. (4认同)
  • 这是一个很好的解决方案.但是,不应使用OR运算符来捕获小写和Pascal符号,而应该利用正则表达式支持来解决大小写不敏感:= RegExMatch($ D2,"(?i)complete").这将匹配"完整"一词的所有文字表示,包括"cOmPlEtE"等.我已对此进行了测试,Google Apps支持案例忽略指令. (3认同)

Bla*_*Tea 28

我使用了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");
            }   
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Fre*_*ing 6

user2532030的答案是正确而简单的答案.

我只是想补充一点,在这种情况下,确定单元格的值不适合RegEx匹配,我发现以下语法工作相同,只有数值,关系et.c.:

[Custom formula is]
=$B$2:$B = "Complete"
Range: A2:Z1000
Run Code Online (Sandbox Code Playgroud)

如果任何行的第2列(脚本中的第2行,但前导$表示,这可能是任何行)在文本上等于"完成",则对整个工作表的范围执行X(不包括标题行(即从A2开始而不是A1)).

但显然,这种方法也允许进行数值运算(即使这不适用于op的问题),如:

=$B$2:$B > $C$2:$C
Run Code Online (Sandbox Code Playgroud)

所以,如果任何一行中col B的值高于col C值,那么就做.

最后一件事: 最有可能,这只适用于我,但我愚蠢到反复忘记选择自定义公式在下拉列表中,留在文本包含.显然,这不会漂浮......