【问题标题】:Google Spreadsheet: Script to change background color of a cell based on a hex code in the neighboring cellGoogle电子表格:根据相邻单元格中的十六进制代码更改单元格背景颜色的脚本
【发布时间】:2015-08-26 07:56:57
【问题描述】:

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

我一直在看这些:

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;

但还没有真正取得任何进展。任何帮助将不胜感激!

谢谢!

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案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) 应该能够帮助您。

    【讨论】:

      【解决方案2】:

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

      值得注意的是,这段代码并不是万无一失的,我也没有对其进行优化。例如,如果您尝试更改超出活动工作表当前最大范围的单元格的背景颜色,您可能会遇到错误(如果需要,您可以轻松编写代码以向工作表添加新列)。此外,如果您将大量行粘贴到工作表中,该函数可能会超时。虽然我怀疑这会在正常使用中发生,但从技术上讲,最佳做法是在 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();
            }
          });
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        • 2015-02-03
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        相关资源
        最近更新 更多