Как установить цвет фона для строки на основе текущей даты в электронной таблице Google Docs?
У меня есть электронная таблица Google Docs, где в столбце A указаны даты (A1: 2013-11-22, A2: 2013-11-23, A3: 2013-11-24 и т. д.). Я бы хотел, чтобы автоматически выделить - установить цвет фона для строки, где в столбце a-текущая дата. Чтобы каждый день выделялась отдельная строка.
Я ожидаю, что мне понадобится скрипт, IMHO это невозможно сделать с условным формированием в электронной таблице Google Docs.
есть идеи, как это сделать? Спасибо лот!
7 ответов
вот как я это сделал. Я сделал Условное форматирование и выбрал свой диапазон, а затем в "format cells if..."Я выбрал Custom и использовал эту формулу:
=$B:$B = today()
У меня есть даты в столбце B, и это выделяет всю строку в пределах моего диапазона для сегодняшней даты.
Я изменил пример из Serge (спасибо, Serge!), даты в столбец. Строки с датой имеют очищенный цвет фона, другие строки не повреждены. Бонус: пользовательское меню для запуска скрипта на активном листе.
/* 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'));
};
если вы хотите, чтобы он был автоматическим при открытии электронной таблицы, вам нужно будет установить установочный onOpen, который вызовет функцию ниже (из редактора сценариев goto ressources > этот скрипт запускает > добавить новый триггер > sreadsheet / on Open)
и вот код для столбцов: (см. ниже для строк)
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 утра.
где даты домов, попробуйте это.
- щелкните правой кнопкой мыши
- Условное Форматирование
- изменить на "пользовательская формула" в выпадающем списке слева
-
введите эту пользовательскую формулу:
=(A=TODAY())
выберите цвет фона и текста
- Диапазон: A1: 1
вы также можете просто создать новый столбец в электронной таблице, сопоставить дату и вернуть флаг, если это сегодня...
=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's date
}
}
s.getRange('A1:D').setBackground(null); // range to clear
s.getRange(row + ":" + row).offset(1, 0).setBackground('yellow');
}
простой ответ похож на Clinet.
Формат - > Условное Форматирование...-> (Формат ячеек...) Пользовательская формула
затем заполните =ячеек-диапазон=сегодня()
например: =$I$2:$BC$2=TODAY ()
Это довольно просто.
Выберите область, на которую он должен воздействовать, и Щелкните правой кнопкой мыши таблицу и выберите "условный формат". В этом меню выберите "пользовательская формула" (он может называться по-другому, но это последний выбор в меню)
когда строка должна быть отформатирована, когда ячейка в столбце > 1, Используйте это в поле формулы
=$A:$A0 > 1
Выберите область, которую вы хотите иметь эффект, как
A1:G100
вот это