Google apps script google电子表格根据注释设置行背景颜色

Google apps script google电子表格根据注释设置行背景颜色,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个谷歌电子表格,里面有客户联系信息 我试图找到一种方法来突出显示用户自动进行的编辑,而不必更改行颜色来表示他们编辑了它 我想做的是,当用户编辑单元格时,向该单元格添加一条带有用户电子邮件地址的注释。然后让它检查添加到该单元格的注释是否等于某个电子邮件地址,以将行的背景颜色设置为我指定的任何颜色 下面将用户电子邮件地址的注释添加到编辑的单元格中,并将编辑单元格的背景色设置为红色,而不是整行 任何关于如何做到这一点的想法,以及是否有更好的方法来完成我正在尝试做的事情 function onEd

我有一个谷歌电子表格,里面有客户联系信息

我试图找到一种方法来突出显示用户自动进行的编辑,而不必更改行颜色来表示他们编辑了它

我想做的是,当用户编辑单元格时,向该单元格添加一条带有用户电子邮件地址的注释。然后让它检查添加到该单元格的注释是否等于某个电子邮件地址,以将行的背景颜色设置为我指定的任何颜色

下面将用户电子邮件地址的注释添加到编辑的单元格中,并将编辑单元格的背景色设置为红色,而不是整行

任何关于如何做到这一点的想法,以及是否有更好的方法来完成我正在尝试做的事情

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

};

要获取整行,假设它从1开始,并使用
Range.getLastColumn()
方法查找行的正确范围。(如果您的行错开,这可能会突出显示两端的空单元格,但检查这一点会进一步降低函数的速度。)

你还问了一个“更好的方法”。这里有一些“改进”的变体

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

    要测试此功能,请使用中描述的技术

  • 您的原始脚本包含一个
    if-then
    ,用于检查哪个用户进行了更改,这是一个代码块的开头,随着您添加更多用户,该代码块将增长。该方法采用数据驱动的方法,使用
    constusercolors
    。然后,我们可以通过比较中的
    检查是否知道用户,并据此采取行动

    您可以通过在电子表格或其他地方管理用户颜色来进一步改进它,甚至让它动态地学习新用户并为他们分配自己的颜色。无论如何,这允许您轻松添加更多用户和颜色组合,而无需更改函数中的逻辑

    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");
    }
    
  • 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开始,并使用
Range.getLastColumn()
方法查找行的正确范围。(如果您的行错开,这可能会突出显示两端的空单元格,但检查这一点会进一步降低函数的速度。)

你还问了一个“更好的方法”。这里有一些“改进”的变体

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

    要测试此功能,请使用中描述的技术

  • 您的原始脚本包含一个
    if-then
    ,用于检查哪个用户进行了更改,这是一个代码块的开头,随着您添加更多用户,该代码块将增长。该方法采用数据驱动的方法,使用
    constusercolors
    。然后,我们可以通过
    比较中的
    检查是否知道用户,并据此采取行动

    您可以通过在电子表格或其他地方管理用户颜色来进一步改进它,甚至让它动态地学习新用户并为他们分配自己的颜色。无论如何,这允许您轻松添加更多用户和颜色组合,而无需更改函数中的逻辑

    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");
    }
    
  • 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');
  }
};

我也看了一下。
getLastColumn
将为您提供包含整个工作表中数据的最后一列,忽略除此之外的空行。如果需要整行,应使用
getMaxColumns()

运行
setNote
后检查注释值是多余的。乙二醇

var i = 1;
if(i === 1) { dosomething(i) }
当考虑到这个特性是一个电子表格时,会想到一些事情

  • 不同的用户有不同的颜色。
    • 我会有一个颜色选择选项,并将其存储在
      ScriptDB
  • 在“批准”或其他条件下清除颜色
    • 我会使用一个菜单选项,它只对正确的用户可见
  • 跟踪用户笔记
    • 我会有一个附加到任何现有注释末尾的键(如果该键已经存在,则会被覆盖)。然后,我将使用regex
      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");
}

我也看了一下。
getLastColumn
将为您提供包含整个工作表中数据的最后一列,忽略除此之外的空行。如果需要整行,应使用
getMaxColumns()

支票