При написании функции, которая получает и преобразует данные из массива текстовых ссылок (например, {"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(MAP(TEXTSPLIT("A1,B1", ","), LAMBDA(a, INDIRECT(a))), LAMBDA(a, a))?
Попробуйте =BYCOL({"A1","B1","AAA","D1048576","E1048577"}, LAMBDA(cellRef, ISREF(INDEX(INDIRECT(cellRef),1)))) уступить {TRUE,TRUE,FALSE,TRUE,FALSE}.
@Михал, спасибо. Находя эти решения, я буду более методичным и терпеливым в дальнейшем. Мне никогда не приходило в голову вызвать TYPE(), но это облегчило бы поиск принятого решения.


Один из способов обработки структурированных ссылок, представленных в виде текста через INDIRECT:
=REDUCE(
"Handle table column refs",
Table3[Col],
LAMBDA(acc, cur, HSTACK(acc, INDIRECT(cur)))
)
Проницательная работа. Это не совсем решает вопрос, но вместо этого дает результат, который я в конечном итоге ищу на этом конкретном этапе моей формулы.
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 решает проблему проще.
=BYCOL({"A1"}, LAMBDA(cellRef, TYPE(cellRef)))возвращает значение 64, которое указывает массив, который может быть вашей отправной точкой.