【问题标题】:How to set cell color based in duplicated value in column with different colours for each values如何根据列中的重复值为每个值设置不同颜色的单元格颜色
【发布时间】:2020-04-08 17:38:18
【问题描述】:

在 Google 电子表格文档中,我需要根据列中的重复值设置单元格颜色,为每个重复值设置不同的颜色。颜色应设置为“随机”,以便所有颜色都不同。

应用条件后,单元格的颜色应如下所示:https://docs.google.com/spreadsheets/d/1YuUjg_PqD53AoTrxgvnEHYwZ_disqvNKDMmp5dRYq4I/edit?usp=sharing

这个问题与How to highlight cell if value duplicate in same column for google spreadsheet? 类似,但不一样,因为我需要为每个重复值赋予不同的颜色

我想我可能需要一个脚本来完成这项工作?我认为这不能通过“条件格式”规则功能来完成。

更新: Player0 发布的条件非常有效。但问题是,在示例中我只发布了几个单元格。在真实的电子表格中,我有数百个不时变化的值。然后使用这种方法,我将需要创建很多条件规则。我需要用一个公式动态地做到这一点。它应该是应用于 A 列的单个公式/脚本,它为每个值重合生成随机颜色...

【问题讨论】:

    标签: google-sheets google-sheets-formula array-formulas gs-conditional-formatting gs-vlookup


    【解决方案1】:

    黄色:

    =(ARRAYFORMULA(VLOOKUP(A1; {UNIQUE(A$1:A)\ 
      ROW(INDIRECT("A1:A"&COUNTUNIQUE(A$1:A)+1))}; 2; 0))=1)*
     (COUNTIF(A:A; A1)>1)
    

    蓝色:

    =(ARRAYFORMULA(VLOOKUP(A1; {UNIQUE(A$1:A)\ 
      ROW(INDIRECT("A1:A"&COUNTUNIQUE(A$1:A)+1))}; 2; 0))=2)*
     (COUNTIF(A:A; A1)>1)
    

    粉色:

    =(ARRAYFORMULA(VLOOKUP(A1; {UNIQUE(A$1:A)\ 
      ROW(INDIRECT("A1:A"&COUNTUNIQUE(A$1:A)+1))}; 2; 0))=3)*
     (COUNTIF(A:A; A1)>1)
    

    绿色:

    =(ARRAYFORMULA(VLOOKUP(A1; {UNIQUE(A$1:A)\ 
      ROW(INDIRECT("A1:A"&COUNTUNIQUE(A$1:A)+1))}; 2; 0))=4)*
     (COUNTIF(A:A; A1)>1)
    

    红色:

    =(ARRAYFORMULA(VLOOKUP(A1; {UNIQUE(A$1:A)\ 
      ROW(INDIRECT("A1:A"&COUNTUNIQUE(A$1:A)+1))}; 2; 0))=5)*
     (COUNTIF(A:A; A1)>1)
    

    橙色:

    =(ARRAYFORMULA(VLOOKUP(A1; {UNIQUE(A$1:A)\ 
      ROW(INDIRECT("A1:A"&COUNTUNIQUE(A$1:A)+1))}; 2; 0))=6)*
     (COUNTIF(A:A; A1)>1)
    

    【讨论】:

    • 抱歉耽搁了。条件很好,谢谢。但问题是在示例中我只发布了几个单元格。在真实的电子表格中,我有数百个不时变化的值。然后用你的方法,我需要创建很多条件规则。有没有办法用一个公式动态地做到这一点?也许一个公式会为每个值重合生成随机颜色...
    • 您可以编辑此工作表以备不时之需:docs.google.com/spreadsheets/d/…
    • 这是唯一的方法。但你可以尝试一些可能有效的脚本解决方案
    • 好的,谢谢。恐怕我没有创建这个脚本的知识。我刚开始赏金,以防万一你对此感兴趣。
    【解决方案2】:

    这是一个有效的脚本:

    function colorDuplicates() {
      var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      var lr = ss.getLastRow();
      var column = 1
      ss.getRange(2, column, lr).setBackground(null);
      var color = ["#EA9999","#F9CB9C","#FFE599","#B6D7A8","#A2C4C9","#9FC5E8","#B4A7D6","#D5A6BD","#CCCCCC","#B45F06","#666666","#FF0000","#FF9900","#FFFF00","#00FF00","#00FFFF"];
      var c = 0;
      var checkcolor = false;
      for (var i = 2; i < lr+1;i++){
        if (checkcolor == true) {
          c++;
          checkcolor = false;
        }
        var a = ss.getRange(i, column).getValue();
        if (a == "") {continue;}
        var cellcolor = ss.getRange(i, column).getBackground();
        if (cellcolor != "#ffffff") {continue;}
        for (var j = i+1;j< lr+1;j++){
          var b = ss.getRange(j, column).getValue();
          if (a != b) {continue;}
          var cellcolor = ss.getRange(j, column).getBackground();
          if (cellcolor != "#ffffff") {continue;}
          ss.getRange(i, column).setBackground(color[c]);
          ss.getRange(j, column).setBackground(color[c]);
          checkcolor = true;
        }
      }
    }
    
    
    
    function colorDuplicates2() {
      var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      var lr = getLastRowSpecial(ss.getRange("A:A").getValues());
      var lc = ss.getLastColumn();
      ss.getRange(2, 1, lr).setBackground(null);
      ss.insertColumnAfter(lc);
      ss.getRange(1, lc+1).setFormula("=FILTER(UNIQUE(A2:A);UNIQUE(A2:A)<>\"\")"); // Change the ";" for a "," if you are in the us
      var numValues = getLastRowSpecial(ss.getRange(1, lc+1, lr).getValues());
      var values = new Array(36);
      for (var a = 1;a<numValues+1;a++){
        values[a] = String(ss.getRange(a, lc+1).getValue());
      }
    
      var color = ["#980000", "#ff0000", "#ff9900", "#ffff00", "#00ff00", "#00ffff", "#4a86e8", "#0000ff", "#9900ff", "#ff00ff", "#e6b8af", "#f4cccc", "#fce5cd", "#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#a4c2f4", "#9fc5e8", "#b4a7d6", "#d5a6bd", "#cc4125", "#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6d9eeb", "#6fa8dc", "#8e7cc3", "#c27ba0", "#a61c00", "#cc0000", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3c78d8", "#3d85c6", "#674ea7", "#a64d79", "#85200c", "#990000"];
    
      for (var i = 2;i<lr+1;i++){
        switch (String(ss.getRange(i, 1).getValue())) {
          case values[1]:
            ss.getRange(i, 1).setBackground(color[1]);
            break;
          case values[2]:
            ss.getRange(i, 1).setBackground(color[2]);
            break;
          case values[3]:
            ss.getRange(i, 1).setBackground(color[3]);
            break;
          case values[4]:
            ss.getRange(i, 1).setBackground(color[4]);
            break;
          case values[5]:
            ss.getRange(i, 1).setBackground(color[5]);
            break;
          case values[6]:
            ss.getRange(i, 1).setBackground(color[6]);
            break;
          case values[7]:
            ss.getRange(i, 1).setBackground(color[7]);
            break;
          case values[8]:
            ss.getRange(i, 1).setBackground(color[8]);
            break;
          case values[9]:
            ss.getRange(i, 1).setBackground(color[9]);
            break;
          case values[10]:
            ss.getRange(i, 1).setBackground(color[10]);
            break;
          case values[11]:
            ss.getRange(i, 1).setBackground(color[11]);
            break;
          case values[12]:
            ss.getRange(i, 1).setBackground(color[12]);
            break;
          case values[13]:
            ss.getRange(i, 1).setBackground(color[13]);
            break;
          case values[14]:
            ss.getRange(i, 1).setBackground(color[14]);
            break;
          case values[15]:
            ss.getRange(i, 1).setBackground(color[15]);
            break;
          case values[16]:
            ss.getRange(i, 1).setBackground(color[16]);
            break;
          case values[17]:
            ss.getRange(i, 1).setBackground(color[17]);
            break;
          case values[18]:
            ss.getRange(i, 1).setBackground(color[18]);
            break;
          case values[19]:
            ss.getRange(i, 1).setBackground(color[19]);
            break;
          case values[20]:
            ss.getRange(i, 1).setBackground(color[20]);
            break;
          case values[21]:
            ss.getRange(i, 1).setBackground(color[21]);
            break;
          case values[22]:
            ss.getRange(i, 1).setBackground(color[22]);
            break;
          case values[23]:
            ss.getRange(i, 1).setBackground(color[23]);
            break;
          case values[24]:
            ss.getRange(i, 1).setBackground(color[24]);
            break;
          case values[25]:
            ss.getRange(i, 1).setBackground(color[25]);
            break;
          case values[26]:
            ss.getRange(i, 1).setBackground(color[26]);
            break;
          case values[27]:
            ss.getRange(i, 1).setBackground(color[27]);
            break;
          case values[28]:
            ss.getRange(i, 1).setBackground(color[28]);
            break;
          case values[29]:
            ss.getRange(i, 1).setBackground(color[29]);
            break;
          case values[30]:
            ss.getRange(i, 1).setBackground(color[30]);
            break;
          case values[31]:
            ss.getRange(i, 1).setBackground(color[31]);
            break;
          case values[32]:
            ss.getRange(i, 1).setBackground(color[32]);
            break;
          case values[33]:
            ss.getRange(i, 1).setBackground(color[33]);
            break;
          case values[34]:
            ss.getRange(i, 1).setBackground(color[34]);
            break;
          case values[35]:
            ss.getRange(i, 1).setBackground(color[35]);
            break;
          case values[36]:
            ss.getRange(i, 1).setBackground(color[36]);
            break;
    
        }
      }
      ss.deleteColumn(lc+1);
    }
    
    
    
    function getLastRowSpecial(range){
      var rowNum = 0;
      var blank = false;
      for(var row = 0; row < range.length; row++){
    
        if(range[row][0] === "" && !blank){
          rowNum = row;
          blank = true;
        }else if(range[row][0] !== ""){
          blank = false;
        };
      };
      return rowNum;
    }
    

    它只有 16 种颜色,它会将之后找到的重复项留空,但您可以根据需要添加更多颜色。

    它适用于在 A 列中查找重复项,但如果您需要将其更改为另一列,也可以更改它。

    试试看,有什么问题随时问我。祝你好运!

    *我编辑了我之前的答案,因为它没有考虑出现两次以上的值。

    *我再次编辑以避免空单元格。

    【讨论】:

    • 您好,它只为第一对匹配项添加单元格颜色。在此处捕获:nimb.ws/1Bma2r BTW:我将脚本保存为宏,然后运行脚本。
    • 我认为问题在于脚本还检查了空单元格。有没有办法避免检查没有值的单元格?
    • 是的,很抱歉。我刚刚修复了空单元格的问题。你可以再试一次。
    • 谢谢,它有效,但是扫描数据需要很多(很多...)时间,并且只有 12 行。工作表有 1000 行。有没有办法优化脚本?
    • 我认为脚本仍然会检查空白单元格。我删除了所有数据并运行脚本,它花了一分钟才停止。您确定脚本会避免检查没有值的单元格吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2017-11-09
    • 2017-11-11
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多