我想要在 appscript 中使用一维数组对二维数组进行排序。
使得二维数组与一维数组的顺序相同。
这是 google sheet 的链接:
一维数组 |
---|
一个 |
b |
丙 |
d |
埃 |
f |
克 |
时长 |
我 |
杰 |
钾 |
升 |
二维数组 | |
---|---|
b | 156 |
f | 68 |
一个 | 507 |
丙 | 22 |
d | 430 |
埃 | 555 |
克 | 689 |
钾 | 62 |
升 | 395 |
我 | 209 |
杰 | 745 |
时长 | 三十七 |
我使用字母作为例子,但在我的例子中不仅仅是字母而是全名。
我尝试了其他帖子名称的脚本:“在 Javascript 中按任意列表对对象数组进行排序”,但是它不起作用,它只是返回我的二维数组而不对其进行排序。
我尝试的脚本:
const objects = spreadsheetApp.getActive().getSheetByName("feuille 2").getRange('A;B').getValues()
const order = spreadsheetApp.getActive().getSheetByName("feuille 1").getRange('A;A').getValues()
const orderIndex = {}
order.forEach((value, index) => orderIndex[value] = index);
// Sort
objects.sort((a, b) => orderIndex[a.id] - orderIndex[b.id]);
// Log
console.log('orderIndex:', orderIndex);
console.log('objects:', objects);
编辑:我根据答案尝试了脚本,但没有起作用:
function myFunction() {
let objects = SpreadsheetApp.getActive().getSheetByName("Feuille 7").getRange('D:E').getValues()
let order = SpreadsheetApp.getActive().getSheetByName("Feuille 7").getRange('A:A').getValues().flat()
/* Create a mapping object `orderIndex`:
*/
let orderIndex = {}
order.forEach((value, index) => orderIndex[value] = index);
// Sort
objects.sort((a, b) => orderIndex[a] - orderIndex[b])
// Log
Logger.log("/////////////////////////order////////////////////////////////")
Logger.log(order)
Logger.log("/////////////////////////objects////////////////////////////////")
Logger.log(objects)
SpreadsheetApp.getActive().getSheetByName("Feuille 7").getRange('H:I').setValues(objects)
}
order
是一个二维数组。getValues()
无论范围大小如何,始终返回一个二维数组。flat
将其转换为一维数组:二维数组中没有
id
属性。删除它并获取每个内部数组的第一个索引并根据它进行排序:调用时也有一个
getRange
拼写错误:应该是A:B
andA:A
(冒号:
- 而不是分号;
)问题询问如何按 指定的自定义
array
顺序进行排序。在一般情况下,两个数组可能包含不同数量的项目,这很难用Array.sort()来实现,因为该方法只允许您将 中的项目相互比较。然而,问题指定应根据(一个不同的数组)对项目进行比较和排序。order
array
order
array
按照 指定的自定义顺序进行排序的一种方法order
是使用Array.map()
,如下所示:您可以像这样使用该函数:
结果将如下所示:
f
请注意,e
和的不寻常位置d
是如何反映在结果中的。参见Array.map()。