2

这是我第一次使用谷歌电子表格,我正在尝试在函数中完成一些事情。我知道它是 javascript(我并不完全熟悉的一种语言)。我试图从两个表中获取一个范围,并获取每个表的交点位置,并为已经存在的行填充缺失值。

例如,假设以下两张纸:

Sheet1
+-----------+----------+--------+---------+
|   Fruit   |  Color   | Weight | isApple |
+-----------+----------+--------+---------+
| Banana    | Yellow   |      3 | no      |
| Orange    | Orange   |      3 | no      |
| Apple     | Red      |      2 | yes     |
| Pineapple | Brownish |      5 | no      |
+-----------+----------+--------+---------+
Sheet2
+-----------+----------+--------+---------+
|   Fruit   |  Color   | Weight | isApple |
+-----------+----------+--------+---------+
| Banana    |          |        |         |
| Apple     |          |        |         |
| Pear      |          |        |         |
| Watermelon|          |        |         |
+-----------+----------+--------+---------+

我想找到 Fruit 行的交叉点,并填写我们知道的每一个的颜色、重量和 isApple。

我写了一些我认为应该努力获得 的交集的东西range1,并且由于某种原因它返回一个空数组。当我在 Apps 脚本编辑器中测试它时,它似乎工作正常。

//assuming range1 = Sheet1!A2:A5 and range2=Sheet2!A2:A5
function intersection(range1, range2) {
  var i = 0;
  var j = 0;
  var matches = new Array();

  while(i < range1.length){
    if(range2.toString().includes(range1[i].toString())){
      matches.push(i);
    }
    i++
  }
  return matches;
}

我希望这会返回一个数组,[0,2]因为第 0 个元素 Banana 和 Sheet1 中的第一个元素 Apple 存在于表 2 中。

然后,我将使用该数据从 Sheet2 中的信息中填充 Apple 和 Banana 的行。

我还没有进入第二部分,因为我似乎无法让工作表找到交叉点。

我的最终目标预期输出是将工作表 2 更改为:

Sheet2
+-----------+----------+--------+---------+
|   Fruit   |  Color   | Weight | isApple |
+-----------+----------+--------+---------+
| Banana    | Yellow   |      3 | no      |
| Apple     | Red      |      2 | yes     |
| Pear      |          |        |         |
| Watermelon|          |        |         |
+-----------+----------+--------+---------+
4

1 回答 1

3

我相信你的目标如下。

  • 如您的问题所示,您希望从“Sheet1”和“Sheet2”中获得结果。
  • 您想使用自定义函数来实现这一点。

为此,这个答案怎么样?

修改点:

  • 在您的脚本中,我认为您正在使用=intersection(Sheet1!A2:A5,Sheet2!A2:A5). 在这种情况下, 和 的参数是 和,它们range1分别是二维数组。即,工作表上的值被发送到参数。为了实现您的目标,我想建议使用自定义功能,例如. 这样,“Sheet1”中的值可以在自定义函数中使用。range2function intersection(range1, range2) {[["Banana"],["Orange"],["Apple"],["Pineapple"]][["Banana"],["Apple"],["Pear"],["Watermelon"]]=intersection(Sheet1!A2:D5,Sheet2!A2:A5)
  • 在您的脚本中, 的值[0,2]被检索为matches. 这是 的索引range1。但在这种情况下,还需要知道与 匹配的索引range2。这已经在你的问题中提到了。在这种情况下,下面的流程怎么样?
  • 为了实现您的目标,我想提出以下流程。
    1. 根据“Sheet1”的值,创建一个用于搜索“A”列值的对象。
    2. 根据“Sheet2”的值,使用创建的对象创建结果数组。

以上流程反映的示例脚本如下。

示例脚本:

请复制并粘贴以下脚本,并将自定义函数输出=intersection(Sheet1!A2:D5,Sheet2!A2:A5)到“Sheet2”的单元格“B2”中。这样,就获得了您在问题底部显示的结果。

function intersection(values1, values2) {
  const obj = values1.reduce((o, [a, ...bcd]) => Object.assign(o, {[a]: bcd}), {});
  return values2.map(([a]) => obj[a] ? obj[a] : [""]);
}

结果:

在此处输入图像描述

参考:

于 2020-06-20T08:06:42.870 回答