2017-02-15 3 views
1

Я использую этот код для множественного регулярного выражения в диапазоне ячеек, но он работает слишком медленно. Я знаю, что лучше использовать «push Array» вместо Range.getValue, но я действительно не понимаю, как это работает, и я буду благодарен за любую помощь.Улучшенная функция множественной замены RegEx в диапазоне ячеек

function patternizer(){ 
     var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
     var firstrow = 1 
     var lastrow = 1000 
     var column = 11 
     regexrep(/(|)\d+-\d+/,'',firstrow,lastrow,column); 
     regexrep(/\d{4}-\d{4}/,'',firstrow,lastrow,column); 
     regexrep(/.*?(\D\d.*)/,'$1',firstrow,lastrow,column); 
     regexrep(/(.*\d\D).*/,'$1',firstrow,lastrow,column); 
     regexrep(/[a-zA-Z]{3,}/,'',firstrow,lastrow,column); 
    } 

    function regexrep(rxp,rxR,firstrow,lastrow,column){ 
//(regex pattern, replace pattern, firstrow, lastrow, column) 
     var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
     var r1 = new RegExp(rxp); 
     for (i=firstrow; i<=lastrow; i++){ 
     try{ 
      var tr = ss.getRange(i, column) 
      var t = tr.getValue() 
      t = t.replace(r1, rxR); 
      tr.setValue(t) 
     }catch(e){ 
     } 
     } 
    } 

Данные для теста:

Plate 21410 T15K6 (16h10h3h25) (to end and keyway cutters, reamers and tsekovok) 
Plate 24070 BK8 (10h5h3) (for disk and end-end cylindrical. Mills to modular machine tools) 
Plate 36410 BK8 (16h6h3h18) (for mechanical, slip-and end mills with spiral tooth) 
Knife torts.frez 2020-0161 R6M5 
Knife 2020-0162 for tripartite cutter d100-224h12 (23,8h11h4,72) R6M5 grooved wedge left 
Knife 2020-0164 for tripartite cutter d100-224h14 (23,8h13h4,72) R6M5 grooved wedge left 
Knife 2020-0165 for tripartite cutter d100-125 (23,8h15h4,72) R6M5 grooved wedge right 
Knife 2020-0166 for tripartite cutter d100-125 (23,8h15h4,72) R6M5 grooved wedge left 
Plate 21350 BK8 (14h8h3h25) (to end and keyway cutters, reamers and tsekovok) 
Plate 36390 BK8 (21h6h3h24) (for mechanical, slip-and end mills with spiral tooth) 
Knife 2020-0167 for tripartite cutter d160-250 (28,3h15h5,72) R6M5 grooved wedge right 
Knife 2020-0172 to the end mill d125-315 (28,3h28,5h5,72) R6M5 grooved wedge left 
Cutter veneer. c/x 3 
Knife 2020-0026 to the end mill d160-315 (33,8h25,5h7,72) R6M5 grooved wedge left 
Intermediate ring d16, D27, L 2mm to the mandrel for milling machines GOST15071-75 
Knife 2020-0169 for tripartite cutter d100-315 (28,3h26,5h5,72) R6M5 grooved wedge right 
Knife 2020-0022 to the end mill d80-100 (28,3h18,5h5,72) R6M5 grooved wedge left 
Intermediate ring d16, D27, L10mm to the mandrel for milling machines GOST15071-75 
Intermediate ring d22, D34, L 1mm to the mandrel for milling machines GOST15071-75 
Intermediate ring d22, D34, L 2.0mm to the mandrel for milling machines GOST15071-75 
Intermediate ring d22, D34, L 2.3mm to the mandrel for milling machines 
Intermediate ring d22, D34, L 3mm to the mandrel for milling machines GOST15071-75 
Intermediate ring d22, D50, L 5mm to the mandrel for milling machines 

ответ

1

Я бы очень хотел, чтобы некоторые данные, чтобы проверить это, потому что я не один из тех программистов, которые получает вещи 100% с первого раза. Но вот мое решение для первого прохода, и я думаю, что это сработает.

function patternizer() 
{ 
    var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    var firstrow = 1 
    var lastrow = 1000 
    var column = 11 
    regexrep(/(|)\d+-\d+/,'',firstrow,lastrow,column); 
    regexrep(/\d{4}-\d{4}/,'',firstrow,lastrow,column); 
    regexrep(/.*?(\D\d.*)/,'$1',firstrow,lastrow,column); 
    regexrep(/(.*\d\D).*/,'$1',firstrow,lastrow,column); 
    regexrep(/[a-zA-Z]{3,}/,'',firstrow,lastrow,column); 
} 
//(regex pattern, replace pattern, firstrow, lastrow, column) 
function regexrep(rxp,rxR,firstrow,lastrow,column){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //Ranges start at1 
    var rng = ss.getRange(firstrow,column,lastrow,1); 
    var rngA = rng.getValues(); //[[],[],[],[],....] Arrays start at zero 
    var r1 = new RegExp(rxp); 
    for(i = 0;i < lastrow;i++) 
    { 
    rngA[i][0]=rngA[i][0].replace(r1, rxR);//you might need a toString() in here before the replace. Give me some data and I can check it out. 
    } 
    rng.setValues(rngA); 
} 

Дайте мне знать, как это работает.

+0

Здравствуйте, @Cooper! Как вы говорите, я добавляю toString() перед заменой, и он отлично работает! 5000 строк и 15 регулярных выражений за 21 секунду. Вместо этого более 6 минут со старой функцией. Добавьте данные к вопросу, чтобы вы могли проверить его. Спасибо огромное! – Davagaz

+0

Мы могли бы сбрить немного больше, если бы смогли придумать простой способ получить регулярное выражение там, где находится Array. Но 21 секунда против 360 секунд, что неплохо. У меня были электронные таблицы, которые занимали несколько минут, и в первый раз я пошел с использованием массивов, которые они, похоже, обрабатывают мгновенно. Так что это большая экономия времени. – Cooper

+0

Спасибо за данные. Мне всегда нравится видеть, как работают мои игрушки – Cooper

Смежные вопросы