如何根据列中的重复值为每个值设置不同颜色的单元格颜色

How to set cell color based in duplicated value in column with different colours for each values

在 Google 电子表格文档中,我需要根据列中的重复值设置单元格颜色,每个重复值 颜色不同 。颜色应该设置为 'random' 这样所有的颜色都会不同。

应用条件后,单元格的颜色应如下所示: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?类似,但不一样,因为我需要为每个重复值提供不同的颜色

我想我可能需要一个脚本来完成这项工作?我不认为这可以通过 'conditional formatting' 规则功能来完成。

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

黄色:

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

蓝色:

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

粉色:

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

绿色:

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

红色:

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

橙色:

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

这是一个有效的脚本:

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 列中查找重复项,但如果需要将其更改为另一列,您也可以更改它。

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

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

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