Как найти первую ячейку в строке, где значение не пустое, и проверить, меньше или равно числу в другой ячейке
у меня есть следующая таблица Google:
item have ready need1 need2 need3
A 1 2 1
B 1 2 1 1
C 2 2
etc
Я хочу, чтобы заполнить следующим образом:
- найти первый столбец в need1,..., needN диапазон, который имеет непустое значение
- если найденное значение меньше или равно значению в
3 ответов
если вы знаете, сколько нужно столбцов, или даже просто сколько столбцов на листе, это довольно просто. Если нет, и вам нужно посмотреть на всю строку, вам может потребоваться немного изменить дизайн, чтобы избежать круговой ссылки из ячейки с формулой, являющейся частью этой строки.
ваши вторые два шага довольно просты в любом случае - вы хотите один из двух результатов, основанных на условии, поэтому вы захотите использовать =IF
. Ваше условие в том, что "потребность" число меньше или равно числу "иметь", и вы хотите, чтобы оно сказало "Да", если это правда, и ничего, если это не так. Итак, что дает нам:
=IF(need<=have,"Yes","")
в примерах ниже предположим, что ваша таблица выше начинается с ячейки A1 в левом верхнем углу, и что последний столбец в вашем листе Z
Далее нам нужно найти "нужно" и "есть". Найти их довольно легко - это просто число в столбце B.
Поиск "need" немного больше сложный. У вас есть правильная идея, используя INDEX
и FILTER
, но ваша формула кажется немного перемудрили. В основном мы можем использовать FILTER
отфильтровать пустые значения и INDEX
чтобы найти первый, который остался. Во-первых, FILTER
:
диапазон, который вы хотите отфильтровать, - это все в одной строке от столбца D до столбца Z (или независимо от конечного столбца), и условие, которое вы хотите отфильтровать, заключается в том, что эти же ячейки не пустые. По формуле ты набрав в ячейку C2, что дает нам:
=FILTER(D2:Z2,D2:Z2<>"")
далее INDEX
: если вы даете INDEX
массив, номер строки и номер столбца, он скажет вам, что находится в этой ячейке, где встречаются эта строка и столбец. Поскольку мы отфильтровали пробелы, нам просто нужно все, что осталось в первом столбце нашего отфильтрованного массива, что дает нам:
=INDEX(FILTER(D2:Z2,D2:Z2<>""),1,1)
или, поскольку у нас есть только одна строка в нашем массиве, и INDEX
довольно умная, просто:
=INDEX(FILTER(D2:Z2,D2:Z2<>""),1)
Итак, чтобы принести его все вместе, наша окончательная формула для ячейки С2:
=IF(=INDEX(FILTER(D2:Z2,D2:Z2<>""),1)<=B2,"Yes","")
затем просто перетащите формулу вниз на столько строк, сколько вам нужно. Если ваш лист или становится шире, просто измените Z на любой ваш последний столбец.
когда вы не знаете размер диапазона, используйте функции row
, column
, rows
, columns
.
простой формуле
вот пример того, что вы ищете:
=if(INDEX(FILTER(OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1),OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1)<>""),1)<=B2,"yes","")
эта часть формулы:
OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1)
возвращает диапазон, начинающийся с заданной ячейки (D2
) до конца листа (COLUMNS(1:1)-column(D2)+1
)
ArrayFormula
Я предлагаю использовать ArrayFormula, он будет расширяться автоматически:
=ARRAYFORMULA(if(REGEXEXTRACT(SUBSTITUTE(trim(transpose(query(transpose(OFFSET(D2,,,COUNTA(A2:A),COLUMNS(1:1)-column(D2)+1)),,COLUMNS(OFFSET(D2,,,COUNTA(A2:A),COLUMNS(1:1)-column(D2)+1)))))," ",", "),"\d+")*1<=OFFSET(B2,,,COUNTA(A2:A)),"yes",""))
предполагается, что столбец "Item" не имеет пустых значений.
решение от @Max Makhrov работает и имеет преимущество использования одной формулы для всей колонки.
Однако предполагается, что все ваши столбцы справа от вашего ready
столбец (D) будет need_
столбцы.
решение от @dmusgrave также работает, если вы удалите дополнительный " = " перед INDEX
:
=IF(INDEX(FILTER(D2:Z2,D2:Z2<>""),1)<=B2,"Yes","")
.
Однако он делает то же предположение, а также ограничивает столбец Z.
такие предположения кажутся разумными, но если они ограничивая вас, вот как вы можете иметь любое количество need_
столбцы, начинающиеся справа от вашего :
=IF(INDEX(FILTER(INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:, 4)="need")))&row() ), INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:,4)="need")))&row() )<>""),1)<=B2,"Yes","")
идея просто заменить D2:Z2
(в решении @dmusgrave) по :
INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:, 4)="need")))&row() )
объяснение: вы начинаете С D в текущей строке, и вы идете до последнего need_
столбец в той же текущей строке.
CHAR(68)
и D
, к которому вы добавляете количество столбцов под названием need.*
минус один (отсюда и 67).
используя ту же логику, вы можете легко сделать свою формулу более надежной / общей, например, не имея need_
начиная столбцы правильную форму и т. д.