Google表格:脚本仅对日期>今天的行进行排序

时间:2020-04-18 23:31:15

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

一些帮助将不胜感激。我有以下代码:

function sort() {

  //Variable for column to sort first
  var sortFirst = 1;
  var sortFirstAsc = true;
  //Variables for column to sort second
  var sortSecond = 2;
  var sortSecondAsc = true;
  //Variables for column to sort third
  var sortThird = 4;
  var sortThirdAsc = true;

  //Number of header rows
  var headerRows = 1; 

  /** Define variables */

  /** Sorting function **/

  var activeSheet = SpreadsheetApp.getActiveSheet();
  var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted
  var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  var range = sheet.getRange(headerRows+1, 1, sheet.getMaxRows()-headerRows-1, sheet.getLastColumn());
  range.sort([{column: sortFirst, ascending: sortFirstAsc}, {column: sortSecond, ascending: sortSecondAsc}, {column: sortThird, ascending: sortThirdAsc}]);
}

它可以正常工作,但是现在我只想在A列中的日期为TODAY或更大时订购。

Image of sheet 我只想在第3行下面排序。

有什么想法可以实现吗?

预先感谢;)

1 个答案:

答案 0 :(得分:0)

解决方案

解决问题的一种可能的解决方法是仅在今天或以后的日期范围内进行排序。请按照以下步骤来实现:

  1. 根据日期列(1)以升序对范围进行排序。
  2. 搜索等于或大于当前日期的第一项。
  3. 从我们在上一步中找到的项目的行开始选择一个新范围。
  4. 在此新范围上执行排序功能。

这是完成此任务的代码段,并带有注释:

function sort() {
  
  //Variable for column to sort first
  var sortFirst = 1;
  var sortFirstAsc = true;
  //Variables for column to sort second
  var sortSecond = 2;
  var sortSecondAsc = true;
  //Variables for column to sort third
  var sortThird = 4;
  var sortThirdAsc = true;
  
  //Number of header rows
  var headerRows = 1; 
  
  /** Define variables */
  
  /** Sorting function **/
  
  var activeSheet = SpreadsheetApp.getActiveSheet();
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  
  
  var range = sheet.getRange(headerRows+1, 1, sheet.getMaxRows()-headerRows-1, sheet.getLastColumn());
  
  // Sort the whole range by date in ascending order
  range.sort([{column: 1, ascending: true}]);
  
  // Get the date values of the first column to then compare them to today's date. Flat is used to create a 1D array as getValues() will return a 2D array and to make things simpler
  var getDateValues = sheet.getRange(headerRows+1, 1,sheet.getLastRow()-1,1).getValues().flat();
  
  // Initialise today's date. As we are only interested on comparing the date, we set the starting time at 00am. We also start a variable to store the index of the row where dates are equal or higher than today. 
  var today = new Date().setHours(0,0,0,0);
  var indexStartRange;
  
  // Loop through all dates values
  for(i=0;i<getDateValues.length;i++){
    
    // Create date object for each value
    var date = new Date(getDateValues[i]);
    
    // if this date is equal or higher than today, then we store the value of its index and break the loop.
    if(date.valueOf() >= today.valueOf() ){
      indexStartRange = i + 2;
      break;
    }
    
  }
  
  // create a final range starting from the row where dates start being equal or higher than today and just run as you did in your example before. 
  var finalRange = sheet.getRange(indexStartRange, 1, sheet.getLastRow(), sheet.getLastColumn());
  finalRange.sort([{column: sortFirst, ascending: sortFirstAsc}, {column: sortSecond, ascending: sortSecondAsc}, {column: sortThird, ascending: sortThirdAsc}]);
}

我希望这对您有所帮助。让我知道您是否需要其他任何东西,或者您是否不了解。 :)