如何仅更改“true”行的背景颜色?

时间:2017-02-08 01:23:39

标签: javascript google-apps-script google-sheets

如何在原始工作表“Pasco”上仅根据function checkDate(row)更改(true)行的背景颜色?这可能吗?

关于剧本的一点点:

通过function getDateRange()输入日期范围,如果通过function checkDate(row)符合该日期范围,则会检查“Pasco”表格中的所有行。如果它确实符合日期范围(true),function filterRows()基本上会过滤“Pasco”表格中的行,并将它们移动到另一张“Pasco的副本”。

另一种询问我问题的方法,我怎样才能获得“Pasco”表中“真”的所有行的范围。如果“Pasco”没有按日期排序,这可能意味着多个范围,对吧?一旦我有了一个范围,我就能轻松改变背景。

如果您要测试脚本,请创建两张“Pasco”和“Pasco副本”。在'Pasco'从第2行开始,将一些日期放在第I列(第8列)。要查看正在进行的过滤。每次运行都会删除/创建“Pasco副本”。

感谢您的时间=)

var globalStartDate;
var globalEndDate;

function getDateRange(){

  var startui = SpreadsheetApp.getUi();
  var startprompt = startui.prompt('Start Date', 'Enter a date in m/d/y format', startui.ButtonSet.OK_CANCEL);
  var startdate = new Date(startprompt.getResponseText());
  var startdatemilliseconds = startdate.getTime();
  Logger.log(startdate);
  Logger.log(startdatemilliseconds);
  globalStartDate  = startdatemilliseconds;

  var endui = SpreadsheetApp.getUi();
  var endprompt = endui.prompt('End Date', 'Enter a date in m/d/y format', endui.ButtonSet.OK_CANCEL);
  var enddate = new Date(endprompt.getResponseText());
  var enddatemilliseconds = enddate.getTime();
  Logger.log(enddate);
  Logger.log(enddatemilliseconds);
  globalEndDate  = enddatemilliseconds;
}

function checkDate(row) {

  Logger.log(row[8].getTime() <= globalEndDate && row[8].getTime() >= globalStartDate);
  return (row[8].getTime() <= globalEndDate && row[8].getTime() >= globalStartDate);  // Check column H
}

function filterRows() {

  var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = Spreadsheet.getSheetByName('Pasco');
  var sheetdelete = Spreadsheet.getSheetByName('Copy of Pasco');

  Spreadsheet.deleteSheet(sheetdelete);
  Spreadsheet.setActiveSheet(sheet1);
  Spreadsheet.duplicateActiveSheet();

  var headers = 1; // # rows to skip
  var sheet2 = Spreadsheet.getSheetByName('Copy of Pasco');
  var range = sheet1.getDataRange();
  var data = range.getValues();
  var headerData = data.splice(0,headers); // Skip header rows
  getDateRange();
  var filteredData = data.filter( checkDate );
  var outputData = headerData.concat(filteredData);  // Put headers back
  Logger.log(filteredData)

  sheet2.clearContents();  // Clear content, keep format

  // Save filtered values
  sheet2.getRange(1, 1, outputData.length, outputData[0].length).setValues(outputData);
}

1 个答案:

答案 0 :(得分:1)

抱歉,我没有时间阅读您的代码并给您一个完整的答案,但您可以添加一个循环来浏览工作表并设置每行的背景颜色&#39; true&# 39;

在我的下面的脚本中,我假设&#39; true&#39;在A栏中。

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var data = sheet.getRange(1, 1, sheet.getLastRow()).getValues();
  var lastCol = sheet.getMaxColumns();

  for (var i = 0; i < data.length; i ++){
  if(data[i][0] == true){
  sheet.getRange(i + 1, 1, 1, lastCol).setBackground('Yellow');
   }
  }
 }

修改

在过滤器行功能中调用getDateRange()后插入此代码。

  var lastCol = sheet1.getMaxColumns(); 

  for(var i = headers; i < data.length ; i++){ 
  if(data[i][8].getTime() <= globalEndDate && data[i][8].getTime() >= globalStartDate){ 
  sheet1.getRange(i, 1, 1, lastCol).setBackground('Yellow'); 
    } 
   } 

您的过滤器行功能现在应如下所示:

function filterRows() {

  var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = Spreadsheet.getSheetByName('Pasco');
  var sheetdelete = Spreadsheet.getSheetByName('Copy of Pasco');

  Spreadsheet.deleteSheet(sheetdelete);
  Spreadsheet.setActiveSheet(sheet1);
  Spreadsheet.duplicateActiveSheet();

  var headers = 1; // # rows to skip
  var sheet2 = Spreadsheet.getSheetByName('Copy of Pasco');
  var range = sheet1.getDataRange();
  var data = range.getValues();
  var headerData = data.splice(0,headers); // Skip header rows
  getDateRange();

  var lastCol = sheet1.getMaxColumns(); 
  for(var i = headers; i < data.length ; i++){ 
  if(data[i][8].getTime() <= globalEndDate && data[i][8].getTime() >= globalStartDate){ 
  sheet1.getRange(i + headers, 1, 1, lastCol).setBackground('Yellow'); 
    } 
   } 

  var filteredData = data.filter( checkDate );
  var outputData = headerData.concat(filteredData);  // Put headers back
  Logger.log(filteredData)

  sheet2.clearContents();  // Clear content, keep format

  // Save filtered values
  sheet2.getRange(1, 1, outputData.length, outputData[0].length).setValues(outputData);
}