Как найти и заменить список строк в электронной таблице с помощью скрипта Google

Предметы, которые у меня есть: большой список A строк в столбце A (несортированный)

name1 pattern1 pattern4
name5 pattern2
name4 pattern4
name2 pattern3 pattern1
name4 pattern4

Большой список B различных строковых шаблонов, которые я хочу удалить из строки в столбце A (включая знаки препинания и специальные символы)

pattern1
pattern2
pattern3

Как только я сравниваю каждый шаблон в B со строкой в ​​A, он должен выводить:

name1 pattern4
name5
name4 pattern4
name2
name4 pattern4

Теперь у меня 2 трудности. У меня очень простой тестовый код, предполагая, что в списке только 1 шаблон, программа выполнилась без ошибок, однако в моей электронной таблице Google ничего не происходит, и я не могу объяснить, почему

function removeS(){
    var sheet = SpreadsheetApp.getActiveSheet();
    var range = sheet.getRange("A1:A");
    var data = range.getValues();
    for(i in data){
        data[i].toString().replace(pattern,"");
    }
}

Также, во-вторых, могу ли я выполнить свою задачу, не выполняя вложенный цикл? (Один цикл через все в столбце A и другой цикл для списка шаблонов) Это кажется таким неэффективным, поскольку я имею дело с большими данными. В макросе Excel вы можете делать что-то вроде:

With ActiveSheet.UsedRange
.Replace pattern1, ""
.Replace pattern2, ""

и заботится о необходимости использования вложенных циклов, хотя для добавления шаблонов требуется ручная работа.


person user3299010    schedule 11.02.2014    source источник
comment
это интересный вопрос и хорошо заданный ... thx & +1. Вы упомянули, что ваши шаблоны могут включать знаки препинания и специальные символы, но являются ли эти шаблоны фиксированными или это переменные, которые сценарий должен идентифицировать и обрабатывать автоматически? Как вы, наверное, знаете, метод замены - не самый терпимый инструмент ;-)   -  person Serge insas    schedule 12.02.2014
comment
pattern не определено   -  person Bryan P    schedule 12.02.2014
comment
На данный момент я предполагаю, что все эти шаблоны исправлены, и их можно просто вручную передать в виде строк, таких как .com, a & b и т. Д. Я могу попробовать регулярное выражение для упрощения, как только я получу всю структуру, что я не знаю, все усложнит.   -  person user3299010    schedule 12.02.2014


Ответы (1)


Вот вариант. Хотя я не уверен, что это более красноречивый способ, чем вложенные циклы, без преобразования возвращаемых значений электронной таблицы из массива 2d в массив 1d.

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

function cleanMe(){
    var sheet = SpreadsheetApp.getActiveSheet();
    var range = sheet.getRange("A1:A" + sheet.getLastRow());
    var data = range.getValues();

// get the array of patterns (all ranges returned as 2d array)
// because .getLastRow() or .getDataRange returns the last row in the spreadsheet with data
// not the last row of the range with data
// hardcoded the last row in column be so as not to 
// have to use conditions to check if values exist in range
    var patternLastRow = 3;
    var patterns = sheet.getRange("B1:B" + patternLastRow).getValues();

// 2d array to replace data in row A using range.setValues(newRange)
    var newRange = []; 

    for(var i = 0; i < data.length; i++){
    // use encodeURIComponent to contend with special charactes that would need escaping
     var newValue =  encodeURIComponent(data[i][0].toString());
      for(var p = 0; p < patterns.length; p++){
        var pattern = encodeURIComponent(patterns[p][0]);
        var index = newValue.indexOf(pattern);
        if(index >=0){
         newValue = newValue.replace(pattern,'');
         }
      }
      newRange.push([decodeURIComponent(newValue)]);
    }

    range.setValues(newRange);
}
person Cyrus Loree    schedule 12.02.2014