ArrayFormula a Фильтр в объединении (таблицы Google)
Я провел долгий поиск и не смог найти то, что я ищу. Может быть, кто-то может помочь?
У меня есть эта формула в моей электронной таблице Google (я объясню, что она делает ниже):
=Join(" ",FILTER(Sheet1!B:B;Sheet1!A:A=A1))
На листе 1 приведена таблица: столбец A - это первые имена (например, "Джеймс"), а столбец B - некоторый комментарий (например, "головная боль"). У Джеймса (или любого другого) может быть несколько рядов с разными комментариями в каждом (например, у Джеймса есть 2 ряда, один из которых говорит "Головная боль", а другой - "Боль в колене".)
На листе 2, столбец A, у меня есть список имен, которые появляются в Sheet1 (используя формулу '=UNIQUE'). А1 говорит "Джеймс". В ячейку B1 вводим приведенную выше формулу.
Результат - почти то, что я хочу. Он объединяет все комментарии Джеймса в одну ячейку с пробелом " " между каждым комментарием. Таким образом, результат в ячейке B1: "Головная боль, боль в колене".
Тем не менее, я должен перетащить эту формулу во все ячейки ниже. Кто-нибудь знает, как я могу сделать это, как и все другие ArrayFormulas, которые я использовал в прошлом, где формула автоматически заполняет все ячейки ниже? Я попытался сделать это формулой массива, но безуспешно.
Я также играл с этой формулой, которая дает мне тот же результат "Головная боль, боль в колене", но формула все равно не будет копироваться в ячейки ниже.
=SUBSTITUTE(Arrayformula(concatenate(FILTER(Sheet1!B:B;Sheet1!A:A=A1)&" "; "|"));" |";"")
Если кто-нибудь знает, как этого добиться, я буду очень признателен - ваша ценная помощь будет высоко оценена.
Спасибо за внимание!
3 ответа
Обычно немного сложно применять агрегирующую функцию, такую как CONCATENATE, строка за строкой.
=ArrayFormula(TRIM(TRANSPOSE(SPLIT(CONCATENATE(REPT(TRANSPOSE(Sheet1!B:B&" ");A:A=TRANSPOSE(Sheet1!A:A))&REPT(" "&CHAR(9);TRANSPOSE(ROW(Sheet1!A:A))=ROWS(Sheet1!A:A)));CHAR(9)))))
(редактировать: извинения У меня не было возможности проверить на наличие ошибок / опечаток, удалите эту строку, если вы можете подтвердить, что она работает)
Я знаю, что вопрос слишком старый, но чтобы решить проблему при удалении строки, вам нужно изменить ее на: =ArrayFormula(TRIM(TRANSPOSE(SPLIT(CONCATENATE(REPT), TRANSPOSE(Sheet1!B:B&" "));filter (A: A, A: A<> "")= TRANSPOSE (Sheet1! A: A)) & REPT ("" & CHAR (9); TRANSPOSE (ROW (Sheet1! A: A)) = ROWS (Sheet1! A: A))); СИМ (9)))))
Вместо обходных хаков я реализовал простойjoinMatching(matches, values, texts, [sep])
функция в скрипте Google Apps .
В вашем случае это будет просто
=joinMatching(A1:A, Sheet1!A1:A, Sheet1!B1:B, " ")
.
Источник:
// Google Apps Script to join texts in a range where values in second range equal to the provided match value
// Solves the need for `arrayformula(join(',', filter()))`, which does not work in Google Sheets
// Instead you can pass a range of match values and get a range of joined texts back
const identity = data => data
const onRange = (data, fn, args, combine = identity) =>
Array.isArray(data)
? combine(data.map(value => onRange(value, fn, args)))
: fn(data, ...(args || []))
const _joinMatching = (match, values, texts, sep = '\n') => {
const columns = texts[0]?.length
if (!columns) return ''
const row = i => Math.floor(i / columns)
const col = i => i % columns
const value = i => values[row(i)][col(i)]
return (
// JSON.stringify(match) +
texts
.flat()
// .map((t, i) => `[${row(i)}:${col(i)}] ${t} (${JSON.stringify(value(i))})`)
.filter((_, i) => value(i) === match)
.join(sep)
)
}
const joinMatching = (matches, values, texts, sep) =>
onRange(matches, _joinMatching, [values, texts, sep])```