我想出了如何比较Google电子表格中的日期,但是当我因某种原因尝试输入更多日期时,所有绿色和红色的单元格都变成红色。如果只有一个单元格有日期,我怎么能让两个单元格变成红色? 防爆。在单元格D18中,截止日期是4-18-2014,在单元格E18中,单元格是空白的。我想让两个细胞变红,所以我知道我应该找出为什么那个细胞是红色的。
这是我到目前为止的代码:
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Copy of Project Sheet 1');
var values1Rule1 = s.getRange('E2:E1000').getValues();
var values2Rule1 = s.getRange('D2:D1000').getValues();
var range3Rule1 = s.getRange('D2:E2');
var color1 = 'Red';
var color2 = 'Green';
for (var row in values1Rule1) {
for (var col in values1Rule1[row]) {
if (values1Rule1[row][col] > values2Rule1[row][col]) s.getRange(s.getRange('D2').offset(row, col, 1, 2).getA1Notation()).setBackgroundColor(color1);
else if (values1Rule1[row][col] < values2Rule1[row][col]) s.getRange(s.getRange('D2').offset(row, col, 1, 2).getA1Notation()).setBackgroundColor(color2);
else s.getRange(s.getRange('D2').offset(row, col, 1, 2).getA1Notation()).setBackgroundColor('white'); }}
};
答案 0 :(得分:1)
您需要做的就是在红色条件下将此条件添加为OR子句,例如
if (values1Rule1[row][col] > values2Rule1[row][col] || values1Rule1[row][col] === '')
但是你的代码存在很多“轻微”问题。首先,你正在做太多不必要的API调用。这是一个很大的性能问题。例如,当您offset
时,您已经拥有新范围,则无需getA1Notation
然后再次获得范围,您可以这样做:
s.getRange('D2').offset(row, col, 1, 2).setBackgroundColor(color1);
但这仍然是两个电话,获得D2
,然后是offseting。您可以立即获得所需的范围:
s.getRange(row+1, 4, 1, 2).setBackgroundColor(color1);
我会更进一步,建立一个颜色矩阵,并在循环后立即设置它:
s.getRange('D2:E1000').setBackgroundColors(colors);
但更好的是,在onEdit中你应该只处理刚编辑的内容,而不是触发完全重新计算你的颜色,因为用户完全在另一个专栏或另一个专栏上编辑了一些东西。
我认为您的代码应该是这样的:
function onEdit(e) {
var ss = e.source;
var s = ss.getActiveSheet();
if( s.getName() !== 'Copy of Project Sheet 1' ) return; //only interested in one sheet
var r = s.getActiveRange();
var c = r.getColumn();
if( c !== 4 && c !== 5 ) return; //only interested in changes on columns D or E
r = r.offset(0, c === 4 ? 0 : -1, 1, 2);
var v = r.getValues()[0];
r.setBackgroundColor(v[1] === '' || v[1] > v[0] ? 'red' : v[1] < v[0] ? 'green' : 'white');
}
<强> - 修改
您不能直接手动运行此功能,因为它需要一个仅在自动运行时传递的参数。但您可以使用测试函数来模拟它,如下所示:
function testEdit() { onEdit({source:SpreadsheetApp.getActive()}); }