Как написать формулу поиска для текста в ячейке с учетом регистра?

На самый первый взгляд предо мной встала не самая сложная задача.
Нужно понять какие свойства вписаны в ячейку (Текст разделенный замятыми).
Сложность в том, что некоторые свойства являются частью других свойств. (Ключ - "Ключ" среагирует, и на "Ключ", и на "Ключница", и на "Ключи от домофона".

Написал вот такую функцию

=ИЛИ(ARRAYFORMULA(СОВПАД($K$1;{SPLIT($D2;", ";0;1)})))

Где K2 - свойство, которое пытаемся найти в перечне, D2 - ячейка из столбца, в которой свойства указаны через запятую

Она как бы идеально разбивает, правда ее нужно протягивать, а это уже не есть правильный подход! (Была бы воля, вообще все формулы в 1 ячейку писал)

Тогда я пошел по классическому шаблону формулы массива и как то не работает.

={"Ключ";ArrayFormula(ЕСЛИ(СМЕЩ(B1;1;;СЧЁТЗ(A2:A))<>"";ИЛИ(ARRAYFORMULA(СОВПАД("Ключ";{SPLIT(СМЕЩ(D1;1;;СЧЁТЗ(B2:B));", ";0;1)})))))}


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

Есть у кого мысли, как это правильно записать?

https://docs.google.com/spreadsheets/d/1EWTcSXY6iX...
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
ProgrammerForever
@ProgrammerForever Куратор тега Excel
Учитель, автоэлектрик, программист, музыкант
Если религия позволяет использовать скрипты, то вот такое будет работать:
/**
 * Возвращает true, если value содержится в inData как ключ с разделителем delimiter
 *
 * @param {A:A} inData Исходный массив или одиночная строка
 * @param {"key"} value Значение, которое ищется среди слов
 * @param {1} delimiter Разделитель слов. По умолчанию - ","
 * @return Возвращает true, если inData - одиночное значение или аналогичный массив, если inData - диапазон
 * @customfunction
 */
function isContainText(inData,value,delimiter) {
  var delimiter = delimiter || ",";
  if (inData.map){
    return inData.map(function(el){return isContainText(el,value,delimiter)});
  }else{
    var data = inData.split(delimiter);
    if (!data) return false;
    return data.indexOf(value)!=-1;
  };
}

Использование:
=isContainText(A:A;"Ключ";",")
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы