使用应用程序脚本更改 google 工作表中具有周末日期的列的背景颜色?

Change background color for columns with weekend dates in google sheets with apps script?

我正在尝试编写一个脚本来更改包含周末日期的每一列的背景颜色。出于某种原因,脚本在三月份被取消了,我不知道为什么。

出于调试目的,我将脚本限制为仅更改星期日。这是我所知道的:

  1. 脚本按预期顺序循环遍历每一列而不跳过列(第 2 列 - 第 85 列)
  2. 脚本将错误的三月日期涂上颜色
  3. 3 月 8 日似乎是罪魁祸首
    • 它读取日期 3/8,正确地作为星期日,但它也读取以下内容 星期一 (3/9) 为 "Sun Mar 08" 而不是 "Mon Mar 09"。所以 星期日 (3/8) 和星期一 (3/9) 都读作 "Sun Mar 08".
    • 3 月剩下的时间还有 1 个日期
  4. "Sun Apr 05" 一起被跳过 - 从 "Sat Apr 04" 到 "Mon Apr 06"
  5. 日期如期恢复 "Mon Apr 06"
  6. 也发生在 2019 年的日期(从 3 月的第二个星期日到 4 月的第二个星期日,日期相差一个)

我 100% 感到困惑。我已经 google 无休止地尝试了很多东西都无济于事!任何人都知道我遗漏了什么或做错了什么?!任何帮助将不胜感激!

这是脚本:

//Change column background color for weekend dates

function colorAll() {

  var sheet = SpreadsheetApp.getActiveSheet();
  var startCol = 2;  //start with column B
  var endCol = sheet.getLastColumn();  // find last column in the sheet

  for (var c = startCol; c <= endCol; c++) { //loop through columns
    colorCol(c);
  }
}

//Change background color for each column passed to 'c'
function colorCol(c) {

  var sheet = SpreadsheetApp.getActiveSheet();
  var dataRange = sheet.getRange(1, c, 5, 1); //row 1, column "c", selection size = 5 rows by 1 column

  var data = dataRange.getValues();
  var col = data[0];

  var date = new Date(col); 
  var dayOfWeek = date.getDay();

//Logs values being passed to each variable in order to help debug process
  Logger.log("*** Processing column number: " + c + " now ***");
  Logger.log(col);
  Logger.log(date); 
  Logger.log(dayOfWeek);


  //If the day of week is Sunday:
  if (dayOfWeek == 0) {
      dataRange.setBackground("#E8E8E8");  //set weekends to grey
    } else {
      dataRange.setBackground("#ffffff");  //set non-weekends to white
    }

//  //If day of week is Sat or Sun:
//  if (dayOfWeek == 0 || dayOfWeek == 6) {
//    if (col[0] === "") {
//      dataRange.setBackgroundRGB(255, 255, 255);
//    } else {
//      dataRange.setBackground("#E8E8E8");
//    }
//  }

}

我整理了以下google sheet来测试。设置了权限,因此拥有 link 的任何人都可以编辑,所以请尽情编辑吧:)
通过双击 B1,您可以选择您想要的任何开始日期。底部 3 行 return sheets 读取的星期几 (1-7),应用程序脚本读取的星期几 (0-6),以及每列对应的数字(B=2,C=3,等等)。

此外,如果它有帮助...

3 月 8 日前后的最新日志
预期日期模式 = 6、0、1、2、3
return编辑日期模式 = 6、0、0、1、2

[20-03-10 10:13:05:886 PDT] ***Processing column number: 7 now***   
[20-03-10 10:13:05:887 PDT] [Sat Mar 07 00:00:00 GMT-06:00 2020]
[20-03-10 10:13:05:888 PDT] Sat Mar 07 00:00:00 GMT-06:00 2020
[20-03-10 10:13:05:890 PDT] 6.0
[20-03-10 10:13:06:207 PDT] *** Processing column number: 8 now ***
[20-03-10 10:13:06:209 PDT] [Sun Mar 08 00:00:00 GMT-06:00 2020]
[20-03-10 10:13:06:211 PDT] Sun Mar 08 00:00:00 GMT-06:00 2020
[20-03-10 10:13:06:212 PDT] 0.0
[20-03-10 10:13:06:555 PDT] *** Processing column number: 9 now ***
[20-03-10 10:13:06:558 PDT] [Sun Mar 08 23:00:00 GMT-06:00 2020]
[20-03-10 10:13:06:561 PDT] Sun Mar 08 23:00:00 GMT-06:00 2020
[20-03-10 10:13:06:563 PDT] 0.0
[20-03-10 10:13:06:915 PDT] *** Processing column number: 10 now ***
[20-03-10 10:13:06:917 PDT] [Mon Mar 09 23:00:00 GMT-06:00 2020]
[20-03-10 10:13:06:918 PDT] Mon Mar 09 23:00:00 GMT-06:00 2020
[20-03-10 10:13:06:920 PDT] 1.0
[20-03-10 10:13:07:343 PDT] *** Processing column number: 11 now ***
[20-03-10 10:13:07:345 PDT] [Tue Mar 10 23:00:00 GMT-06:00 2020]
[20-03-10 10:13:07:347 PDT] Tue Mar 10 23:00:00 GMT-06:00 2020
[20-03-10 10:13:07:348 PDT] 2.0

记录 4 月 5 日前后的日期
预期日期模式 = 5、6、0、1
returned 日期模式 = 5、6、1、2

[20-03-10 10:13:15:446 PDT] *** Processing column number: 35 now ***
[20-03-10 10:13:15:447 PDT] [Fri Apr 03 23:00:00 GMT-06:00 2020]
[20-03-10 10:13:15:449 PDT] Fri Apr 03 23:00:00 GMT-06:00 2020
[20-03-10 10:13:15:450 PDT] 5.0
[20-03-10 10:13:16:032 PDT] *** Processing column number: 36 now ***
[20-03-10 10:13:16:036 PDT] [Sat Apr 04 23:00:00 GMT-06:00 2020]
[20-03-10 10:13:16:038 PDT] Sat Apr 04 23:00:00 GMT-06:00 2020
[20-03-10 10:13:16:039 PDT] 6.0
[20-03-10 10:13:16:334 PDT] *** Processing column number: 37 now ***
[20-03-10 10:13:16:336 PDT] [Mon Apr 06 00:00:00 GMT-05:00 2020]
[20-03-10 10:13:16:338 PDT] Mon Apr 06 00:00:00 GMT-05:00 2020
[20-03-10 10:13:16:339 PDT] 1.0
[20-03-10 10:13:16:652 PDT] *** Processing column number: 38 now ***
[20-03-10 10:13:16:658 PDT] [Tue Apr 07 00:00:00 GMT-05:00 2020]
[20-03-10 10:13:16:678 PDT] Tue Apr 07 00:00:00 GMT-05:00 2020
[20-03-10 10:13:16:684 PDT] 2.0

提前感谢您的宝贵时间和帮助!

更新: 添加上述 google sheet 的屏幕截图以供参考
debugScript_colorAll screenshot

(注意:它说我还不能嵌入图像,因为我是新用户。显然,对图像的 link 是我能做的最好的。对不起 Cooper )

试试这个:

function colorAll() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var sc=2;
  var vs=sh.getRange(1,sc,1,sh.getLastColumn()).getValues()[0];
  vs.forEach(function(c,i){
    var dow=new Date(c).getDay();
    //Sun - Sat = 0 - 6
    if(dow==6 || dow==0) {
      sh.getRange(1,i+sc,5,1).setBackground('#E8E8E8');
    }else{
      sh.getRange(1,i+sc,5,1).setBackground('#FFFFFF');
    }
  });
}

动画:

这种情况下的问题是脚本中的时区与 sheet 中的时区不匹配,更具体地说,其中一个时区正在观察夏令时变化,而另一个是要么没有,要么在一个月后观察它。

你日志中 "second" 3 月 8 日突然将时间更改为 23:00:00 是主要线索。请注意之前的时间 00:00:00 - 午夜。

您的 sheet 设置为 "Central Time",而您的脚本设置为 "Central Time - Mexico City"。显然他们在三月份不同意。

一种解决方案是确保您的脚本和 sheet 处于同一时区。

在 sheet 中,它位于文件 -> 设置下。在文件 -> 属性下的脚本中。

如果您想保留不同的时区,或者如果您希望脚本是时区,您将需要在代码中采取进一步的操作来手动处理差异,这可能很复杂。 (它也可以像确保日期在中午而不是午夜一样简单)。