如何根据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');
}
}
}
答案 0 :(得分:6)
需要注意的一些事项
1.方法的名称为setBackground
而不是setBackgroundColor
2.如何格式化B3单元格。仅当比较格式为整数时才进行比较。在大多数情况下,Google Spreadsheet会根据数据类型自动格式化单元格,但如果我正在编写代码,我会仔细检查。所以使用像
这样的东西 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')
用于常见颜色。
答案 1 :(得分:3)
除了Srik的建议外,您还应该考虑onEdit()
功能的效率。一般的想法是确定是否应尽快和尽可能便宜地纾困,然后根据Best Practices优化其余代码(主要是最小化服务调用)。
看起来您希望onEdit()
仅在“Sheet2”上执行,但是您编写它的方式,它将触发任何工作表的更改,但是一团糟“Sheet2”上的颜色。 (不是一个明显的问题,因为“Sheet2”上的条件是用于决定着色的条件,但是你将不必要地烧掉脚本执行时间。)通过使用event
信息找出什么表已经更新,如果它不是“Sheet2”则退出,onEdit()
的成本会下降。
我同意Srik关于if
陈述的陈述......我只是不知道你想要什么。我不认为仅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);
}