我有一个Google电子表格,其中包含客户联系信息。
我正试图找到一种方法来突出显示用户自动编辑的内容,而无需更改行颜色以表示他们对其进行了编辑。
我想要做的是当用户编辑单元格时,使用用户电子邮件地址向该单元格添加注释。然后让它检查添加到该单元格的注释是否等于某个电子邮件地址,以将行的背景颜色设置为我指定的任何颜色。
下面将用户电子邮件地址的注释添加到已编辑的单元格,并将已编辑的单元格的背景颜色设置为红色,但不是整行。
关于如何做到这一点的任何想法,以及是否有更好的方法来完成我想要做的事情。
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var cell = ss.getActiveCell();
var range = ss.getActiveRange();
var note = cell.getNote();
var user = Session.getUser();
note = user;
cell.setNote(note);
if(note = "user@email.com") {
range.setBackgroundRGB(255, 0, 0);
}
};
答案 0 :(得分:3)
要获取整行,假设它从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);
}
};
您还询问了“更好的方法”。这是一个带有一些“改进”的变体。
它使用触发器Event,而不是依赖于容器绑定脚本。 (请参阅Understanding Events。)这使得这更加便携,当然,这也意味着您可以消除对Spreadsheet服务的一些(慢速)调用,因为您是免费提供的信息。
要测试此功能,请使用How can I test a trigger function in 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');
}
};
答案 1 :(得分:1)
我也看了一眼。 getLastColumn
将为您提供包含整个工作表数据的最后一列,忽略除此之外的空行see here。如果您想要整行,则应使用getMaxColumns()
,see here
运行setNote
后检查注释的值是多余的。例如
var i = 1;
if(i === 1) { dosomething(i) }
在考虑此功能是电子表格时会想到一些事情。
ScriptDB
note.search(/editor:.*?$/i)
稍后检查密钥并覆盖它。这是onEdit
函数的快速版本。
function onEdit() {
var sheet = SpreadsheetApp.getActiveSheet();
var cell = SpreadsheetApp.getActiveRange();
var rowNum = cell.getRow();
var row = sheet.getRange(rowNum, 1, 1, sheet.getMaxColumns());
var user = Session.getActiveUser();
cell.setNote("Edited by: " + user.getEmail());
row.setBackground("red");
}