Как установить цвет фона для строки на основе текущей даты в электронной таблице Документов Google?

У меня есть SpreadSheet Google Docs, где в столбце A указаны даты (A1: 2013-11-22, A2: 2013-11-23, A3: 2013-11-24 и т.д.). Я хотел бы автоматически выделить - установить цвет фона для строки, где в столбце A есть дата date. Чтобы каждый день выделялась другая строка.

Я ожидаю, что мне понадобится script, IMHO, это невозможно сделать с условным форматированием в Google Docs SpreadSheet.

Любая идея, как это сделать? Большое спасибо!

Ответ 1

Я изменил пример от Сержа (спасибо, Serge!), даты указаны в столбце A. Строки с датой имеют цвет фона, остальные строки не повреждены. Бонус: пользовательское меню для запуска script на активном листе.

/* check for a cell format */
function isValidDate(d) {
  if ( Object.prototype.toString.call(d) !== "[object Date]" )
    return false;
  return !isNaN(d.getTime());
}

/* check for a cell format */
function colorRow()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();

  customOnOpen(sh);
}

/* set the background - main function, sh is a sheet */
function customOnOpen(sh) {
  var headers = sh.getRange(1,1,sh.getLastRow()).getValues();
  var today = new Date().setHours(0,0,0,0);
  for(var n=0;n<headers.length;++n){
    var date = new Date(headers[n][0]).setHours(0,0,0,0);
    Logger.log('Test row '+n);
    if(date==today){
      Logger.log('Set bg at '+n);
      sh.getRange(n+1,1,1,sh.getMaxColumns()).setBackground('yellow');
    }
    else
    {
      if (isValidDate(headers[n][0])){
        Logger.log('Clear bg at'+n);
        sh.getRange(n+1,1,1,sh.getMaxColumns()).setBackground(null);
      }
      else{
        Logger.log('Not a date at'+n);
      }
    }
  }
}


function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();

  /* prepare the custom menu */
  var entries = [{
    name : "Set background",
    functionName : "colorRow"
  }];
  sheet.addMenu("My menu", entries);

  /* run the function for two specific sheets */
  customOnOpen(sheet.getSheetByName('Sheet1'));
  customOnOpen(sheet.getSheetByName('Sheet2'));  
};

Ответ 2

Вот как я это сделал. Я сделал условное форматирование и выбрал свой диапазон, затем в "формат ячеек, если..." я выбрал пользовательский вариант и использовал эту формулу:

=$B$2:$B$92 = today()

У меня есть мои даты в столбце B, и это выделяет всю строку в моем диапазоне на сегодняшний день.

Ответ 3

Если вы хотите, чтобы это было автоматически при открытии электронной таблицы, вам нужно будет установить устанавливаемый onOpen, который вызовет следующую функцию (из script editor goto ressources > этот script триггеры > добавить новый триггеp > sreadsheet/on Открыть)

И вот код для столбцов: (см. ниже строки)

function customOnOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var headers = sh.getRange(1,1,1,sh.getLastColumn()).getValues();
  var today = new Date().setHours(0,0,0,0);
  for(var n=0;n<headers[0].length;++n){
    var date = new Date(headers[0][n]).setHours(0,0,0,0);
    Logger.log(today+' =? '+date)
    if(date==today){
      n++
      Logger.log('match on column '+n)
      if(n>=2){sh.getRange(1,n-1,sh.getMaxRows(),1).setBackground(null);};// resets the backGround for yesterday if not the first column
      sh.getRange(1,n,sh.getMaxRows(),1).setBackground('yellow');
      break;
    }
  }
}

эту версию для раскрашивания строк

function customOnOpen2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var headers = sh.getRange(1,1,sh.getLastRow()).getValues();
  var today = new Date().setHours(0,0,0,0);
  for(var n=0;n<headers.length;++n){
    var date = new Date(headers[n][0]).setHours(0,0,0,0);
    Logger.log(today+' =? '+date)
    if(date==today){
      n++
      Logger.log('match on column '+n)
      if(n>=2){sh.getRange(n-1,1,1,sh.getMaxColumns()).setBackground(null);}
      sh.getRange(n,1,1,sh.getMaxColumns()).setBackground('yellow');
      break;
    }
  }
}

Примечание: если вы хотите, чтобы он выполнялся полностью автоматически на основе таймера, он отлично выполним, просто измените переменную ss и sh с помощью openById и getSheetByName (см. doc здесь) и настройте таймер, чтобы он запускался каждый день около 1 часа ночи.

Ответ 4

Где датируется дата домов, попробуйте это.

  • Щелкните правой кнопкой мыши
  • Условное форматирование
  • перейдите в "Пользовательская формула" в раскрывающемся списке слева.
  • Введите эту формулу:

    =(A=TODAY())
    
  • Выберите цвет фона и текста

  • Диапазон: A1:1

Ответ 5

Вы также можете просто создать новый столбец в электронной таблице для сопоставления даты и вернуть флаг, если он сегодня...

=ARRAYFORMULA(IF(A1:A =TODAY(), 1, "")) - формула в ячейке D1

затем попробуйте.

var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Sheet1');

function onOpen() {
  var values = ss.getRange('D1:D').getValues();  // column of date flag

  for ( var row = 0; row < values.length; row++ ) {
    if ( values[row][0] ) {
      break; // assuming only 1 row has today date
    }
  }

  s.getRange('A1:D').setBackground(null);  // range to clear
  s.getRange(row + ":" + row).offset(1, 0).setBackground('yellow');

}

Ответ 6

Это довольно просто.

Выберите область, в которой она должна Щелкните правой кнопкой мыши на электронной таблице и выберите "условный формат" В этом меню выберите 'custom formula' (он может быть назван другим, но это последний выбор в меню)

Когда строку нужно форматировать, когда ячейка в столбце > 1, используйте это в поле формулы

=$A$1:$A$100 > 1

Выберите область, в которой вы хотите получить эффект, например

A1:G100

что он

Ответ 7

Простой ответ подобен Clinet.

Формат → Условное форматирование...- > (Форматировать ячейки, если...) Пользовательская формула

Затем заполните = cells-range = today()

Например: = $I $2: $BC $2 = СЕГОДНЯ()