使用 onEdit() 更改单元格背景

Change cell background with onEdit()

目标:

  1. 获取编辑后的复选框
  2. 获取范围内的所有复选框(第 2–7 列,与已编辑复选框相同的行)
  3. 如果所有复选框 return 为“TRUE”,则在范围内设置背景(第 1-7 列,与已编辑复选框相同的行)

似乎代码什么也没做。

function onEdit(event) {
  var sheet = event.source.getActiveSheet(), //get edited sheet
      row = event.range.getRow(), // get row needed
      column = 2, // set the starting column
      test,
      userValues = [];
  
  while (column<=7) {
    if (sheet.getValue(row,column) == "TRUE") {
      test = true
    } else {
      test = false;
      break;
    }

    column++;
  }

  if (test) {
    sheet.getRange(row,1,1,7).setBackgrounds("#b6d7a8");
  }
}

我相信你的目标如下。

  • 您选中了“B”到“G”列。
  • 当“B”到“G”列的复选框都被选中时,你想将同一行的“A”到“G”列的背景颜色设置为#b6d7a8
  • 根据你的情况,我猜想当所有复选框都没有被选中时,你可能希望将背景颜色设置为默认颜色。

当我看到你的脚本时,循环中使用了getValue。在这种情况下,工艺成本会很高。而且,当你使用 sheet.getRange(row,1,1,7).setBackgrounds("#b6d7a8") 时,你可以使用 sheet.getRange(row,1,1,7).setBackground("#b6d7a8").

这样的话,下面的修改怎么样?

修改后的脚本:

function onEdit(event) {
  var sheetName = "Sheet1"; // Please set the sheet name.
  var range = event.range;
  var sheet = event.source.getActiveSheet();
  if (sheet.getSheetName() != sheetName || range.columnStart < 2 || range.columnStart > 7) return;
  var r = sheet.getRange(range.rowStart, 1, 1, 7)
  var checks = r.offset(0, 1, 1, 6).getValues()[0].every(e => e === true);
  r.setBackground(checks ? "#b6d7a8" : null);
}
  • 当您使用此脚本时,请选中“B”到“G”列的复选框。当“B”到“G”列的所有复选框都被选中时,“A”到“G”列的背景颜色更改为 #b6d7a8.

注:

  • 此脚本由 OnEdit 触发器运行。因此,请编辑从“B”到“G”列的复选框单元格。这样,脚本就是运行。当你用脚本编辑器直接运行这个脚本时,会出现错误。请注意这一点。

  • 当不需要检查sheet名字时,也可以使用下面的脚本

      function onEdit(event) {
        var range = event.range;
        var sheet = event.source.getActiveSheet();
        if (range.columnStart < 2 || range.columnStart > 7) return;
        var r = sheet.getRange(range.rowStart, 1, 1, 7)
        var checks = r.offset(0, 1, 1, 6).getValues()[0].every(e => e === true);
        r.setBackground(checks ? "#b6d7a8" : null);
      }
    

参考文献: