Regexp Матч Google Script внутри al oop? - PullRequest
2 голосов
/ 30 марта 2020

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

Итак, у меня есть список текста, и я хочу узнать, есть ли в каждой ячейке одно из регулярных выражений из другого листа. Если да, вставьте регулярное выражение рядом с текстом.

Пример: Для первого ряда: 7063 BIO PL ANET LIEGE. -> Я бы хотел написать «BIO PL ANET» в ячейке справа. (Потому что BIO PL ANET является одним из регулярных выражений для проверки из второго листа).

enter image description here

enter image description here

Я написал что-то подобное, но не смог понять, что именно необходимо исправить:

function ExpenseMatching() {
  
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet1 = spreadsheet.getSheetByName("Import2");
  var sheet2 = spreadsheet.getSheetByName("Regular Expression");



 for ( i =1; i<24 ; i++)
 
 { 
//Browser.msgBox(i)

   var test1 = sheet2.getRange("A"+ i);
   var test2 = sheet1.getRange("A2");



      var test = new RegExp(test1).test(test2); 

 
 if (regexp==true)
 
                        { 
                          test1.copyTo(sheet1.getRange("I2"));
                   

                        Browser.msgBox(test)
                          
                         }     
                         
                         
                         else 
                         
                         {
                   
                         
       
                         }

}
     


}

Спасибо заранее за вашу помощь, ребята!

1 Ответ

3 голосов
/ 31 марта 2020
  • Требуется получить значения столбца «А» на листе Import2 и значения столбца «А» на листе Regular Expression.
  • Требуется проверить включает ли значение Import2 значения Regular Expression. Когда значения Import2 включают значения Regular Expression, вы хотите поместить значение Regular Expression в столбец «B» на Import2.
  • Вы хотите добиться этого с помощью Google Apps Сценарий.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки модификации:

  • В вашем скрипте
    • if (regexp==true) не работает и ошибка происходит. Потому что regexp не объявлено.
      • Это уже упоминалось в комментарии Рубена .
    • Из вашего вопроса я подумал, что вы хотите поместить значение результата в столбец "B" Import2. Но похоже, что ваш скрипт помещает значение в столбец «I» из test1.copyTo(sheet1.getRange("I2")).
    • Ваш скрипт проверяет только «A2» из Import2.
    • Каждая строка проверяется и копируется значение в для л oop. В этом случае стоимость процесса будет высокой.

Когда вышеуказанные точки отражены в вашем сценарии, как насчет следующего измененного сценария?

Измененный сценарий :

function ExpenseMatching() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet1 = spreadsheet.getSheetByName("Import2");
  var sheet2 = spreadsheet.getSheetByName("Regular Expression");

  const values1 = sheet1.getRange(`A2:A${sheet1.getLastRow()}`).getValues();
  const values2 = sheet2.getRange(`A2:A${sheet2.getLastRow()}`).getValues();
  const res = values1.map(([r1]) => {
    for (let i = 0; i < values2.length; i++) {
      if (new RegExp(values2[i][0]).test(r1)) {
        return [values2[i][0]];
      }
    }
    return [""];
  });
  sheet1.getRange(2, 2, res.length, 1).setValues(res);
}
  • Я думаю, что в вашей ситуации вы также можете использовать if (r1.includes(values2[i][0])) { вместо if (new RegExp(values2[i][0]).test(r1)) {. Это может снизить стоимость.

Примечание:

  • В этой модификации значения результата помещаются в столбец "B" Import2.
  • Пожалуйста, запустите скрипт с включенным V8.

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, в котором вы хотите, я приношу свои извинения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...