首页 文章

Google电子表格:用于根据相邻单元格中的十六进制代码更改单元格背景颜色的脚本

提问于
浏览
0

我正在尝试编写一个脚本,它将采用一列十六进制代码并将相邻列的背景颜色设置为十六进制代码颜色,但我不知道该怎么做 .

我一直在看这些:

1) https://developers.google.com/apps-script/reference/spreadsheet/range#setbackgroundcolor

2) https://developers.google.com/apps-script/reference/spreadsheet/range#getcellrow-column

3) Google Spreadsheet: Script to Change Row Color when a cell changes text;

但是并没有真正取得任何进展 . 任何帮助,将不胜感激!

谢谢!

2 回答

  • 1

    这样的事情可以解决你的问题:

    function onEdit() {
    
      var sheet = SpreadsheetApp.getActiveSheet();
      var range = sheet.getDataRange();
      var actCell = sheet.getActiveCell();
      var actData = actCell.getValue();
      var actRow = actCell.getRow();
      if (actData != '' && actRow != 1)  //Leaving out empty and header rows
      {
        range.getCell(actRow, 2).setBackground(actData);
      }
    
    }
    

    虽然,这一次只能为一个单元格着色,但它描述了如何根据单元格输入设置背景颜色 . 根据您的使用情况,无论您是一次复制粘贴多个十六进制代码,还是有现有的十六进制代码列表,并且您希望显示它们的颜色,使用 getCell(row,column).setBackground(String) 应该能够帮助您 .

  • 0

    这是一个只对指定列起作用的解决方案,并且还要确保输入的文本是有效的十六进制颜色代码 . 您可以让它观察一列进行更改,并将背景颜色更改应用于任何其他列,而不仅仅是紧邻的列 . 您也不必担心包含其他文本的单元格,例如 Headers ,因为此代码将忽略它们 . 您可以将多行粘贴到电子表格中,因为此功能将对监视列中的任何已编辑单元格进行操作 .

    值得注意的是,这段代码不是万无一失的,我还没有对它进行优化 . 例如,如果您尝试更改超出活动工作表当前最大范围的单元格的背景颜色,则可能会出现错误(如果需要,您可以轻松编写代码以向工作表添加新列) . 此外,如果将极大量的行粘贴到工作表中,则该功能可能会超时 . 虽然我怀疑这会在正常使用中发生,但从技术上讲,最佳做法是在forEach循环结束时一次性应用所有更改,而不是一次应用一次 .

    您可以将其重写为菜单功能,如果这就是“取一列十六进制代码”的含义 . 以下代码仅适用于新输入的文本 . 对于预先存在的文本,重命名该函数并对其进行修改以自动检查所需的列而不是用作触发器(或者如果要仅选择某些单元格,则检查活动范围) . 没有麻烦,没有大惊小怪 .

    正则表达式假定有效的十六进制颜色代码是以octothorpe开头并且后跟3或6个字符的字符串,每个字符必须是0-9,A-F或a-f .

    SpreadsheetApp.flush()可能不是绝对必要的,但它应该能够在这种情况下实时更新更改 .

    // regex for hex color codes
    HEX_COLOR_REGEX = /(^#[0-9A-Fa-f]{3}$)|(#[0-9A-Fa-f]{6}$)/;
    
    // column to watch for changes (i.e. column where hex color codes are to be entered)
    HEX_CODE_COLUMN = 1; // i.e. column A
    
    // column to change when above column is edited
    HEX_COLOR_COLUMN = 2; // i.e. column B
    
    // utility function to test whether a given string qualifies as a hex color code
    function hexTest(testCase) {
      return HEX_COLOR_REGEX.test(testCase);
    }
    
    function onEdit(e) {
      var range = e.range;
      var row = range.getRow();
      var column = range.getColumn();
      if (column === HEX_CODE_COLUMN) {
        var values = range.getValues();
        values.forEach( function checkCode(rowValue, index) {
          var code = rowValue[0];
          if (hexTest(code)) {
            var cell = SpreadsheetApp.getActiveSheet().getRange(row + index, HEX_COLOR_COLUMN);
            cell.setBackground(code);
            SpreadsheetApp.flush();
          }
        });
      }
    }
    

相关问题