如何在AppScript中实现多列排序?先按分类列再按子分类列排序
多列排序(分类→子分类)实现方案
需求说明
先对「Categories(分类)」列进行字母排序,再对「Subcategories(子分类)」列进行字母排序,子分类排序需遵循分类列的分组顺序。
修改方案
核心是调整sortFunction的比较逻辑:先对比分类列的值,当分类相同时,再对比子分类列的值。推荐使用localeCompare方法处理字符串排序,比手动判断更简洁且兼容多语言。
第一步:确认列索引
先确定「Categories」和「Subcategories」在表格中对应的数组索引(JavaScript数组从0开始,表格列从1开始,比如表格第5列对应数组索引4),替换下面代码中的categoryColumnIndex和subcategoryColumnIndex。
修改后的完整代码
function autoSort() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName("Table"); const orderArray = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues(); orderArray.sort(sortFunction); sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).setValues(orderArray); } // 自定义排序函数:先按分类排序,再按子分类排序 var sortFunction = function(a, b) { // 替换为实际的分类列索引(比如分类是第3列则写2) const categoryColumnIndex = 4; // 替换为实际的子分类列索引(比如子分类是第4列则写3) const subcategoryColumnIndex = 5; // 先比较分类 const categoryCompare = a[categoryColumnIndex].localeCompare(b[categoryColumnIndex]); // 如果分类不同,直接返回分类的比较结果 if (categoryCompare !== 0) { return categoryCompare; } // 如果分类相同,再比较子分类 return a[subcategoryColumnIndex].localeCompare(b[subcategoryColumnIndex]); };
代码说明
localeCompare方法会返回一个数字:小于0表示a排在b前面,等于0表示相等,大于0表示a排在b后面,正好符合数组sort方法的要求。- 当分类列的值相同时,才会进入子分类的比较逻辑,保证子分类在同一分类组内排序。
内容的提问来源于stack exchange,提问作者Agus Martínez
相关产品推荐
相关产品推荐

