Для цикла deleteRow (i) удаление неправильных строк

1

Я использую скрипт Google Apps для написания сценария для редактирования Google Таблиц для списка рассылки. Я хотел бы, чтобы он пробегал все строки и удалял любые строки с помощью "BOUNCED" "ERROR" или "NO_RECIPIENT" в определенной ячейке.

Проблема, с которой я столкнулась, это For Loop использует скобки [ ] для обозначения строк и столбцов, которая индексирует первую строку в 0. Действие deleteRows() использует изогнутую скобку, которая индексирует первую строку в 1. По этой причине у меня возникли проблемы с удалением правильной строки.

Если я программирую deleteRow(i), он удаляет строку, следующую за той, которая проверяется For loop. Если я программирую deleteRow(i+1), он сначала удаляет правильную строку, а затем удаляет следующую строку. Смотрите мой код ниже:

function cleanUp() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var data = sheet.getDataRange().getValues();

  for ( var i = 1; i < 30; i++) {
    if (data[i][9] === 'ERROR' || data[i][9] === 'BOUNCED' || data[i][9] === 'NO_RECIPIENT') {
      sheet.deleteRow(i+1);
    }
  }
}
  • 1
    Я считаю, что немного легче удалить, зацикливаясь снизу вверх, потому что каждая строка, которую вы удаляете, меняет номера строк в строках под ней. Вы можете отслеживать строки, которые вы удаляете, и тогда номер строки, которую вы хотите удалить, будет i + 1 - строки удалены.
Теги:
google-apps-script
google-sheets

1 ответ

0

После того, как строка удалена, строки ниже нее меняют ее положение. Один из способов избежать этой проблемы - сделать цикл в обратном порядке.

Другими словами, вместо

for(var i = 1; i < 30; i++)

использование

for(var i = 29 ; i > 0; i--)
  • 0
    // Спасибо Рубену, я использовал следующий код, чтобы попытаться решить эту проблему, но после использования «data.length» для установки первого параметра для «i» в цикле for я получаю следующую ошибку: «TypeError: Cannot read свойство "9" из неопределенного. (строка 24, файл "Код") function cleanUp () {var ss = SpreadsheetApp.getActiveSpreadsheet (); var sheet = ss.getActiveSheet (); var data = sheet.getDataRange (). getValues (); for (var i = data.length; i> 0; i--) {if (data [i] [9] === 'ERROR' || data [i] [9] === 'BOUNCED' || data [i] [9] === 'NO_RECIPIENT') {sheet.deleteRow (i + 1);
  • 0
    @ W. См. Пожалуйста, обновите свои вопросы, чтобы показать ваши постоянные усилия

Ещё вопросы

Сообщество Overcoder
Наверх
Меню