Невозможно использовать INDEX внутри ARRAYFORMULA с динамически определенной последней строкой (VLOOKUP тоже не работает) - PullRequest
0 голосов
/ 16 марта 2019

В этом случае: нелегкий способ указать последний столбец в диапазоне, когда столбцы могут быть добавлены, одновременно допуская постоянно увеличивающееся количество строк.

Дизайн представляет собой электронную таблицу + форму Google, с последующими вкладками / листами, которые выполняют большую часть работы. Форма должна будет со временем меняться, и те вкладки, которые выполняют тяжелую работу, должны постоянно обновляться (для этого требуется некоторый код), так что будет добавлено больше столбцов, и я не хочу, чтобы пользователю приходилось вернитесь, найдите и измените формулы, которые необходимо обновить с учетом новых последних столбцов.

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

Динамическое определение последнего столбца было легко найти, который просто получает список всех номеров столбцов, возвращая наибольшее значение:

=max(filter(column(D1:1),len(D1:1)))

... куда подойдет любая буква столбца. Таким образом, для данной строки вы можете получить данные последнего столбца:

    =index(E3:3,1,max(filter(column(E1:1),len(E1:1)))-4)  
// the "-4" is to offset for the 4th cell in the range.

Но INDEX не работает в ARRAYFORMULA. В поисках помощи есть много ответов, в которых говорится, что в этих случаях следует использовать VLOOKUP, включая ответы, касающиеся динамического номера столбца. Может быть, я упускаю суть, но соответствующий VLOOKUP, AFAIK, это:

=VLOOKUP(E3,E3:3,max(filter(column(E1:1),len(E1:1)))-4)

Который в ARRAYFORMULA (чтобы охватить все строки) выглядит так:

=ARRAYFORMULA(VLOOKUP(E3:E,E3:3,max(filter(column(E1:1),len(E1:1)))-4))

... что не работает, потому что один диапазон строк "E3: 3" остается статическим для всех строк, поэтому я просто получаю результаты для 3-й строки во всех остальных строках.

Но я обнаружил, что могу использовать:

=ARRAYFORMULA(E3:E & ": " & indirect("R3C" & B1 & ":C" & B1,FALSE))
// where B1 is max(filter(column(E1:1),len(E1:1)))

Это объединяет запись в 5-м столбце с ":", а затем с записью в последнем столбце. Спецификатор диапазона «E3: E» в ARRAYFORMULA повторяется для всех строк после третьей, а запись диапазона R1C1 в INDIRECT для R3Cn: Cn (где n - номер последнего столбца) расширяет ARRAYFORMULA вниз по последнему столбцу.

Есть ли лучшее объяснение этого поведения?

Что я делал не так в VLOOKUP? ... насколько я могу судить, VLOOKUP - это способ сделать INDEX в ARRAYFORMULA, но не вижу там решения.

1 Ответ

1 голос
/ 17 марта 2019

, чтобы получить диапазон последнего непустого столбца на основе строки заголовка (1-й строки), вам нужно построить его следующим образом:

=INDIRECT(ADDRESS(1,MAX(FILTER(COLUMN(D1:1),LEN(D1:1))),4)&":"&
 SUBSTITUTE(ADDRESS(1,MAX(FILTER(COLUMN(D1:1),LEN(D1:1))),4),1,""))

тогда вы можете использовать его в VLOOKUP, например:

=ARRAYFORMULA(IFERROR(VLOOKUP(E3:E, 
 {Form!E3:E,INDIRECT(ADDRESS(3,MAX(FILTER(COLUMN(Form!D1:1),LEN(Form!D1:1))),4)&":"&
  SUBSTITUTE(ADDRESS(1,MAX(FILTER(COLUMN(Form!D1:1),LEN(Form!D1:1))),4),1,""))}, 2, 0), ))

, который вернет вам значения последнего столбца, если будет совпадение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...