1

我有一个包含客户联系信息的 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);
  }

};
4

2 回答 2

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);
  }
};

您还询问了“更好的方法”。这是一个带有一些“改进”的变体。

  • 它使用触发事件,而不是依赖于容器绑定脚本。(请参阅了解事件。)当然,这使得它更便携,但这也意味着您可以消除对电子表格服务的一些(缓慢)调用,因为您可以免费获得信息。

    要测试此功能,请使用如何在 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');
  }
};
于 2013-06-27T12:58:32.427 回答
1

我也看过了。getLastColumn将为您提供包含整个工作表上数据的最后一列,忽略除此之外的空行,请参见此处。如果你想要整行,你应该使用getMaxColumns()看这里

运行后检查注释的值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");
}
于 2013-06-27T13:24:08.050 回答