Почему пересечение массива в таблице Google не работает должным образом?

Я впервые использую электронные таблицы Google, и я пытаюсь добиться чего-то в функциях. Я знаю, что это 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, и по какой-то причине возвращает пустой массив. Когда я тестирую это в редакторе скриптов приложений, все работает нормально.

//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 и 1-й элемент Apple из Sheet1 существуют на листе 2.

Затем я использовал бы эти данные для заполнения строк для Apple и Banana из информации в Sheet2.

Я еще не на этой второй части, так как я не могу получить лист даже, чтобы найти пересечение.

Ожидаемый результат моей конечной цели будет заключаться в том, что Лист 2 будет изменен на:

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

1 ответ

Я считаю вашей целью следующее.

  • Вы хотите добиться результата от "Sheet1" и "Sheet2", как показано в вашем вопросе.
  • Вы хотите добиться этого с помощью специальной функции.

Для этого как насчет этого ответа?

Пункты модификации:

  • В вашем скрипте я думал, что вы используете настраиваемую функцию =intersection(Sheet1!A2:A5,Sheet2!A2:A5). В этом случае аргументыrange1 а также range2 из function intersection(range1, range2) { являются [["Banana"],["Orange"],["Apple"],["Pineapple"]] а также [["Banana"],["Apple"],["Pear"],["Watermelon"]], которые представляют собой двумерные массивы соответственно. А именно, значения на листе передаются аргументам. Для достижения вашей цели я хотел бы предложить использовать настраиваемую функцию, например=intersection(Sheet1!A2:D5,Sheet2!A2:A5). Таким образом, значения из Sheet1 можно использовать в пользовательской функции.
  • В вашем скрипте значение [0,2] извлекается как matches. Это показателиrange1. Но в этом случае необходимо также знать индексы, соответствующиеrange2. Об этом уже упоминалось в вашем вопросе. В таком случае, как насчет следующего потока?
  • Для достижения вашей цели я хотел бы предложить следующую схему.
    1. Из значений "Sheet1" создайте объект для поиска значений столбца "A".
    2. Из значений "Sheet2" создайте массив результатов, используя созданный объект.

Пример сценария, отраженный выше, выглядит следующим образом.

Пример сценария:

Скопируйте и вставьте следующий скрипт и извлеките пользовательскую функцию =intersection(Sheet1!A2:D5,Sheet2!A2:A5)в ячейку "B2" на "Sheet2". Таким образом, будет получен результат, который вы указали в конце вашего вопроса.

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

Результат:

Ссылки:

Другие вопросы по тегам