繁体   English   中英

使用应用程序脚本更改谷歌表格中周末日期列的背景颜色?

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

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

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

  1. 脚本按预期的顺序循环遍历每一列,而不跳过列(第 2 列 - 第 85 列)
  2. 脚本为 3 月的错误日期着色
  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% 感到困惑。 我无休止地在谷歌上搜索并尝试了很多事情都无济于事! 任何人都知道我遗漏了什么或做错了什么?! 任何帮助将不胜感激!

这是脚本:

//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");
//    }
//  }

}

我整理了以下谷歌表进行测试。 权限已设置,因此任何拥有链接的人都可以进行编辑,以便拥有它:)
通过双击 B1,您可以选择您想要的任何开始日期。 底部 3 行返回工作表读取的工作日编号 (1-7)、应用程序脚本读取的工作日编号 (0-6) 以及每列的相应编号 (B=2, C=3,等等)。

另外,万一它有帮助...

3 月 8 日前后日期的最新日志
预期日期模式 = 6, 0, 1, 2, 3
返回的日期模式 = 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
返回的日期模式 = 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

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

更新:添加上述谷歌表的截图以供参考
debugScript_color全部截图

(注意:它说我还不允许嵌入图像,因为我是一个新用户。显然,图像的链接是我能做的最好的。对不起库珀)

在这种情况下的问题是脚本中的时区与工作表中的时区不匹配,更具体地说,这些时区之一正在观察夏令时变化,而另一个则不是,或者正在观察一个月之后。

日志中“第二个”3 月 8 日的时间突然更改为 23:00:00 是主要线索。 请注意之前的时间是 00:00:00 - 午夜。

您的工作表设置为“中部时间”,而您的脚本设置为“中部时间 - 墨西哥城”。 显然他们在三月份不同意。

一种解决方案是确保您的脚本和工作表位于同一时区。

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

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

尝试这个:

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');
    }
  });
}

动画片:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM