Google apps script Google脚本按任意列对2D数组排序

Google apps script Google脚本按任意列对2D数组排序,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我之前问过一个关于从数据库检索记录的问题,这里: 我对处理数组和创建自己的排序算法相当熟悉,但由于速度快,我想使用现有的Array.sort()方法来组织数据。我发现我可以很容易地使用它来按第一列数据对2D数组进行排序,但是除了第一列之外,我找不到对另一列数据进行排序的语法 我找到的最接近的是:。然而,这些输入对我来说并不起作用。以下是我的数组tableData的以下代码: tableData.sort([{ column: 1}]); =>TypeError:(类)@4dde8e64不是函数

我之前问过一个关于从数据库检索记录的问题,这里:

我对处理数组和创建自己的排序算法相当熟悉,但由于速度快,我想使用现有的
Array.sort()
方法来组织数据。我发现我可以很容易地使用它来按第一列数据对2D数组进行排序,但是除了第一列之外,我找不到对另一列数据进行排序的语法

我找到的最接近的是:。然而,这些输入对我来说并不起作用。以下是我的数组tableData的以下代码:

tableData.sort([{ column: 1}]);
=>TypeError:(类)@4dde8e64不是函数,而是对象。(第49行,文件“sortTablebyCol”)

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

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

该方法可以有一个函数参数来选择要排序的部分。代码如下:

    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;
    });
array.sort(函数(x,y){
var xp=x[3];
var yp=y[3];
//在这个例子中,我使用了第四列。。。
返回xp==yp?0:xp

编辑 在您的评论之后,这里是一个小的演示函数,它应该有助于理解这是如何工作的

我没有使用缩写形式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);
}
函数演示(){
//使用完整工作表作为阵列源
变量数组=SpreadsheetApp.getActive().getActiveSheet().getDataRange().getValues();
log('unsortedarray='+array);
array.sort(函数(x,y){
//在这个例子中,我使用了第四列。。。
var compareArgumentA=x[3];
var compareArgumentB=y[3];
//最后使用这两个变量,例如Number(x[0])和Number(y[0])对数组中第一列(index0)的数值进行比较
//另一个示例x[0]。toLowerCase()和y[0]。toLowerCase()将在不考虑字母大小写的情况下进行比较。。。
log('compareArgumentA='+compareArgumentA+'和compareArgumentB='+compareArgumentB');
var result=0;//初始化返回值,然后进行比较:3种情况
if(compareArgumentA==compareArgumentB){return result};//if equal返回0
if(compareArgumentAB返回1
}
);
Logger.log('\n\n\n被选中的数组='+array);
}
我添加了两个Logger.log来检查起始值、中间值和最终值。在电子表格中试试这个


希望这会有所帮助。

我的建议是使用一个像下划线.js这样的库,它有很多有用的函数来操作集合、数组、映射/减少、排序等。。。谷歌应用程序脚本可以正常工作。这是我在GAP上启动的任何项目中添加的第一个库。

如果您不使用.getValues,而是将其限制为.getDataRange,那么如果您避免使用方括号,您的原始排序代码“tableData.sort([{column:1,升序: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});

我在

中找到了这个,谢谢你的建议,谢尔盖。我进一步查看了sheet.getrange()、range.sort()和range.getvalues()文档以及您提供的文档链接。我意识到我所做的和文档所建议的之间的差异如下所示://我最初做的是什么,这给出了一个错误=>var tableData=sheet.getDataRange().getValues();tableData.sort(1)//实际工作情况=>var tableDataRange=sheet.getDataRange();tableDataRange.sort(1);为什么排序函数能够处理范围而不是其值的数组?你对此有什么见解吗?你提到的排序方法是一个数组,数组是一个JavaScript对象,只有JavaScript方法。。。我展示的例子是纯JavaScript,你可以用它做更多的事情…谢谢你,Serge。这是有道理的。我不明白sort方法是Range类的方法,正如您所说的。感谢您提供的代码片段,它对我来说非常适合,尽管我还不太理解它的语法。我会深入研究的。是的,值得研究。。。我以前学过,现在我一直在用;-)-谢谢你(也)接受
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});