要获取整行,假设它从 1 开始,并使用该Range.getLastColumn()
方法找到该行的右范围。(如果您的行是交错的,这可能会突出显示两端的空单元格 - 但是,检查这一点会进一步减慢函数的速度。)
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var cell = ss.getActiveCell();
var range = sheet.getRange(cell.getRow(),1,1,sheet.getDataRange().getLastColumn());
var note = cell.getNote();
var user = Session.getUser();
note = user;
cell.setNote(note);
if(note = "user@email.com") {
range.setBackgroundRGB(255, 0, 0);
}
};
您还询问了“更好的方法”。这是一个带有一些“改进”的变体。
它使用触发事件,而不是依赖于容器绑定脚本。(请参阅了解事件。)当然,这使得它更便携,但这也意味着您可以消除对电子表格服务的一些(缓慢)调用,因为您可以免费获得信息。
要测试此功能,请使用如何在 GAS 中测试触发功能中描述的技术?.
您的原始脚本包含一个if-then
用于检查哪个用户进行了更改的代码块的开头,该代码块会随着您添加更多用户而增长。这个采用数据驱动的方法,使用const userColors
. 然后,我们可以通过比较检查用户是否已知in
,并据此采取行动。
您可以通过管理电子表格或其他地方的用户颜色来进一步改进它 - 甚至让它动态地学习新用户并为他们分配自己的颜色。无论如何,这允许您轻松添加更多用户和颜色组合,而无需更改函数中的逻辑。
在onEdit()
函数中,你应该非常关心性能。(这个例子很短,这不是一个真正的问题,但仍然是一个好习惯。)这个版本有几个改变来解决这个问题。首先,检查我们是否需要设置颜色 - 如果正在编辑的单元格是由同一用户上次编辑的,则无需执行任何其他操作。其次,许多调用电子表格服务的操作已被移动,因此它们仅在需要时执行。
更新脚本:
function onEdit(event) {
const userColors = {
'user1@email.com' : 'red',
'user2@email.com' : 'blue',
'user3@email.com' : '#ff00ff'
};
var note = event.range.getNote();
var user = new String(Session.getUser());
// update note and color if new editor
if (note != user) {
var sheet = event.range.getSheet();
var range = sheet.getRange(event.range.getRow(),1,1,sheet.getLastColumn());
event.range.setNote(user);
if (user in userColors) range.setBackground(userColors[user]);
// don't color unknown users
else range.setBackground('white');
}
};