Поиск массива для строки, когда значения имеют разрывы строк

1

У меня есть поля для ввода и ввода пользовательской формы HTML, для ввода которых мне нужно выполнить поиск внутри строки в листах google.

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

Вот как выглядит камера.

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

У меня есть следующая функция, которая отлично справляется с поиском через ячейки и возвращает значения, которые мне не нужны в массиве, который я могу использовать с .setHiddenValues() при фильтрации.

function getHiddenValueArray(colValueArr,visibleValueArr){
  //colValueArr = SpreadsheetApp.getActive().getSheetByName('Monthly_Detail').getRange(2,64,359,1).getValues();    
  //visibleValueArr = ['last1']; //In this case user will only input 1 name
  //strictLevel = 'lenient'

  //will find a match within a cell
    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;
      })));
    });
    Logger.log(colValueArr); 
    Logger.log(flatUniqArr); 
    return flatUniqArr;
  }

Я считаю, что причина, по которой эта функция не работает, связана с 3-мя разрывами строк и одной разрывной строкой в данных ячейки.

Вот мои вопросы:

  • Я все еще новичок, и RegEx по-прежнему очень чуждо мне. Есть ли способ использовать регулярное выражение для обхода переломов ведущей и задней линий, чтобы остальная часть функции работала? Я удалил некоторые операции с ручным управлением и фильтрацией на этих ячейках.
  • Как я могу найти его для типа пользователя: first или Member Type: last?

Я в порядке с третьим, если в этом случае, если нужно, с дополнительной переменной для типа члена.

Разъяснения:

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

Примечания от комментариев:

  • Журналы показывают, что функция правильно исключает те, которые соответствуют тому, что я в конечном итоге хочу фильтровать в столбце. Это заставляет меня думать, что проблема заключается в том, что .setHiddenValues с .setHiddenValues символами или листами Google не может фильтровать ячейки, у которых есть символы новой строки.
  • Чтобы проверить вышеизложенное, я удалил flatUniqArr строки из flatUniqArr используя flatUniqArr[i]= flatUniqArr[i].replace(/(\r\n|\n|\r)/gm,""); в петле. Журналы показывают эту отмененную строку перевода. Тем не менее, по-прежнему нет. Это сужает его до листов Google, которые не могут фильтроваться на ячейках с новыми символами.
  • 1
    Эти данные очень большие? Если оно маленькое, вы можете разбить строки и отфильтровать результаты, как в столбцах: 'string|with|breaks|||'.split('|').filter(item => !!item) .
  • 0
    Поиск строки с несколькими символами новой строки довольно прост в регулярных выражениях, \n+ означает поиск по крайней мере одной новой строки, за которой следует любое количество больше, \n* означает 0 или более новых строк.
Показать ещё 6 комментариев
Теги:
google-apps-script

1 ответ

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

Эта проблема:

Оказывается, хотя .setHiddenValues() будет принимать массивы со строками, которые имеют в них .setHiddenValues() строки, листы google не позволят этим строкам применяться при фильтрации столбцов.

Решение:

Удалите новые строки из ячеек, которые у них есть. В моем случае это было в столбце, поэтому я использовал цикл for для trim() каждого значения. Я использовал обрезку, потому что проблема связана только с ведущими и завершающими символами новой строки. Если это помогает кому-то еще, то это код:

var teamArr = new Array()
var teamArr = sht.getRange(teamCS + '2:' + teamCS + lastRow).getValues().map(function (row) { return row.map(function (val) { return val.toString().trim(); }); });

sht.getRange(teamCS + '2:' + teamCS + lastRow).setValues(teamArr);

Обновлен до версии tehhowch быстрее для комментария.

  • 1
    var teamArr = sht....getValues().map(function (row) { return row.map(function (val) { return val.toString().trim(); }); }); setValues(teamArr) ваш 2D-массив, чтобы вы могли использовать setValues(teamArr) вместо медленного по-одному.
  • 0
    @tehhowch Отлично. Благодарю. Это хорошо работает. Я обновил свой пост, чтобы включить ваше более быстрое решение.

Ещё вопросы

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