Google Apps脚本 - 隐藏超过一个月的行数

时间:2017-02-07 21:04:28

标签: google-apps-script

我找到了this solution,但我正努力让它在我的工作表上工作。

提交该问题的用户有3个标题行,并希望该脚本仅适用于第4行和第4行。我有1个标题,因此需要脚本在第2行和第2行工作。

我已经让它独自留下了第1行 - 但它只隐藏了第2行和第3行。我无法弄清楚我哪里出错了。

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuItems=[{name: 'HideRows', functionName: 'hideRows'}];
  ss.addMenu('Hide Rows', menuItems);    
};

function hideRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName("Responses");
  var v = s.getRange("B:B").getValues();
  var today = new Date();
  var m = today.getMonth();
  for(var i=3;i<v.length;i++)
    if(v[i][0]=="" || v[i][0].getMonth()>=m) break;
  if(i>1) s.hideRows(2,i-1)
};

ETA:这是指向我的工作表/脚本的链接:https://docs.google.com/spreadsheets/d/1PkB1_hlJoI-iFYTAN8to_ES9R8QyUxEgPsWtSTUmj8U/edit?usp=sharing

3 个答案:

答案 0 :(得分:0)

for循环和if语句都有语法错误。在这些部分中应该有{}代码。然后你的逻辑出错了。第2行中的10月份大于2月份的当月。因此,您可能希望首先比较最高年份的年份,然后比较月份:

function hideRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName("Responses");
  var v = s.getRange("B:B").getValues();
  var today = new Date();
  var m = today.getMonth();
  var y = today.getYear();
  for(var i=3;i<v.length;i++){
    if(v[i][0] === "" || v[i][0].getYear() >= y){
      if(v[i][0].getMonth() >= m) {
        var stophere = 0;
        break;
      }
    }
  }
  if(i>1) {
    s.hideRows(2,i-1);
  }
};

答案 1 :(得分:0)

function hideRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Responses');
  // start range from B2 skipping header
  // join() + split(',') converts 2D array into plain array
  // filter(Boolean) skips all the blank cells in column
  var v = s.getRange('B2:B').getValues().join().split(',').filter(Boolean);
  // today in milliseconds for date comparison
  var today = new Date().getTime();
  // one month in milliseconds
  var oneMonth = 2629746000;
  Logger.log(v.length);
  for (var i=0;i<v.length;i++) {
    // Date Object from cell in B2:B in milliseconds  
    var vDate = new Date(v[i]).getTime();
    // exit for loop when first date less than one month is found 
    if (today - vDate <= oneMonth) {
      break;
    }
  }
  Logger.log(i+1);
  s.hideRows(2, i);
}

答案 2 :(得分:0)

function onOpen(e) {
var ss =  SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Responses');
var today= new Date();
var today=today.setDate(today.getDate()-30); //minus 30 days

for ( var i = sheet.getLastRow(); i >= 2 ; i-- ) { 
   var filter = sheet.getRange(i, 2).getValue();//Evaluates Column B
  if ( filter.valueOf() < today.valueOf()) {
  sheet.hideRows(i);  }
  }
}