【问题标题】:Highlight entire row when cell is active单元格处于活动状态时突出显示整行
【发布时间】:2016-11-07 07:43:34
【问题描述】:

如何设计一个能够突出显示活动行的工作表脚本?

当该行中的一个单元格处于活动状态时,我希望整行更改字体或背景颜色。

我不希望触发器是单元格中的任何特定值,只需单击一个单元格即可触发该单元格所属的整行的突出显示。

【问题讨论】:

    标签: google-apps-script google-sheets formatting


    【解决方案1】:

    抱歉,条件格式或脚本无法通过仅选择一个单元格来完成此操作。 但是,您可以使用组合键 Shift+空格键 突出显示活动单元格的整行。

    【讨论】:

    【解决方案2】:

    我意识到这个问题是不久前提出的,但是当我也在寻找同样的功能时,我偶然发现了它。我的解决方案有点麻烦,并且不是您正在寻找的完整解决方案,但它结合了一个小脚本和一些条件格式。

    我首先使用 onEdit() 函数编写了一个小脚本:

    function onEdit(e) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var targetCell = sheet.getRange('AD1');
      var activeCell = e.range.getA1Notation();
      targetCell.setValue(activeCell);
    }
    

    我选择了“AD1”作为目标单元格,因为它很远,如果需要,我还可以选择隐藏该列。

    然后我转到条件突出显示并将其作为自定义公式输入:

    =ROW()=ROW(INDIRECT($AD$1))
    

    瞧!每次我编辑一个单元格时,它都会自动突出显示整行。

    这不是您要查找的内容,因为它不会在您单击单元格时自动突出显示整行...仅在您编辑单元格时。此外,如果您正在运行其他公式和其他条件格式,您的电子表格可能会开始变慢。但这是我所见过的最接近可能解决方案的地方。

    没有那么酷,但在易读性方面仍然有些功能是每隔一行的基本突出显示。例如:

    在条件格式中:=ROW()=EVEN(ROW())

    【讨论】:

    • TypeError:无法从未定义中读取属性“范围”。 (第 5 行,文件“代码”)
    • 这与 function onSelectionChange(e) 函数配合使用非常棒,而不是使用 onEdit(e) 。休息一下,我已经按照您的说明完成了,即使用 Conditional Formatting
    • UPDATE 唯一的问题是,为了让它彻底工作,我必须在 条件格式中组织 条件我>。即,将 此条件 移至列表顶部。
    【解决方案3】:

    你描述的问题可以通过checkbox间接解决。

    1. 在表中插入 A 列。
    2. 在 A 列中,选择要以颜色突出显示的行中的单元格。
    3. 插入菜单中,选择复选框
    4. 选择已插入复选框的整行。
    5. 格式菜单中,选择条件格式
    6. 格式化规则面板中,将自定义公式添加到此规则
    7. 输入公式=$A1=TRUE(而不是 1,使用您在第 4 步中选择的第一行号)。
    8. 指定格式样式

    从现在开始,选中复选框后,将突出显示整行。

    【讨论】:

      【解决方案4】:

      遗憾的是,这不能像我们都希望的那样通过 onFocus 完成,但这对我使用 onEdit 事件来说已经足够好了。它仍然很慢,所以也许有人可以让它更快(当然从读/写到属性,但这是我发现跟踪突出显示哪一行的唯一方法)。

      function onEdit(e){
        manageRowHighlight(e);  
      }
      
      function manageRowHighlight(e) {
        var props = PropertiesService.getScriptProperties();
        var prevRow = parseInt(props.getProperty('highlightedRow'));
      
        var range = e.range;
        var thisRow = range.getRow();
      
        //if it's same row, just ignore
        if (prevRow == thisRow) {
          return;
        } else if (prevRow != null){
          //else unhighlight it
          range = range.getSheet().getRange(prevRow + ':' + prevRow);
          range.setBackground(null);
        }
      
        //highlight the current row 
        var range = range.getSheet().getRange(thisRow + ':' + thisRow);
        range.setBackground('#fff2cc')
      
        //save the row so highlight can be removed later
        props.setProperty('highlightedRow', thisRow);
      };
      

      【讨论】:

        【解决方案5】:

        对我来说非常有效的解决方法是安装此应用程序https://www.autocontrol.app/ 以将键的正常行为重新定义为 shift+space 组合,这实际上是选择当前行的快捷方式。

        总结:我更改了向下/向上箭头的行为,以将新的键盘输入合成为向下箭头 + shift + 空格。这是程序:

        • 安装扩展后创建一个新规则并使用向下箭头作为触发器
        • 通过检查 URL 是否以 https://docs.google.com/spreadsheets/ 开头,将行为设置为仅在 Google 表格中发生
        • action 部分中选择 synthesize input(转到高级选项>其他)
        • 具体合成为:向下箭头,然后组合shift+space。完全按照这种方式进行。该应用会显示四个按钮。
        • 在合成框中单击 空格键 并将其设置为操作 2 次​​em>(这是选择整行而不是在某些情况下仅部分选择,但我建议您尝试使用“1次”
        • 使用向上箭头重复该过程。

        就是这样。一开始我花了一些时间,但知道诀窍之后就很容易了。我添加了此设置的外观图片。

        注意:为什么 GUI 会在合成框中显示四个按钮:箭头、移位、空格和再次移位?这是由于新闻/发布事件而导致的预期行为。

        注意2:如果扩展似乎无法正常工作,请右键单击扩展图标,检查“紧急修复”,或者只写开发人员。

        【讨论】:

          【解决方案6】:

          您可以像这样使用onSelectionChange 事件。

          在我的例子中,第 1 行有一些标题单元格,它们有自己的背景颜色。如果您在第 2 行或之后,我只会突出显示当前行。

          function onSelectionChange(e) {
            const range = e.range;
            const sheet = range.getSheet();
            const maxRows = sheet.getMaxRows();
            const maxColumns = sheet.getMaxColumns();
          
            // Clear the background color from all cells.      
            // (Except row 1 - that has my titles in it)
            sheet.getRange(2, 1, maxRows - 1, maxColumns).setBackground(null);
            
            // Don't set the background color if you're on the first row
            if (range.getRow() > 1) {
              // Highlight the current row
              sheet.getRange(range.getRow(), 1, 1, maxColumns).setBackground("#c9daf8");
            }
          }
          

          更新需要一秒钟左右的时间 - 我猜这个事件的触发有点慢。

          这适用于桌面或触控设备。

          【讨论】:

          • 很棒的解决方案!但是这个也去掉了所有以前的背景格式。取消突出显示该行后,如何保留它并重置为以前的背景颜色?
          【解决方案7】:

          当有很多列时,阅读电子表格很困难。选择一个小区/行时,它将突出显示整行,否则,它不会打扰:

          function onSelectionChange(e) {
              const sht = SpreadsheetApp.getActive().getActiveSheet();
              const rowCount = sht.getActiveRange().getNumRows();
              const maxRows = sht.getMaxRows();
              const maxColumns = sht.getMaxColumns();
          
              sht.getRange(2, 1, maxRows - 1, maxColumns).setBackground(null); //skip the first row (headers)
          
              if (rowCount == 1) {
                  const myrow = sht.getActiveRange().getRow();
                  if (myrow > 1) { //don't paint the header row
                      sht.getRange(myrow, 1, 1, maxColumns).setBackgroundRGB(230,230,130); 
                  }
              }
          }
          

          【讨论】:

            【解决方案8】:

            我不是 javascript 专家,但这可以通过直接修改对特定事件做出反应的文档来轻松完成。我查看了当前的 Sheets HTML 并在 JavaScript 控制台中运行以下代码使其在鼠标单击时突出显示:

            function f() { let mylist = document.getElementsByClassName("selection"); for (let i=0; i<mylist.length; i++) { if (parseInt(mylist[i].style.height)>0 && parseInt(mylist[i].style.width)>0) { mylist[i].style.left='0px'; mylist[i].style.width='100000px'; mylist[i].style.display=null; break; }; }; }; onclick = f;
            

            您可以在 Chrome 上使用 F12 打开控制台,然后单击控制台选项卡。之后您可以关闭它(F12X 按钮),更改将一直有效,直到页面关闭或重新加载。

            当然,Google 可以随时更改 HTML 和 CSS 并打破这一点,所以理想情况下,如果确实需要这样做,则应该有人维护扩展并随着工作表的更改保持更新(可能已经存在可以添加的通用扩展很简单,如果您知道,请发表评论)。

            扩展和注释的代码,如果您以后有兴趣修改或修复它:

            function f() {
            
                // Get all elements with class "selection"; there should be just a few
                // of them, and almost all should be have 0-width or 0-height
                let mylist = document.getElementsByClassName("selection")
            
                for (let i=0; i<mylist.length; i++) {
            
                    // Find the first element with an area (usually just one)
                    if (parseInt(mylist[i].style.height)>0 && parseInt(mylist[i].style.width)>0) {
            
                        // Set left to 0px (it's >0 when you click on other columns than A)
                        mylist[i].style.left = '0px';
            
                        // Set width to something large so it take the whole sheet
                        mylist[i].style.width = '100000px'; // NB: very wide sheets could need more!
            
                        // Undef the display attribute (set to 'none' by default to hide selection color)
                        mylist[i].style.display = null;
            
                        // On multi-row selections we may match more than one element,
                        // changing anything but the first breaks the sheet
                        break;
                    };
                };
            };
            
            // Run the function on every mouse click
            onclick = f;
            

            【讨论】:

            • 注意:我试图让它与箭头键移动一起使用,但看起来应用程序在我们可以使用 onkey* 之前抓取了键盘事件,对此的任何解决方案将不胜感激。
            猜你喜欢
            • 2020-05-15
            • 2016-05-03
            • 2019-04-04
            • 1970-01-01
            • 2014-11-27
            • 2020-02-08
            • 1970-01-01
            • 1970-01-01
            • 2017-01-10
            相关资源
            最近更新 更多