Поиск строки между двумя символами, если рядом с определенной строкой

1

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

Изображение 174551

Скажем, я хочу посмотреть, содержит ли эта ячейка team lead с именем last2 или Manager с именем first4. И тип сотрудника, и имя будут введены пользователем.

Я попытался использовать следующее, которое я создал с помощью этого.

indexOf(':(.*):')

Он возвращает позицию содержимого между двоеточиями и включая их. Затем я попробовал следующее:

flatUniqArr[0].search('Supervisor:')

Здесь я застрял. Он возвращает индекс к последней цифре первой строки.

Моя мысль заключалась в том, чтобы выполнить поиск введенного пользователем имени между двоеточиями, если они следуют за введенным пользователем типом элемента. Как я могу это сделать?

Пояснения. Конечной целью является проверка того, что имя и тип члена находятся в одной строке и исключены из массива, который я .setHiddenValues() для .setHiddenValues(). Поэтому, если они в одной строке исключены из списка.

Вот функция, которую я добавлю:

var flatUniqArr = colValueArr.map(function(e){return e[0].toString();})
.filter(function(e,i,a){
  return (a.indexOf(e) == i && !(visibleValueArr.some(function(f){
    return e.search(new RegExp(f,'i')) + 1;
  })));
});
return flatUniqArr;

Где flatUniqArr - это список скрытых значений. colValueArr - это массив значений из столбца. visibleValueArr - это имя, которое вводится пользователем, а memberType будет типом участника.

Попытки использовать решение Liora: (Обновлено... Работает сейчас)

var flatUniqArr = []
var lines = []
Logger.log(visibleValueArr)
Logger.log(memberType)
for (var i = 0; i < colValueArr.length; i++){
  lines = colValueArr[i].toString().split('\n');
  var found = false;
  for(var j = 0; j < lines.length; j++){
    var data = lines[j].toLowerCase().split(':')
    if(data[0] == memberType.toString().toLowerCase() && data[1].indexOf(visibleValueArr.toString().toLowerCase()) != -1){
      found = true;
    }
  }
  Logger.log(found)
  if(found == false){flatUniqArr.push(colValueArr[i])} 
}

return flatUniqArr;

Он работает сейчас. Однако, похоже, много кода. Я был бы готов к альтернативным решениям, если бы они были быстрее и/или меньше строк кода.

Обновлено: Добавлено .toString().toLowerCase() поскольку пользователь может вводить строчные значения.

  • 0
    Что вы на самом деле хотите? Имя человека, занимающего должность? Должность человека с определенным именем?
  • 0
    @Luca Лука Я обновил свой вопрос с дополнительной информацией. Дайте мне знать, если это поможет ответить на ваш вопрос. по сути, я просто хочу знать, существует ли он в этой ячейке, чтобы игнорировать его из списка, который я строю.
Теги:
google-apps-script

2 ответа

1
Лучший ответ

Я предполагаю, что вся строка имеет этот формат.

Если вы разделите каждую строку с разделителем ":"

var array = value.split(":")

Тогда у вас будет

array[0] //the current role
array[1] //the list of name
array[2] //the email

И вы можете проверить каждое имя, затем

if(array[0] == "Team Lead" && array[1].indexOf("last2") != -1)

Пример с линией строк:

var lines = value.toString().split("\n");
var found = false;
for(var i = 0; i < lines.length ; i++){
    var data = value.split(":")
    if(data[0] == "Team Lead" && data[1].indexOf("last2") != -1){
         found = true;
    }
}
  • 0
    Да, все ячейки имеют одинаковый формат. Все линии имеют одинаковую структуру.
  • 0
    Будет ли это работать с ячейкой, которая имеет несколько строк? Поместит ли он текущую роль второй строки в array[3] ?
Показать ещё 12 комментариев
1

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

function search(line, employeeType, employeeName) {
    var regexp = '/' + employeeType + ': ' + employeeName + '/'
    return line.search(regexp)
}

Или еще лучше, если это всегда происходит в начале строки, просто используйте startWith()

  • 0
    Это не всегда происходит в начале строки. Все линии находятся в одной ячейке. Возможно, я спрашиваю о Team Lead которое может быть не первым рядом с клеткой.
  • 0
    В этом случае оригинальное решение регулярных выражений должно быть в порядке. Из вашего описания пользователь указывает тип и имя сотрудника, поэтому мы можем просто выполнить поиск employeeType: employeeName в каждой строке или с помощью многострочного флага.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню