#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
Переменная используется здесь, чтобы указать, было ли найдено слово или нет.