Date 更改工作表单元格颜色OneEdit

Date 更改工作表单元格颜色OneEdit,date,google-apps-script,google-sheets,cell,Date,Google Apps Script,Google Sheets,Cell,我知道了如何在谷歌表格中比较日期,但由于某种原因,当我尝试输入更多日期时,所有绿色和红色的单元格都变成了红色。如果只有一个单元格有日期,如何使两个单元格变为红色 示例:在单元格D18中,到期日期为2014年4月18日,在单元格E18中,该单元格为空。我想让两个细胞都变成红色,这样我就知道我应该找出为什么那个细胞是红色的 这是我目前掌握的代码: function onEdit() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = s

我知道了如何在谷歌表格中比较日期,但由于某种原因,当我尝试输入更多日期时,所有绿色和红色的单元格都变成了红色。如果只有一个单元格有日期,如何使两个单元格变为红色

示例:在单元格D18中,到期日期为2014年4月18日,在单元格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'); }}
};
函数onEdit(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var s=ss.getSheetByName(“项目表1的副本”);
var values1Rule1=s.getRange('E2:E1000').getValues();
var values2Rule1=s.getRange('D2:D1000').getValues();
var range3Rule1=s.getRange('D2:E2');
var color1=‘红色’;
var color2='绿色';
对于(VALUES1规则1中的var行){
for(var col在values1Rule1[行]中){
if(values1Rule1[row][col]>values2Rule1[row][col])s.getRange(s.getRange('D2')).offset(row,col,1,2).geta1 notation()).setBackgroundColor(color1);
否则如果(values1Rule1[row][col]
您只需将此条件作为OR子句添加到红色条件中,例如

if(values1Rule1[行][col]>values2Rule1[行][col]| | values1Rule1[行][col]='')
但是你的代码有很多“小”问题。首先,你做了太多不必要的API调用。这是一个很大的性能问题。例如,当您
offset
时,您已经有了新的范围,无需
geta1符号
然后再次获取范围,您可以执行以下操作:

s.getRange('D2')。偏移量(行、列、1、2)。设置背景颜色(color1);
但这仍然是两个调用,得到
D2
,然后取消。您可以立即获得所需的范围:

s.getRange(行+1,4,1,2);
我会更进一步,构建一个颜色矩阵,并在循环后立即设置所有颜色:

s.getRange('D2:E1000')。设置背景颜色(颜色);
但更好的是,在OneEdit中,您应该只处理刚刚编辑的内容,而不是触发颜色的完全重新计算,因为用户完全在另一列或另一张工作表上编辑了某些内容

我认为您的代码应该是这样的:

函数onEdit(e){
var ss=e.来源;
var s=ss.getActiveSheet();
如果(s.getName()!=='项目工作表1的副本')返回;//只对一个工作表感兴趣
var r=s.getActiveRange();
var c=r.getColumn();
if(c!==4&&c!==5)return;//只对D列或E列的更改感兴趣
r=r.offset(0,c==4?0:-1,1,2);
var v=r.getValues()[0];
r、 setBackgroundColor(v[1]=“v[1]>v[0]?“红色”:v[1]
--编辑

您不能直接手动运行此函数,因为它需要一个仅在自动运行时才传递的参数。但您可以使用测试函数对其进行模拟,如下所示:

函数testEdit(){onEdit({源代码:SpreadsheetApp.getActive()});}

当我尝试运行它时,我得到了这个错误ReferenceError:“eve”没有定义。(第2行,文件“c2”)好吧,这一定是您拥有的其他代码中的错误。我测试了这段代码,它运行正常。你一定在别的地方有“夏娃”。顺便说一句,这并不意味着要手动运行,因为它只需要在自动运行时传递事件参数(请参阅最新的编辑答案)。