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

标签 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 = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1e6b6d7b6c5e7b737f7772307d7173" rel="noreferrer noopener nofollow">[email protected]</a>") {
    range.setBackgroundRGB(255, 0, 0);
  }

};

最佳答案

要获取整行,假设它从 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 = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f287819780b2979f939b9edc919d9f" rel="noreferrer noopener nofollow">[email protected]</a>") {
    range.setBackgroundRGB(255, 0, 0);
  }
};

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

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

    要测试此函数,请使用 How can I test a trigger function in GAS? 中描述的技术。

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

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

  • onEdit()函数中,您应该非常关心性能。 (这个例子很短,这并不是一个真正的问题,但仍然是一个好习惯。)这个版本有一些更改来解决这个问题。首先,检查我们是否需要设置颜色 - 如果正在编辑的单元格上次由同一用户编辑,则无需执行任何其他操作。其次,许多调用电子表格服务的操作已被移动,因此它们仅在需要时执行。

更新的脚本:

function onEdit(event) {
  const userColors = {
    '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f782849285c6b7929a969e9bd994989a" rel="noreferrer noopener nofollow">[email protected]</a>' : 'red',
    '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="16636573642456737b777f7a3875797b" rel="noreferrer noopener nofollow">[email protected]</a>' : 'blue',
    '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d0a5a3b5a2e390b5bdb1b9bcfeb3bfbd" rel="noreferrer noopener nofollow">[email protected]</a>' : '#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');
  }
};

关于google-apps-script - 谷歌电子表格根据注释设置行背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17342762/

相关文章:

google-apps-script - Google Apps Script - 将数据复制到不同的工作表并附加

Google 电子表格中的 JavaScript

html - Apps 脚本 - 在 HtmlService 中使用来自 Google 云端硬盘的图像

google-apps-script - sprintf 结合零填充和小数

javascript - 在一个谷歌脚本下运行多个工作表,语法错误

google-apps-script - 函数在调试器中有效,但在实时代码中无效

google-sheets - 如何在谷歌表格中创建以逗号分隔的数组公式序列号

javascript - 如何将值从 Google Sheets 上的一列复制到另一列?

javascript - 语法错误: Unterminated parenthetical,如何处理 "( )"

google-apps-script - 直接在 Google 云端硬盘文件夹中创建 Google Doc 文件