3

如何根据onEdit()函数中单元格的内容更改单元格背景颜色?

我已经为此测试了许多版本的代码 - 有些几乎可以正常工作,有些则根本无法正常工作。但我还没有让它按照我需要的方式工作。

请原谅本文的编写方式不够优雅,但我实际上需要使代码尽可能简单,因为会有许多单元格更改、许多条件以及许多不同数量的单元格,这些单元格将根据内容进行更改在工作表上更改。

好的,所以这里...

function onEdit(event)
{
 var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");   
 var changedCell= event.source.getActiveRange().getA1Notation();

 if (changedCell == 'B3') {
 var c = ss.getRange("B3").getValue();
  if (c < 2); {
  ss.getRange("B3").setBackgroundColor('#ff0000');  
  ss.getRange("B12").setBackgroundColor('#ff0000'); 
  }
  if (c > 1); {
  ss.getRange("B3").setBackgroundColor('#000000');  
  ss.getRange("B12").setBackgroundColor('#000000'); 
  }
 }
}
4

2 回答 2

6

需要注意的几点

1.方法的名称是setBackground和不是setBackgroundColor

2.单元格B3的格式如何。仅当它被格式化为整数时,比较才有效。在大多数情况下,Google 电子表格会根据数据类型自动格式化单元格,但如果我正在编写代码,我会仔细检查。所以使用类似的东西

 var c = parseInt(ss.getRange("B3").getValue()) ;

3.条件后面不需要分号if。这将立即终止 if 条件。所以使用

if (c < 2) {

if (c > 1) {

4.最后,我不知道数据是如何进入B3的,但是如果你在B3中有1.5,那么两个if条件都成立并且你的背景颜色被覆盖。所以,我建议你使用 if..elseif

为了更好的可读性,我会使用setBackground('red')setBackground('white')作为常见的颜色。

于 2013-07-10T02:13:19.737 回答
4

除了来自 Srik 的建议之外,您还应该考虑onEdit()函数的效率。总体思路是确定是否应该尽快且尽可能便宜地退出,然后根据最佳实践优化其余代码(主要是尽量减少服务调用)。

看起来您只想onEdit()在“Sheet2”上执行,但是按照您编写它的方式,它会触发任何工作表上的更改,但会在“Sheet2”上弄乱颜色。(不是一个明显的问题,因为“Sheet2”上的条件是用于决定着色的条件,但是您将不必要地消耗脚本执行时间。)通过使用event信息来确定已更新的工作表,并且如果不是“Sheet2”,则退出,即onEdit()下降的成本。

我同意斯里克关于这些if陈述的看法……我只是不知道你想要什么。不过,我认为 only 的建议else if不会解决它,因为它会被c > 1视为c > 2......如果你想要的话,为什么不写呢?也许你不想要颜色1 < c < 2,红色c < 1和黑色c > 2?你应该理清那部分的逻辑。

以下是优化后的onEdit()外观,最大限度地利用event信息:

function onEdit(event)
{
  var ss = event.range.getSheet();
  if (ss.getName() !== "Sheet2") return; // Get out quickly
  var changedCell = event.source.getActiveRange();
  var changedCellA1 = changedCell.getA1Notation();
  if (changedCellA1 !== 'B3') return;

  var c = event.value;  // We know we edited cell B3, just get the value
  var background = 'white'; // Assume 1 <= c <= 2
  if (c > 2) {
    background = 'red';
  }
  else if (c < 1) {
    background = 'black'; 
  }
  changedCell.setBackground(background);
  ss.getRange("B12").setBackground(background);
}
于 2013-07-10T02:55:21.093 回答