Google Sheets: сценарий упорядочивает только те строки, где дата> сегодня - PullRequest
0 голосов
/ 19 апреля 2020

Некоторая помощь будет оценена. У меня есть следующий код:

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

Он работает нормально, но теперь я хочу заказывать только тогда, когда дата из столбца А является СЕГОДНЯ или больше.

Изображение листа Я хочу отсортировать только строку 3.

Есть идеи, как этого добиться?

Заранее спасибо;)

1 Ответ

0 голосов
/ 20 апреля 2020

Решение

Возможный обходной путь для решения вашей проблемы - сортировка только по диапазону дат, которые есть сегодня или позже. Для этого выполните следующие действия:

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

Надеюсь, это помогло вам. Дайте мне знать, если вам нужно что-то еще или вы что-то не поняли. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...