如何根据Google文档电子表格中的当前日期设置行的背景颜色?

时间:2013-11-22 10:42:39

标签: google-apps-script row spreadsheet highlight

我有一个Google Docs SpreadSheet,其中A列是日期(A1:2013-11-22,A2:2013-11-23,A3:2013-11-24等)。我想自动突出显示 - 为行设置背景颜色,A列是今天的日期。每天都要突出显示不同的行。

我希望我需要一个脚本,恕我直言,这不可能在Google Docs SpreadSheet中使用条件格式化。

知道怎么做吗?非常感谢!

7 个答案:

答案 0 :(得分:8)

这就是我做的。我做了条件格式化并选择了我的范围,然后在“格式化单元格,如果......”我选择了自定义并使用了这个公式:

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

我在B栏中有我的约会,这突出了我今天的日期范围内的整行。

答案 1 :(得分:3)

我修改了Serge的一个例子(谢谢,Serge!),日期在A栏中。具有日期的行已清除背景颜色,其他行保持不变。额外奖励:在活动工作表上运行脚本的自定义菜单。

/* 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 :(得分:2)

如果您希望在电子表格打开时自动启动,则必须安装一个可安装的onOpen,它将调用以下功能(从脚本编辑器转到ressources&gt;此脚本触发&gt;在打开时添加新触发器&gt; sreadsheet / )

这是列的代码:(见下面的行)

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

注意:如果您希望它基于计时器完全自动运行,那么它是完全可行的,只需使用openByIdgetSheetByNamesee doc here)更改ss和sh变量并进行设置一个计时器让它每天凌晨1点左右运行。

答案 3 :(得分:2)

A房屋约会时,试试这个。

  • 右键单击
  • 条件格式
  • 更改为&#34;自定义公式为&#34;在左侧的下拉框中
  • 输入此自定义公式:

    =(A=TODAY())
    
  • 选择背景和文字颜色

  • 范围:A1:1

答案 4 :(得分:0)

您也可以在电子表格中添加一个新列进行日期匹配,如果是今天就返回一个标志...

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

}

答案 5 :(得分:0)

这个很简单。

选择它必须生效的区域 右键点击电子表格,然后选择条件格式&#39; 从此菜单中选择&#39;自定义公式&#39; (它可能命名不同,但它是菜单中的最后一个选择)

当列中的单元格&gt;需要格式化行时1,在公式框中使用它

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

选择您想要有效的区域

A1:G100

它是

答案 6 :(得分:0)

简单的答案就像Clinet。

格式 - &gt;条件格式化......-&gt; (格式化单元格,如果...)自定义公式

然后填写 = cells-range = today()

例如:= $ I $ 2:$ BC $ 2 = TODAY()