I modified the example code provided here to come up with the script below. While it does the job, I have been unable to find a way to prevent it from deleting the header (first) row of the sheet.
A somewhat tangential aside: the following two lines of code at the end of the cited script were removed to sort the sheet without deleting its contents and replacing them with an unformatted array:
sheet.clear();
sheet.getRange(1,1,rows,cols).setValues(vf);
I tried skipping it in all the ranges but either get errors about mismatches between ranges and data or other problems.
function status_sort(){
var ss=SpreadsheetApp.getActive();
var sheet = ss.getSheetByName('current');
var rows = sheet.getLastRow();
var cols = sheet.getLastColumn();
var columnToSortBy = 4;
var rg = sheet.getRange(2, columnToSortBy, sheet.getLastRow(), 1);
var v1 = rg.getValues();
var sortObj = {'black_box':1, 'purple_box':2, 'green_box':3, 'yellow_box':4, 'red_box':5,'blue_box':6};
var col = [];
for(var i = 0; i < v1.length; i++){
col.push([sortObj[v1[i]]]);
}
sheet.getRange(2, cols + 1, rows, 1).setValues(col);
sheet.getDataRange().sort([{column:sheet.getLastColumn(),ascending:true}]);
var vf = sheet.getDataRange().getValues();
for(var i = 0; i < vf.length; i++){
vf[i].splice(vf[i].length,1);
}
}