【问题标题】:Randomly assign cell background color based on unique cell texts根据唯一的单元格文本随机分配单元格背景颜色
【发布时间】:2020-04-01 22:03:44
【问题描述】:

我正在寻找一些条件格式化解决方案,其中将新的单元格背景颜色设置为唯一的单元格文本。下图显示了这一点。

棘手的部分是我事先不会知道列表中的任何值。

【问题讨论】:

  • 因此,如果在一个单元格中引入了一个新文本 - 你想要一个新的颜色,但是如果一个文本已经存在于另一个单元格中,你想为新单元格分配相同的颜色吗?可以将 Apps 脚本与 onEdit 触发器结合使用。
  • @ziganotschka 你描述的很准确——比我做的好哈哈。关于如何实现这一点的任何其他具体提示/建议?

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


【解决方案1】:

如何为单元格分配唯一的颜色onEdit

  • Apps Script onEdit trigger 每次在您的脚本中执行(手动!)编辑时自动运行您的函数
  • onEdit 函数应将新条目(预定义列的最后一行)与 indexOf() 列中的现有值进行比较
  • 如果值已经存在 - 使用getBackground() 检索相应单元格的背景颜色并将其分配给带有setBackground(color) 的新单元格
  • 如果该值尚不存在:
  • 如果该值已经存在 - 它将根据现有规则自动分配正确的背景颜色。

示例:

function onEdit(e) {
  if(e.range.getColumn()==1){
    var text = e.value;
    var sheet = SpreadsheetApp.getActive().getActiveSheet();
    var range = sheet.getRange(1,1,sheet.getLastRow(),1);
    var values = range.getValues();
    var array = [];
    var row = e.range.getRow();
    for (var i =0; i <values.length; i++){
      if(row!=(i+1))
      {
        array.push(values[i][0]);
      }
    }
    if(array.indexOf(text)==-1){
      var backgrounds = range.getBackgrounds();
      var color = getRandomColor();
      while(backgrounds.indexOf(color)>-1){
        color = getRandomColor();
      }
      buildConditionalFormatting(text, color)
    }
  } 
}

function getRandomColor() {
  var letters = '0123456789abcdef';
  var color = '#';
  for (var i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}


function buildConditionalFormatting(text, color){
  var sheet = SpreadsheetApp.getActiveSheet();
  var formattingRange = sheet.getRange("A:A");
  var rule = SpreadsheetApp.newConditionalFormatRule()
  .whenTextEqualTo(text)
  .setBackground(color)
  .setRanges([formattingRange])
  .build();
  var rules = sheet.getConditionalFormatRules();
  rules.push(rule);
  sheet.setConditionalFormatRules(rules);

}


【讨论】:

  • 嗨@ziganotschka。感谢您对脚本的详细解释!我正在尝试将其扩展到几列,但到目前为止还没有运气。我做了以下更改以将 B 列包括为测试:if(e.range.getColumn()==2)var range = sheet.getRange(1,1,sheet.getLastRow(),2);var formattingRange = sheet.getRange("A:B"); 为什么不起作用?
  • 我找到了解决这些变化的方法:if(e.range.getColumn()==1 || e.range.getColumn()==2)var range = sheet.getRange(1,1,sheet.getLastRow(),2);var formattingRange = sheet.getRange("A:B");。再次感谢。接下来我将尝试弄清楚如何接受任何列。
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 2016-01-08
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多