单元格处于活动状态时突出显示整行

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

这在 excel 中是可能的:thesmallman.com/blog/2016/9/15/… 但我无法让它在工作表中工作 你救了我的命!【参考方案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间接解决。

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

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

【讨论】:

【参考方案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* 之前抓取了键盘事件,对此的任何解决方案将不胜感激。

以上是关于单元格处于活动状态时突出显示整行的主要内容,如果未能解决你的问题,请参考以下文章

子菜单链接处于活动状态时突出显示 Wordpress 父菜单项

uitableview 单元格突出显示

Bootstrap Vue scrollspy 无法处理动态数据。检查时,所有元素在通过时一一处于活动状态(突出显示)

如果活动单元格(两行或更多行)位于同一列中,则突出显示单元格

在 s-s-rS 表格的单元格中突出显示文本的方法

目标 C:如何突出显示 tableView 单元格并在重新加载表格时保持突出显示?