Почему пересечение массива в таблице 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
. Об этом уже упоминалось в вашем вопросе. В таком случае, как насчет следующего потока? - Для достижения вашей цели я хотел бы предложить следующую схему.
- Из значений "Sheet1" создайте объект для поиска значений столбца "A".
- Из значений "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] : [""]);
}