我正在开发Google Apps脚本电子表格应用程序,我希望该程序具备的一项功能是根据来自2个不同列的数据自动对一系列表单响应进行排序。所以我想根据第16列中的数据对其进行排序,然后按列1排序。我可以使用以下方法手动实现此功能: https://drive.googleblog.com/2010/06/tips-tricks-advanced-sorting-rules-in.html
目前我正在使用第一列运行Spreadsheet.sort(column, ascending)
函数,但我无法对其进行排序,以便它接受第二列作为附加排序规则。我可以使用Google Apps脚本中的方法来模拟此功能吗?
答案 0 :(得分:11)
见文档: https://developers.google.com/apps-script/reference/spreadsheet/range#sort(Object)
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}]);
}
答案 1 :(得分:0)
您可以在数组级别进行排序,只需从工作表中获取数据到矩阵,然后选择要排序的列,在多个过程中对矩阵进行排序。
类似的东西:
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);
}
或更好,遵循Adam的评论:
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);
}
但是迈克尔的答案,如果更聪明使用我不知道的Range.sort方法中的构建(至少它的扩展可能性)。