Почему пересечение массива в таблице Google не работает должным образом? - PullRequest
2 голосов
/ 20 июня 2020

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

3 голосов
/ 20 июня 2020

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

  • Вы хотите добиться результата с помощью «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] : [""]);
}

Результат:

enter image description here

Ссылки :

...