Я нуждаюсь в некоторой модификации моей функции, чтобы разрешить поиск двух строк в одной строке значения. Я пытаюсь проделать это самостоятельно, но мне нужна помощь. Ниже приведен пример рассматриваемого значения ячейки. Предположим, что нет ведущих или завершающих строк новой строки. Кроме того, все ячейки имеют одинаковый формат. такое же количество строк, одна и та же структура типа члена: последняя, первая и т.д.
Скажем, я хочу посмотреть, содержит ли эта ячейка 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()
поскольку пользователь может вводить строчные значения.
Я предполагаю, что вся строка имеет этот формат.
Если вы разделите каждую строку с разделителем ":"
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;
}
}
array[3]
?
Как насчет создания регулярного выражения с использованием пользовательского ввода?
function search(line, employeeType, employeeName) {
var regexp = '/' + employeeType + ': ' + employeeName + '/'
return line.search(regexp)
}
Или еще лучше, если это всегда происходит в начале строки, просто используйте startWith()
Team Lead
которое может быть не первым рядом с клеткой.