更改表格单元格颜色onEdit

时间:2014-05-07 17:30:23

标签: date google-apps-script google-sheets cell spreadsheet

我想出了如何比较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'); }}
};

1 个答案:

答案 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()}); }
相关问题