Reputation: 15
I have this script for automatic custom sorting, however, for some reason it only works when the chosen range includes only the column I actually want to sort and not the whole table. In this case I want to sort people by their current status (which is a dropdown with all options for each person) - when they are "Ready" I want them to appear on top, when "DISPATCHED" to appear second, "ENROUTE" - third, etc. The status column sorts nicely but it doesn't move the rows with itself.
Is there a way to group and lock a row so that if one cell of that row is re-sorted then the whole row should be re-sorted? This is the script I currently use:
SHEET_NAME = "Zars";
SORT_DATA_RANGE = "F3:F100";
function onEdit(e){
multiSortColumns();
}
function multiSortColumns(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(SHEET_NAME);
var range = sheet.getRange(SORT_DATA_RANGE);
var values = range.getValues();
var order = ['READY', 'DISPATCHED', 'ENROUTE', 'REST', 'COVERED', 'NO ANSWER', '']; //CUSTOM ORDER LIST
values.sort(function (a, b) {
if (a[0] === 'READY' && b[0] !== 'READY') { return -1; }
else if (a[0] !== 'READY' && b[0] === 'READY') { return 1; }
else { return order.indexOf(a[0]) - order.indexOf(b[0]); }
});
range.setValues(values);
ss.toast('Sort complete.');
}
All help is greatly appreciated! Thank you lots
Upvotes: 1
Views: 327
Reputation: 5862
You have modified it wrongly.
SHEET_NAME = "Zars";
SORT_DATA_ROWSTART = 3; // Data starts from Row 3
SORT_DATA_ROWEND = 100; // Data ends by Row 100
SORT_DATA_COL = 6; // Status in Col F
function onEdit(e){
multiSortColumns(e);
}
function multiSortColumns(e){
const r = e.range.rowStart;
if (r < SORT_DATA_ROWSTART) { return; }
if (r > SORT_DATA_ROWEND) { return; }
var sheet = e.source.getActiveSheet();
if (sheet.getName() !== SHEET_NAME) { return; }
var rows = SORT_DATA_ROWEND - SORT_DATA_ROWSTART + 1;
var range = sheet.getRange(SORT_DATA_STARTROW, 1, rows, sheet.getLastColumn());
var values = range.getValues();
var order = ['READY', 'DISPATCHED', 'ENROUTE', 'REST', 'COVERED', 'NO ANSWER', '']; //CUSTOM ORDER LIST
var i = SORT_DATA_COL - 1;
values.sort(function (a, b) {
return order.indexOf(a[i]) - order.indexOf(b[i]);
});
range.setValues(values);
ss.toast('Sort complete.');
}
Upvotes: 1