Google Script按任意列排序2D数组

时间:2014-10-10 13:28:15

标签: google-apps-script google-sheets

我之前询问了一个关于从数据库中检索记录的问题:Retrieving Records from a Google Sheet with Google Script

我对操作数组和创建自己的排序算法非常熟悉,但我想使用现有的Array.sort()方法来组织数据,因为它的速度很快。我发现我可以轻松地使用它来按第一列数据对2D数组进行排序,但是我找不到排序不同列数据的语法,而不是第一列。

我发现的最接近的是:Google Apps Script Additional Sorting Rules。但是,这些投入对我来说并不起作用。以下是我的数组tableData:

的代码
tableData.sort([{ column: 1}]);

=> TypeError :(类)@ 4dde8e64不是函数,它是对象。 (第49行,文件" sortTablebyCol")

tableData.sort([{column: 1, ascending: true}]);

=> TypeError :(类)@ 4d89c26e不是函数,它是对象。 (第50行,文件" sortTablebyCol")

选择要排序的数据列的正确语法是什么?

3 个答案:

答案 0 :(得分:7)

array.sort方法可以有一个函数参数来选择要排序的部分。代码是这样的:

    array.sort(function(x,y){
      var xp = x[3];
      var yp = y[3];
// in this example I used the 4th column... 
      return xp == yp ? 0 : xp < yp ? -1 : 1;
    });

修改

根据你的评论,这是一个小的演示函数,应该有助于理解它是如何工作的。

而不是使用短格式if / else条件我使用传统形式并将其分成3行,以便更容易理解。

function demo(){
  // using a full sheet as array source
  var array = SpreadsheetApp.getActive().getActiveSheet().getDataRange().getValues();
  Logger.log('Unsorted array = '+array);
  array.sort(function(x,y){
// in this example I used the 4th column... 
    var compareArgumentA = x[3];
    var compareArgumentB = y[3];
    // eventually do something with these 2 variables, for example Number(x[0]) and Number(y[0]) would do the comparison on numeric values of first column in the array (index0) 
    // another example x[0].toLowerCase() and y[0].toLowerCase() would do the comparison without taking care of letterCase...
    Logger.log('compareArgumentA = '+compareArgumentA+' and compareArgumentB = '+compareArgumentB);
    var result = 0;// initialize return value and then do the comparison : 3 cases
    if(compareArgumentA == compareArgumentB ){return result }; // if equal return 0
    if(compareArgumentA < compareArgumentB ){result = -1 ; return result }; // if A<B return -1 (you can change this of course and invert the sort order)
    if(compareArgumentA > compareArgumentB ){result = 1 ; return result }; // if a>B return 1
    }
            );
  Logger.log('\n\n\nSorted array = '+array);
}

我添加了几个Logger.log来检查起始值,中间值和最终值。在电子表格中试试这个。

希望这会有所帮助。

答案 1 :(得分:0)

我的建议是使用像underscore.js这样的库,它有很多有用的功能来操作集合,数组,映射/缩小,排序等......使用Google Apps脚本时没有任何故障。这是我在GAP上开始的任何项目中添加的第一个库。

答案 2 :(得分:0)

如果您不使用.getValues而是将其限制为.getDataRange,则可能是您原来的排序代码“ tableData.sort([{column:1,ascending:true}]);”如果您避免使用方括号,则可以正常工作。

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

我在Google Documentation

中找到了这个