【发布时间】:2016-11-07 07:43:34
【问题描述】:
如何设计一个能够突出显示活动行的工作表脚本?
当该行中的一个单元格处于活动状态时,我希望整行更改字体或背景颜色。
我不希望触发器是单元格中的任何特定值,只需单击一个单元格即可触发该单元格所属的整行的突出显示。
【问题讨论】:
标签: google-apps-script google-sheets formatting
如何设计一个能够突出显示活动行的工作表脚本?
当该行中的一个单元格处于活动状态时,我希望整行更改字体或背景颜色。
我不希望触发器是单元格中的任何特定值,只需单击一个单元格即可触发该单元格所属的整行的突出显示。
【问题讨论】:
标签: google-apps-script google-sheets formatting
抱歉,条件格式或脚本无法通过仅选择一个单元格来完成此操作。 但是,您可以使用组合键 Shift+空格键 突出显示活动单元格的整行。
【讨论】:
我意识到这个问题是不久前提出的,但是当我也在寻找同样的功能时,我偶然发现了它。我的解决方案有点麻烦,并且不是您正在寻找的完整解决方案,但它结合了一个小脚本和一些条件格式。
我首先使用 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())
【讨论】:
function onSelectionChange(e) 函数配合使用非常棒,而不是使用 onEdit(e) 。休息一下,我已经按照您的说明完成了,即使用 Conditional Formatting 。
你描述的问题可以通过checkbox间接解决。
=$A1=TRUE(而不是 1,使用您在第 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);
};
【讨论】:
对我来说非常有效的解决方法是安装此应用程序https://www.autocontrol.app/ 以将键的正常行为重新定义为 shift+space 组合,这实际上是选择当前行的快捷方式。
总结:我更改了向下/向上箭头的行为,以将新的键盘输入合成为向下箭头 + shift + 空格。这是程序:
就是这样。一开始我花了一些时间,但知道诀窍之后就很容易了。我添加了此设置的外观图片。
注意:为什么 GUI 会在合成框中显示四个按钮:箭头、移位、空格和再次移位?这是由于新闻/发布事件而导致的预期行为。
注意2:如果扩展似乎无法正常工作,请右键单击扩展图标,检查“紧急修复”,或者只写开发人员。
【讨论】:
您可以像这样使用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");
}
}
更新需要一秒钟左右的时间 - 我猜这个事件的触发有点慢。
这适用于桌面或触控设备。
【讨论】:
当有很多列时,阅读电子表格很困难。选择一个小区/行时,它将突出显示整行,否则,它不会打扰:
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);
}
}
}
【讨论】:
我不是 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* 之前抓取了键盘事件,对此的任何解决方案将不胜感激。