【问题标题】:Script to Change Row Color when a cell changes text当单元格更改文本时更改行颜色的脚本
【发布时间】:2011-04-11 20:19:15
【问题描述】:

我有一个 Google 电子表格,其中保存了错误列表,每当我修复错误时,我都会将状态从“未开始”更改为“完成”。我想为 Google Docs 电子表格编写一个脚本,这样每当我将状态更改为“完成”时,整行都会以某种颜色突出显示。

我已经知道 Google 电子表格已经有“更改文本颜色”功能,但该功能仅更改单元格的颜色,不会更改整行的颜色。

【问题讨论】:

    标签: google-apps-script google-sheets gs-conditional-formatting


    【解决方案1】:
    //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;
        } 
      }
    }
    

    【讨论】:

    • 当文本发生变化时,如何告诉 Google Docs 执行此功能?
    • @genegc 你能把一些 cmets 添加到你的 anwser 中吗?有些人可能需要一些关于如何处理您发布的代码的指导。
    • 查看 user2532030 的响应
    【解决方案2】:

    我使用了 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");
                }   
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      意识到这是一个旧线程,但是在看到很多这样的脚本后,我注意到您可以只使用条件格式来做到这一点。

      假设“状态”是 D 列:

      突出显示单元格 > 右键单击​​ > 条件格式。 选择“自定义公式是”并将公式设置为

      =RegExMatch($D2,"Complete")

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

      编辑(感谢 Frederik Schøning)

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

      然后您可以为“未开始”等添加其他规则。$ 非常重要。它表示绝对参考。没有它,单元格 A2 会查看 D2,但 B2 会查看 E2,因此在任何给定行上都会出现不一致的格式。

      【讨论】:

      • 注意:使用最新版本的谷歌文档,user2532030 的答案是最容易使用的答案。就我而言,我想突出显示基于单元格为“Y”的行。我突出显示了第一行,右键单击条件格式。设置“自定义公式为” = =RegExMatch($G1,"Y"),范围 =1:1000。这对整个工作表进行了排序。
      • 简洁的解决方案。谢谢 :)
      • 这是一个很好的解决方案。但是,您应该利用正则表达式支持不区分大小写,而不是使用 OR 运算符来捕获小写和 Pascal 符号,如下所示:=RegExMatch($D2,"(?i)complete")。这将匹配“完整”一词的所有文字表示,包括“cOmPlEtE”等。我已经对此进行了测试,Google Apps 支持忽略大小写指令。
      • 这是一个很棒的补充 Frederik。我已经编辑了我的答案以包含它。
      • 你可以做的更简单。自定义公式:=$D$1:$D$25="已完成"。然后将范围设置为要着色的行。例如范围:1:25
      【解决方案4】:

      user2532030 的答案是正确且最简单的答案。

      我只想补充一点,在确定单元格的值不适合 RegEx 匹配的情况下,我发现以下语法的工作方式相同,仅适用于数值、关系等。 :

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

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

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

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

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

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

      【讨论】:

        【解决方案5】:

        假设Status 列是 ColumnS,我认为更简单(尽管没有脚本)。

        选择 ColumnS 并从中清除格式。选择要格式化的整个范围和格式、条件格式...、格式单元格如果...Custom formula is 和:

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

        选择填充并完成

        这不区分大小写(将search 更改为find),并将突出显示ColumnS 包含Now complete 之类的行(尽管还有Not yet complete)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-30
          • 1970-01-01
          • 2019-06-06
          • 1970-01-01
          • 2017-08-07
          • 2016-02-21
          • 1970-01-01
          • 2014-06-16
          相关资源
          最近更新 更多