Изменить цвет фона для столбцов с датами выходных в листах Google с помощью скрипта приложений? - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь написать скрипт, который меняет цвет фона каждого столбца, содержащего дату выходных. По какой-то причине сценарий сбрасывается на март месяц, и я понятия не имею, почему.

В целях отладки я ограничил использование скрипта только воскресеньями. Вот что я знаю:

  1. Скрипт проходит по каждому столбцу в последовательном порядке, как и ожидалось, без пропуска столбца (столбец 2 - столбец 85)
  2. Сценарий окрашивает неправильные даты в марте
  3. 8 марта, похоже, виновник
    • он читает дату 3/8, правильно как воскресенье, но вместо этого также читает следующий понедельник (3/9) как "Sun Mar 08" "Пн Мар 09". Таким образом, в воскресенье (3/8) и понедельник (3/9) он записывается как «Sun Mar 08».
    • даты остаются на 1 до конца марта
  4. «Вс 5 апреля» пропускается все вместе - с субботы 04 апреля по понедельник апреля 06
  5. Даты возобновляются, как и ожидается, с понедельника апреля 06
  6. Случается до 2019 года даты также (даты начинаются со второго воскресенья марта до второго воскресенья апреля)

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

}

Я собрал следующую Google лист для тестирования. Права доступа установлены так, что любой, у кого есть ссылка, может редактировать, поэтому имейте это в виду:)
Двойным щелчком по B1 вы можете выбрать любой начальный день, какой пожелаете. Нижние 3 строки возвращают номер дня недели, который читается по листам (1-7), номер дня недели, который читается скриптом приложения (0-6), и соответствующий номер для каждого столбца (B = 2, C = 3, et c).

Кроме того, если это поможет ...

Последний журнал для дат, окружающих 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

Журнал для дат, окружающих 5 апреля
ожидаемая дата pattern = 5, 6, 0, 1
возвращенная дата pattern = 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 для справки
debugScript_colorAll снимок экрана

(примечание: там написано " Я не могу вставлять изображения, поскольку я новый пользователь. Очевидно, что ссылка на изображение - лучшее, что я могу сделать. Извините, Купер)

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Проблема в этом случае заключается в несоответствии между часовым поясом в вашем скрипте и часовым поясом на вашем листе, и, более конкретно, в том, что один из этих часовых поясов наблюдает за изменением летнего времени, в то время как другой либо не наблюдает, либо наблюдает это месяц спустя.

Внезапное изменение времени на «второе» 8 марта в ваших журналах на 23:00:00 является основной подсказкой. Обратите внимание, как в предыдущий раз в 00:00:00 - полночь.

Для вашего листа установлено «Центральное время», а для сценария установлено «Центральное время - Мехико». Очевидно, в марте они не согласны.

Одно из решений - обеспечить, чтобы ваш сценарий и лист находились в одном часовом поясе.

В листе это находится в меню Файл -> Настройки. В скрипте под File -> Properties.

Если вы хотите сохранить разные часовые пояса или если вы хотите, чтобы скрипт был часовым поясом, вам нужно будет предпринять дальнейшие действия в вашем коде, чтобы вручную обработать разницу, который может быть сложным. (Это также может быть так же просто, как обеспечить, чтобы даты были в полдень, а не в полночь).

0 голосов
/ 11 марта 2020

Попробуйте:

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

Анимация:

enter image description here

...