简体   繁体   English

如何在 Google Apps Script Javascript 中按升序对日期字符串进行排序

[英]How to sort date strings in accending order in Google Apps Script Javascript

I have 3 columns of dates I need to sort in a spreadsheet.我有 3 列需要在电子表格中排序的日期。

First I need to sort Horizontally.首先我需要水平排序。 The dates are in string format.日期采用字符串格式。

eg "5/3","5/20", "6/3" or sometimes BLANK.例如“5/3”、“5/20”、“6/3”或有时是空白。

I need everything moved into the left-most column if some of the cells are blank.如果某些单元格为空白,我需要将所有内容移到最左侧的列中。

Secondly I need to sort the rows by date.其次,我需要按日期对行进行排序。 range.sort is fine for that. range.sort 很好。

Here's What I have so far.这是我到目前为止所拥有的。

function sortDate() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheetByName("Loads");
 var range = sheet.getRange("C9:BA53"); 


  //Sorts Horizontally

    //getValues gives a 2D array. 
    var data = sheet.getRange('AC9:AE53');



    //This for loop with loop through each row
    for(var i=0; i<data.length; i++) 
    {

    var dateArry = [data[i][0],data[i][1],data[i][2]];
          //This for loop with loop through each column
         //for (var j = 0; j < data[i].length ; j ++){
          //This assumes Column AC has the dates you are comparing aganist

         //dateElem = date.split('/');

         //dateElem[1] = Number(dateElem[1]) + 1;

         //newDate = dateElem.join('/');

         var sortDates = dateArry.sort();

         sheet.getRange("AC"+i+"AE"+i).setValues(sortDates);




         };
    };

UPDATED CODE:更新代码:

Here are the updates I've made.这是我所做的更新。 The hardest part is sorting each row of dates.最难的部分是对每一行日期进行排序。 I've added a second for loop to separate each set of dates.我添加了第二个 for 循环来分隔每组日期。

function sortDate() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheetByName("Loads");
 //var range = sheet.getRange("C9:BA53"); 


  //Sorts Horizontally

    //getValues gives a 2D array. 
    var data = sheet.getRange('AC1:AE53').getValues();



    //This for loop with loop through each row
    for(var i=0; i<data.length; i++) {
      for (var j = 8; j < data[i].length ; j ++){

    var dateArry = [data[i][0],data[i][1],data[i][2]];

????????? ????????? How do I sort the 3 dates per row????????????如何对每行的 3 个日期进行排序?????????????

         var sortDates = dateArry.sort();

         //sheet.getRange("AC"+i+":AE"+i).setValues(sortDates);
         sheet.getRange("AC"+i).setValue(sortDates[0]);
         sheet.getRange("AD"+i).setValue(sortDates[1]);
         sheet.getRange("AE"+i).setValue(sortDates[2]);

         };
    };

    };

UPDATED CODE 2:更新代码 2:

Here is my 3rd run of the program.这是我第三次运行该程序。 It works great except it puts null/empty cells first when sorting.除了在排序时将空/空单元格放在首位之外,它效果很好。 I need anything null to go at the end while keeping the rest in ascending order.我需要在最后保留任何空值,同时保持其余部分按升序排列。 Thanks!!!谢谢!!!

Example:例子:

inputArray = ["5/3", " ","6/2"] inputArray = ["5/3", " ","6/2"]

correctOutput = ["5/3","6/2"," "]正确输出 = ["5/3","6/2",""]

incorrectOutput = [" ", "5/3","6/2"] This is what it is doing now.不正确的输出 = [" ", "5/3","6/2"] 这就是它现在正在做的事情。

3rd set of code:第三组代码:

 function sortDate2() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheetByName("Loads");
 //var range = sheet.getRange("C9:BA53"); 
 //Trying to fix improper sorting. works great for alphabetic sorting


  //Sorts Horizontally

    //getValues gives a 2D array. 
    var data = sheet.getRange('AC9:AE53').getValues();



    //This for loop with loop through each row
    for(var i=0; i<data.length; i++) {


    for (var j = 0; j < data[i].length ; j ++){ 

    var dateArry = [data[i][0],data[i][1],data[i][2]];





         //var sortDates = dateArry.sort(function(a, b){return a-b});
         var sortedDates = dateArry.sort(function (a, b) {
    // '01/03/2014'.split('/')
    // gives ["01", "03", "2014"]
    a = a.split('/');
    b = b.split('/');
    return a[1] - b[1] || a[0] - b[0] || (a===null)-(b===null) ;
});






         data[i][0] = sortedDates[0];
         data[i][1] = sortedDates[1];
         data[i][2] = sortedDates[2];


        };

         };

         sheet.getRange('AC9:AE53').setValues(data);


  };

You could also use sort(sortSpecObj) :您还可以使用sort(sortSpecObj)

Sorts the cells in the given range.对给定范围内的单元格进行排序。 Sorts the cells in a given range, by column and order specified.按指定的列和顺序对给定范围内的单元格进行排序。

Here is a snippet from the document:这是文档中的一个片段:

 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[0];
 var range = sheet.getRange("A1:C7");

 // Sorts by the values in the first column (A)
 range.sort(1);

 // Sorts by the values in the second column (B)
 range.sort(2);

 // Sorts descending by column B
 range.sort({column: 2, ascending: false});

 // Sorts descending by column B, then ascending by column A
 // Note the use of an array
 range.sort([{column: 2, ascending: false}, {column: 1, ascending: true}]);

 // For rows that are sorted in ascending order, the "ascending" parameter is
 // optional, and just an integer with the column can be used instead. Note that
 // in general, keeping the sort specification consistent results in more readable
 // code. We could have expressed the earlier sort as:
 range.sort([{column: 2, ascending: false}, 1]);

 // Alternatively, if we wanted all columns to be in ascending order, we would use
 // the following (this would make column 2 ascending)
 range.sort([2, 1]);
 // ... which is equivalent to
 range.sort([{column: 2, ascending: true}, {column: 1, ascending: true}]);

I also agree with @Dean, using Date.parse() will make it easier to sort.我也同意@Dean,使用Date.parse()会使排序更容易。

Hope this helps.希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM