谷歌电子表格根据笔记设置行背景颜色

时间:2013-06-27 12:08:14

标签: google-apps-script google-sheets

我有一个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);
  }

};

2 个答案:

答案 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");
}