Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting Google应用程序脚本附加排序规则_Sorting_Google Apps Script_Google Spreadsheet Api - Fatal编程技术网

Sorting Google应用程序脚本附加排序规则

Sorting Google应用程序脚本附加排序规则,sorting,google-apps-script,google-spreadsheet-api,Sorting,Google Apps Script,Google Spreadsheet Api,我正在开发一个GoogleApps脚本电子表格应用程序,我希望该程序具备的能力之一是根据来自两个不同列的数据自动排序一系列表单响应。所以我想按第16列中的数据排序,然后按第1列排序。我可以使用以下方法手动实现此功能: 目前,我正在对第一列运行电子表格.sort(column,升序)函数,但我无法对其进行排序,以便它接受第二列作为附加排序规则。Google Apps脚本中是否有一种方法可以用来模拟此功能?您可以在数组级别进行排序,只需将数据从工作表中获取到矩阵,然后在多个过程中对矩阵进行排序,选

我正在开发一个GoogleApps脚本电子表格应用程序,我希望该程序具备的能力之一是根据来自两个不同列的数据自动排序一系列表单响应。所以我想按第16列中的数据排序,然后按第1列排序。我可以使用以下方法手动实现此功能:


目前,我正在对第一列运行
电子表格.sort(column,升序)
函数,但我无法对其进行排序,以便它接受第二列作为附加排序规则。Google Apps脚本中是否有一种方法可以用来模拟此功能?

您可以在数组级别进行排序,只需将数据从工作表中获取到矩阵,然后在多个过程中对矩阵进行排序,选择要排序的列

大概是这样的:

function test(){
sortSheetOnColumn(2,3)
}

function sortSheetOnColumn(col1,col2){
  var sh = SpreadsheetApp.getActiveSheet();
  var data = sh.getDataRange().getValues();// get all data
  var header = data.shift();
  data.sort(function(x,y){  // Note: sort method changes the original array
//  var xp = Number(x[col2-1]);// use these to sort on numeric values
//  var yp = Number(y[col2-1]);
  var xp = x[col2-1].toLowerCase();// use these for non-numeric values
  var yp = y[col2-1].toLowerCase(); // I used toLowerCase() for my use case but you can remove it or change it to whatever you need
  Logger.log(xp+'   '+yp); // just to check the sort is OK
  return xp == yp ? 0 : xp < yp ? -1 : 1;// sort on column col ascending
  });
  data.sort(function(x,y){  // Note: sort method changes the original array
//  var xp = Number(x[col1-1]);// use these to sort on numeric values
//  var yp = Number(y[col1-1]);
  var xp = x[col1-1].toLowerCase();// use these for non-numeric values
  var yp = y[col1-1].toLowerCase();//
  Logger.log(xp+'   '+yp); // just to check the sort is OK
  return xp == yp ? 0 : xp < yp ? -1 : 1;// sort on column col ascending
  });
// and at the end take back the headers
  data.unshift(header);
  sh.getDataRange().setValues(data);
}
功能测试(){
Sortsheeton列(2,3)
}
函数排序表列(col1、col2){
var sh=SpreadsheetApp.getActiveSheet();
var data=sh.getDataRange().getValues();//获取所有数据
var header=data.shift();
sort(函数(x,y){//注意:sort方法更改原始数组
//var xp=Number(x[col2-1]);//使用它们对数值进行排序
//var yp=数量(y[col2-1]);
var xp=x[col2-1].toLowerCase();//将其用于非数值
var yp=y[col2-1].toLowerCase();//我在我的用例中使用了toLowerCase(),但您可以删除它或将其更改为您需要的任何内容
Logger.log(xp+''+yp);//只是检查排序是否正确
返回xp==yp?0:xp
或者更好,按照亚当的评论:

function sortSheetOnColumn2(col1, col2) {
  var sh = SpreadsheetApp.getActiveSheet();
  var data = sh.getDataRange().getValues();// get all data
  var header = data.shift(), x1, y1, x2, y2;
  col1--;
  col2--;
  data.sort(function(x, y) {
    x1 = x[col1].toLowerCase();
    y1 = y[col1].toLowerCase();
    x2 = x[col2].toLowerCase();
    y2 = y[col2].toLowerCase();
    return x1 == y1 ? (x2 == y2 ? 0 : x2 < y2 ? -1 : 1) : x1 < y1 ? -1 : 1;
  });
  data.unshift(header);
  sh.getDataRange().setValues(data);
}
函数sortSheetOnColumn2(col1,col2){
var sh=SpreadsheetApp.getActiveSheet();
var data=sh.getDataRange().getValues();//获取所有数据
var header=data.shift(),x1,y1,x2,y2;
col1--;
col2--;
数据排序(函数(x,y){
x1=x[col1].toLowerCase();
y1=y[col1].toLowerCase();
x2=x[col2].toLowerCase();
y2=y[col2].toLowerCase();
返回x1==y1?(x2==y2?0:x2
但是,如果Michael的答案更聪明的话,那就是使用我不知道的内置Range.sort方法(至少是扩展的可能性)。

参见文档:


我不知道它是否更有效,但我认为您也可以使用单个函数对数组进行排序:
data.sort(函数(x,y){return x[0]==y[0]?(x[1]==y[1]?0:x[1]function sortFormResponses() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // change name of sheet to your sheet name
  var s = ss.getSheetByName("Form Responses");
  var lastCol = s.getLastColumn();
  var lastRow = s.getLastRow();

  // assumes headers in row 1
  var r = s.getRange(2, 1, lastRow - 1, lastCol);

  // Note the use of an array
  r.sort([{ column: 1, ascending: true }, { column: 16, ascending: true}]);

}