如何在AppScript中按一维数组的顺序排序二维数组
在Google Apps Script中按指定一维数组顺序排序二维数组
问题分析
你的需求是让二维数组按照一维数组的指定顺序排列,但之前的代码未生效,核心问题出在排序时的匹配键错误以及未处理空数据:
- 第一次代码中使用
a.id,但objects是二维数组(子元素为数组而非对象),不存在id属性,导致排序逻辑完全失效。 - 修改后的代码中,排序时直接用
orderIndex[a],这里的a是整个子数组(比如["b", 156]),而orderIndex的键是一维数组中的单个值(比如"b"),无法匹配到对应索引,排序自然不生效。 - 直接取整列数据会包含大量空行,干扰排序结果和写入操作。
修正后的代码
function sortByOrderList() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName("Feuille 7"); // 获取一维顺序数组,过滤空值(只保留有效匹配项) const order = sheet.getRange('A:A').getValues() .flat() .filter(value => value !== ""); // 获取二维数据数组,过滤空行(假设每行第一列是用于匹配的键值) const objects = sheet.getRange('D:E').getValues() .filter(row => row[0] !== ""); // 创建顺序映射表:键为匹配值,值为对应的顺序索引 const orderIndex = {}; order.forEach((value, index) => { orderIndex[value] = index; }); // 执行排序:根据每行匹配键在order中的索引差值排序 objects.sort((a, b) => { // 处理不在order列表中的元素,默认排到所有指定元素之后 const indexA = orderIndex[a[0]] !== undefined ? orderIndex[a[0]] : order.length; const indexB = orderIndex[b[0]] !== undefined ? orderIndex[b[0]] : order.length; return indexA - indexB; }); // 将排序后的数组写入指定范围(精准匹配数据行数和列数) if (objects.length > 0) { sheet.getRange(1, 8, objects.length, objects[0].length).setValues(objects); } Logger.log("排序完成"); }
关键说明
- 过滤空数据:通过
filter去掉整列中的空值和空行,避免无效数据干扰排序逻辑。 - 正确匹配键:排序时取二维数组子元素的第一个值(
a[0])作为匹配键,对应orderIndex中的键值,确保能获取到正确的排序索引。 - 边界处理:如果二维数组中存在不在
order列表中的元素,将它们的索引设为order的长度,这样会自动排到所有指定顺序元素的后面。 - 精准写入:使用
getRange(1, 8, objects.length, objects[0].length)指定写入范围,避免覆盖多余单元格(8代表第H列)。
内容的提问来源于stack exchange,提问作者Romain Gapteau
相关产品推荐
相关产品推荐

