首页 > 解决方案 > 使用 Google Apps 脚本替换数组中的行

问题描述

我仍然对 Apps 脚本有所了解,只需要一些帮助来编辑数组。

所以我有两个数组:

var arrayBig = SpreadsheetApp.getSheetByName('Big').getDataRange().getValues();

var arraySmall = SpreadsheetApp.getSheetByName('Small').getDataRange().getValues();

我想arrayBig根据 中的值替换特定行arraySmall,然后将该数组写回我的电子表格(我可以接受的最后一部分)。

这两个数组的列数相同,但arraySmall行数更少。

要替换的行:

因此,如果第 1 列中的值 = 3,则将第 3 行替换为第 1 列= 3 所在arrayBig行的内容arraySmall

我认为答案与地图方法有关,但我不明白。只是一些让我开始的指示将不胜感激,谢谢。

标签: arraysgoogle-apps-scriptgoogle-sheetsarray-map

解决方案


这是一种“让你开始”的方法:

你描述了你的数据,但你没有提供任何具体的样本——所以这是我的起始数据,根据问题中的信息做出一些假设:

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 中的数据行arraySmallarrayBig。您可以(并且应该)添加一些逻辑来测试它,以获得更健壮的代码。

笔记

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()方法将该数组添加到我们的结果数组中。

然后,您可以根据需要将其写回电子表格。


推荐阅读