Могут ли функции Lambda использовать текстовые ссылки, переданные из функции ByCol?

При написании функции, которая получает и преобразует данные из массива текстовых ссылок (например, {"ref1", "ref2", ...}), я обнаружил следующую проблему.

=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(cellRef)))

Возврат

FALSE

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

Я не могу отказаться от перебора текстовых ссылок, поскольку настоящие ссылки — это столбцы таблицы (например, table1[A], table2[A], ...), хранящиеся в одномерном массиве. Сначала я попытался заменить структурированные ссылки простой нотацией A1, но это был лишь промежуточный шаг к вышеупомянутой проблеме — ISREF() в пределах BYCOL(...Lambda(...)) возвращает FALSE.

Я пробовал использовать INDIRECT(), T(), INDEX() и CELL() различными (возможно, глупыми) способами, включая:

=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(cellRef))))
=BYCOL({"A1"}, LAMBDA(cellRef, INDIRECT(ISREF(cellRef))))
=BYCOL({"INDIRECT(A1)"}, LAMBDA(cellRef, ISREF(cellRef)))
=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(T(cellRef)))))
=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(CELL("address", cellRef))))
=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(CELL("address", cellRef)))))
=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(CELL("address", cellRef))))
=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDEX(cellRef, 1))))
=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDEX(cellRef, 1, 1))))
=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDEX(cellRef, 0))))

Но все они оцениваются в FALSE. Обратите внимание, что последние несколько попыток использования INDEX() по-прежнему терпят неудачу. Я надеялся этот ответ поможет.

Если для совместной работы этих функций требуется какой-то уникальный синтаксис или какая-то логика, которая не позволяет вам перебирать ссылки таким образом, дайте мне знать.

=BYCOL({"A1"}, LAMBDA(cellRef, TYPE(cellRef))) возвращает значение 64, которое указывает массив, который может быть вашей отправной точкой.
Michal 25.08.2024 02:38

Эй, не могли бы вы предоставить более подробную информацию? Мне интересно, можем ли мы каким-то образом использовать структурированные ссылки. Кстати, а ты пробовал =BYCOL(MAP(TEXTSPLIT("A1,B1", ","), LAMBDA(a, INDIRECT(a))), LAMBDA(a, a))?

nkalvi 25.08.2024 02:46

Попробуйте =BYCOL({"A1","B1","AAA","D1048576","E1048577"}, LAMBDA(cellRef, ISREF(INDEX(INDIRECT(cellRef),1)))) уступить {TRUE,TRUE,FALSE,TRUE,FALSE}.

VBasic2008 25.08.2024 03:44

@Михал, спасибо. Находя эти решения, я буду более методичным и терпеливым в дальнейшем. Мне никогда не приходило в голову вызвать TYPE(), но это облегчило бы поиск принятого решения.

Façade 25.08.2024 06:36
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
4
59
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Один из способов обработки структурированных ссылок, представленных в виде текста через INDIRECT:

  • Таблица 1 и Таблица 2 содержат данные.
  • Таблица 3 содержит имена столбцов из приведенного выше.
=REDUCE(
    "Handle table column refs",
    Table3[Col],
    LAMBDA(acc, cur, HSTACK(acc, INDIRECT(cur)))
)

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

Façade 25.08.2024 06:27
Ответ принят как подходящий

Проверьте массив на наличие действительных ссылок на диапазон

  • Вам просто не хватило INDIRECT в последних трёх формулах.

Жестко запрограммировано

  • Вы могли бы использовать...

    =BYCOL({"A1"}, LAMBDA(cellRef,ISREF(INDEX(INDIRECT(cellRef),1))))
    

    ... или более очевидно

    =BYCOL({"A1","B1","AAA","D1048576","E1048577"},LAMBDA(cellRef,ISREF(INDEX(INDIRECT(cellRef),1))))
    

    ... уступая

    {TRUE,TRUE,FALSE,TRUE,FALSE}
    

Динамический

=A2:A3&"["&B1:G1&"]"                    
=MAP(B2:G3,LAMBDA(cellRef,ISREF(INDEX(INDIRECT(cellRef),1))))                   
or:
=MAP(B2#,LAMBDA(cellRef,ISREF(INDEX(INDIRECT(cellRef),1))))                 

Ни один ответ не объясняет, что не так в ваших формулах.

Второе ваша формула почти верна, просто нужно заменить BYCOL на MAP:

=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(cellRef))))
-->
=MAP({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(cellRef))))

Проблема в том, что BYCOL предоставляет массив значений для каждого исходного элемента:

{"A1","B1","AAA","D1048576","E1048577"}
-->
{"A1"}
{"B1"}
{"D1048576"}
{"E1048577"}

таким образом, ISREF(INDIRECT(cellRef)) возвращает ЛОЖЬ.

Эту проблему можно решить с помощью INDEX, который берет элемент из массива.

=BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(INDEX(cellRef,1)))))

Очевидно, MAP решает проблему проще.

Другие вопросы по теме