Reputation: 41
I'm trying to sort a range (3 columns total) by column 2 (Star grade) then by column 3 (level to level) then by column 1 (Bot), here's the current script I'm using to get it to sort by just column 2:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("DarkestSpawn");
var range = sheet.getRange("AD12:AF51");
var sortCol=1; // 0 for first column and 1 for second column and so on...
var asc=false; // set variable asc to false for descending sort
function onEdit(e) {
sortrange();
};
function sortrange() {
var activeSheet = ss.getActiveSheet();
var activeRange = activeSheet.getActiveRange();
var sortedValues;
if( sheet.getName() == activeSheet.getName() &&
activeRange.getLastRow() >= range.getRow() &&
activeRange.getRow() <= range.getLastRow() &&
activeRange.getLastColumn() >= range.getColumn() &&
activeRange.getColumn() <= range.getLastColumn() )
{
sortedValues=range.getValues().sort(mySortFunction);
range.setValues(sortedValues);
}
};
var mySortFunction = function(a,b) {
try{x=a[sortCol].toLowerCase();
y=b[sortCol].toLowerCase();}
catch(e){x=a[sortCol];y=b[sortCol];}
return (x>y)?(asc?1:-1):(x<y)?(asc?-1:1):0
};
This is example of a before, then after I want to do:
Upvotes: 2
Views: 3332
Reputation: 41
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("DarkestSpawn");
var range = sheet.getRange("AD12:AF51");
function onEdit(e) {
range.sort([{column: 31, ascending: false}, {column: 32, ascending: false}, {column: 30, ascending: true}]);
}
This is what I ended up with that works. After many trials and errors, re-reading the sort reference and the above code I got to this and it finally worked.
THANKS!!!!
Upvotes: 2
Reputation: 10259
Here it is for your specific sheet and range. I also am attaching a new test spreadsheet.
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("DarkestSpawn");
var sheet=e.source.getActiveSheet().getName()
var range=s.getRange("AD12:AF51")
var col =e.range.getColumn()
var actRow=e.range.getRow()
var sortFirst=30
var sortSecond=31
var sortThird=32
var sortFirstAsc=true
var sortSecondAsc=false
var sortThirdAsc=false
if(sheet=="DarkestSpawn" && col==30 && actRow >= 12 && actRow <= 51 || sheet=="DarkestSpawn" && col==31 && actRow >= 12 && actRow <= 51 ||sheet=="DarkestSpawn" && col==32 && actRow >= 12 && actRow <= 51){
range.sort([ {column: sortSecond, ascending: sortSecondAsc},{column: sortThird, ascending: sortThirdAsc},{column: sortFirst, ascending: sortFirstAsc}]);
}}
Here is my test spreadsheet. https://docs.google.com/spreadsheets/d/1LGdDsmk9_ciZ9fXZ-KjxcOrJspadNGU9dONhrkQytQM/edit?usp=sharing
Upvotes: 2