arrays - 使用 Google Apps 脚本替换数组中的行
问题描述
我仍然对 Apps 脚本有所了解,只需要一些帮助来编辑数组。
所以我有两个数组:
var arrayBig = SpreadsheetApp.getSheetByName('Big').getDataRange().getValues();
var arraySmall = SpreadsheetApp.getSheetByName('Small').getDataRange().getValues();
我想arrayBig
根据 中的值替换特定行arraySmall
,然后将该数组写回我的电子表格(我可以接受的最后一部分)。
这两个数组的列数相同,但arraySmall
行数更少。
要替换的行:
- 根据第 1 列中的数值
arraySmall
替换 中的该行arrayBig
。
因此,如果第 1 列中的值 = 3,则将第 3 行替换为第 1 列= 3 所在arrayBig
行的内容arraySmall
。
我认为答案与地图方法有关,但我不明白。只是一些让我开始的指示将不胜感激,谢谢。
解决方案
这是一种“让你开始”的方法:
你描述了你的数据,但你没有提供任何具体的样本——所以这是我的起始数据,根据问题中的信息做出一些假设:
var arrayBig = [ [1, "A", "B"], [2, "C", "D"], [3, "E", "F"], [4, "G", "H"] ];
var arraySmall = [ [1, "P", "Q"], [3, "Y", "Z"] ];
使用上述数据,预期结果如下,其中第 1 行和第 3 行被替换:
[ [1, "P", "Q"], [2, "C", "D"], [3, "Y", "Z"], [4, "G", "H"] ];
这是方法:
var arrayBig = [ [1, "A", "B"], [2, "C", "D"], [3, "E", "F"], [4, "G", "H"] ];
var arraySmall = [ [1, "P", "Q"], [3, "Y", "Z"] ];
var mapper = new Map();
arraySmall.forEach((row) => {
mapper.set(row[0], row);
} );
newArrayBig = [];
arrayBig.forEach((row) => {
if ( mapper.has( row[0] ) ) {
newArrayBig.push( mapper.get( row[0] ) );
} else {
newArrayBig.push( row );
}
} );
console.log( newArrayBig );
这假设您有一个铁定的保证,即 in 中的数据行数永远不会多于 in 中的数据行arraySmall
数arrayBig
。您可以(并且应该)添加一些逻辑来测试它,以获得更健壮的代码。
笔记
Map
对象(而不是方法map()
)是这种方法的核心。这个对象提供了一个查找结构:一个索引值,指向一个数据值:
var mapper = new Map();
arraySmall.forEach((row) => {
mapper.set(row[0], row);
} );
在我们的例子中,索引是每arraySmall
行第一个单元格中的数字。它指向的值是该行的完整数据数组,例如:
1 -> [1, "P", "Q"]
3 -> [3, "Y", "Z"]
我们现在可以在遍历数据的每一行时使用此查找arrayBig
数据:
arrayBig.forEach((row) => { ... } );
这个forEach
迭代器内部的逻辑基本上是说:如果地图包含一个与当前行使用相同数字的数组arrayBig
,则使用arraysmall
数据。否则,使用arrayBig
数据。
该newArrayBig.push()
方法将该数组添加到我们的结果数组中。
然后,您可以根据需要将其写回电子表格。
推荐阅读
- finance - 宏观变量滞后的含义(如GDP)
- excel - 如何使用 vba 将大文本文件拆分为具有相同行数的较小文件?
- bash - bash 脚本中的 sed 输出不一致
- tmux - 带有 unicode 字符的 tmux 状态行宽度
- python - 如何在 scipy.optimize.minimize 中隐藏“delta_grad == 0.0”警告?
- javascript - Firestore 和 Vue.js:数据必须是一个对象,但它是:一个自定义对象
- java - 当我想使用 jaxb2 生成 xsd 文件时,如何为所有 java 类指定相同的命名空间?
- excel - 组合框正在改变我在表格中的数字序列的顺序
- video - ffmpeg:不断编码并将base64数据块附加到输出文件中
- java - 为什么在声明浮点变量时需要在十进制数的末尾放置一个“f”?