我有这个用于自动自定义排序的脚本,但是,由于某种原因,它只在所选范围只包括我实际想要排序的列而不是整个表时才起作用。在这种情况下,我想根据人们的当前状态(这是一个下拉菜单,每个人都有所有选项)对他们进行排序——当他们"就绪"时;我希望它们在DISPATCHED"时出现在最上面。出现在第二位;ENROUTE"-第三,等等。状态列排序很好,但它不会移动自己的行。
是否有一种方法来分组和锁定一行,以便如果该行的一个单元格被重新排序,那么整个行应该重新排序?这是我目前使用的脚本:
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.');
}
非常感谢所有的帮助!谢谢大家
你修改错了。
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.');
}