Удаление строки с конкретными данными без учета регистра без учета регистра

#javascript #arrays #google-apps-script #google-sheets

#javascript #массивы #google-apps-script #google-таблицы

Вопрос:

У меня есть этот скрипт Google Apps, который проверяет определенные столбцы на наличие в нем перечисленных слов и удаляет строки, соответствующие этим словам:

 function sort() { 
  var sheet = SpreadsheetApp.getActiveSheet(); 
  var rows = sheet.getDataRange(); 
  var values = rows.getValues(); 
  var rowsDeleted = 0; 
  var arrayOfWords = ['möbelübernahme','können übernommen werden','caravan','wohnwagen'] 

  for (var i = values.length - 1; i >= 0; i--) {  
    var row = values[i]; 
    for (var j = 0; j < arrayOfWords.length; j  ) {    
      if (row['21','17'].indexOf(arrayOfWords[j]) > -1) {         
        sheet.deleteRow(i 1);     
        rowsDeleted  ;   
        break;         
      }
    } 
  } 
};
  

Могу ли я проверить, чтобы слова не учитывали регистр? Итак, если я включу слово типа «mietwohnung», оно удалит все параметры сопоставления: MIETWOHNUNG, mietwohnung, Mietwohnung?

Комментарии:

1. Если вы загуглите: как сделать строчные буквы определенным значением в javascript, вы обнаружите, что этого можно достичь с помощью метода toLowerCase() . Примените эту функцию к значениям поиска и сравните их с arrayOfWords .

2. Также это row['21','17'] не поддерживается в javascript.

3. ну, вы могли бы выбрать бюджетный вариант и указать проверку орфографии «всегда заменяйте это на это» XD

Ответ №1:

Объяснение:

  • Вам необходимо преобразовать каждый элемент в row массиве в нижний регистр. Для этого вам нужно использовать map() и toLowerCase() . Таким образом, вы будете применять toLowerCase к каждому элементу row . Изменение будет здесь:

     if (row.map(r=>r.toLowerCase()).indexOf(arrayOfWords[j]) > -1)
      
  • row['21','17'] недопустимый объект javascript. Вы не можете нарезать массив таким образом. Если ваша цель — проверить только столбец 21 , а 17 затем вместо этого использовать этот оператор if:

     if ([row[21],row[17]].map(r=>r.toLowerCase()).indexOf(arrayOfWords[j]) > -1)
      

    Обратите внимание, что row[21] это столбец V и row[17] столбец R на листе. Помните, что индекс в javascript начинается с 0 . А именно, 0 является столбцом A , 1 является столбцом B и т. Д.


Решение:

 function sort() { 
  var sheet = SpreadsheetApp.getActiveSheet(); 
  var rows = sheet.getDataRange(); 
  var values = rows.getValues(); 
  var rowsDeleted = 0; 
  var arrayOfWords = ['möbelübernahme','können übernommen werden','caravan','wohnwagen'] 

  for (var i = values.length - 1; i >= 0; i--) {  
    var row = values[i]; 
    for (var j = 0; j < arrayOfWords.length; j  ) {    
      if (row.map(r=>r.toLowerCase()).indexOf(arrayOfWords[j]) > -1) {         
        sheet.deleteRow(i 1);     
        rowsDeleted  ;   
        break;         
      }
    } 
  } 
};
  

Ответ №2:

Альтернатива уже предоставленному решению

Вы можете просто использовать toLowerCase() — таким образом, например, «Mietwohnung» станет «mietwohnung», и сравнение может быть выполнено без проблем.

Итак, вы можете внести следующие изменения в свой скрипт:

 for (let i = values.length - 1; i >= 0; i--) {
   var row = values[i];
   var found = false;
   for (let k = 0; k < row.length; k  )
      for (let j = 0; j < arrayOfWords.length; j  )
         if (row[k].toString().toLowerCase().indexOf(arrayOfWords[j]) > -1)
            found = true;
   if (found == true) {
      sheet.deleteRow(i   1);
      rowsDeleted  ;
   }
}

  

Приведенный выше скрипт перебирает все значения из диапазона данных, следовательно, добавляется другой цикл, а затем, используя toLowerCase() функцию, проверяет, является ли значение частью arrayOfWords массива, и при необходимости удаляет строки. found Переменная используется здесь, чтобы указать, было ли найдено слово или нет.

Ссылка