单元格处于活动状态时突出显示整行
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 打开控制台,然后单击控制台选项卡。之后您可以关闭它(F12 或X
按钮),更改将一直有效,直到页面关闭或重新加载。
当然,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 父菜单项
Bootstrap Vue scrollspy 无法处理动态数据。检查时,所有元素在通过时一一处于活动状态(突出显示)