Google Apps Script: Как удалить строку?

Обзор Google Apps Script и его возможностей

Google Apps Script (GAS) — это облачная платформа разработки, позволяющая автоматизировать задачи и расширять функциональность Google Workspace, включая Google Sheets. GAS предоставляет JavaScript API для работы с таблицами, документами, почтой и другими сервисами Google.

Постановка задачи: когда и зачем нужно удалять строки?

Удаление строк в Google Sheets через Apps Script может потребоваться в различных сценариях:

  • Очистка данных от устаревшей информации.
  • Удаление строк, не соответствующих определенным критериям.
  • Удаление дубликатов для обеспечения целостности данных.
  • Автоматическая обработка результатов рекламных кампаний (например, удаление строк с неэффективными ключевыми словами).

Необходимые разрешения для работы со spreadsheet

Для работы со spreadsheet в Apps Script требуются разрешения на чтение и запись. При первом запуске скрипта, обращающегося к таблице, пользователю будет предложено предоставить эти разрешения. Разрешения запрашиваются автоматически и не требуют ручной настройки.

Основные методы удаления строк

Метод deleteRow(): удаление одной строки

Метод deleteRow(rowPosition) удаляет строку, расположенную на указанной позиции (индекс строки начинается с 1).

/**
 * Удаляет строку из таблицы по указанному индексу.
 * @param {number} rowToDelete Индекс строки для удаления.
 */
function deleteSingleRow(rowToDelete: number): void {
  // Получаем активную таблицу
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  // Получаем первый лист
  const sheet = ss.getActiveSheet();

  // Удаляем строку. Важно: нумерация строк начинается с 1.
  sheet.deleteRow(rowToDelete);
}

Метод deleteRows(): удаление нескольких строк за раз

Метод deleteRows(startRow, numRows) удаляет указанное количество строк, начиная с указанной строки.

/**
 * Удаляет несколько строк из таблицы.
 * @param {number} startRow Индекс первой строки для удаления.
 * @param {number} numRows Количество строк для удаления.
 */
function deleteMultipleRows(startRow: number, numRows: number): void {
  // Получаем активную таблицу
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  // Получаем первый лист
  const sheet = ss.getActiveSheet();

  // Удаляем строки.
  sheet.deleteRows(startRow, numRows);
}

Указание диапазона строк для удаления

Оба метода deleteRow() и deleteRows() работают с числовым индексом строки. Важно учитывать, что нумерация строк начинается с 1, а не с 0.

Практические примеры удаления строк

Удаление строки по номеру

/**
 * Пример удаления строки по номеру.
 */
function deleteRowByNumberExample(): void {
  const rowNumberToDelete = 5; // Удаляем пятую строку
  deleteSingleRow(rowNumberToDelete);
}

Удаление строки на основе условия (например, значение в столбце)

/**
 * Удаляет строки, где значение в первом столбце равно 'delete'.
 */
function deleteRowsByCondition(): void {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  const lastRow = sheet.getLastRow();
  const data = sheet.getRange(1, 1, lastRow, 1).getValues();

  // Итерируем по строкам в обратном порядке, чтобы избежать проблем с индексацией при удалении.
  for (let i = lastRow - 1; i >= 0; i--) {
    if (data[i][0] === 'delete') {
      sheet.deleteRow(i + 1); // +1, потому что нумерация строк начинается с 1.
    }
  }
}

Удаление пустых строк

/**
 * Удаляет пустые строки в таблице.
 */
function deleteEmptyRows(): void {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  const lastRow = sheet.getLastRow();
  const data = sheet.getRange(1, 1, lastRow, sheet.getLastColumn()).getValues();

  for (let i = lastRow - 1; i >= 0; i--) {
    // Проверяем, что все ячейки в строке пустые
    const isRowEmpty = data[i].every(cell => cell === null || cell === '');

    if (isRowEmpty) {
      sheet.deleteRow(i + 1);
    }
  }
}

Удаление дубликатов строк

/**
 * Удаляет дубликаты строк в таблице на основе сравнения всех столбцов.
 */
function deleteDuplicateRows(): void {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  const lastRow = sheet.getLastRow();
  const lastCol = sheet.getLastColumn();
  const data = sheet.getRange(1, 1, lastRow, lastCol).getValues();
  const uniqueRows = new Set();

  for (let i = lastRow - 1; i >= 0; i--) {
    const rowString = JSON.stringify(data[i]); // Преобразуем строку в строку для сравнения

    if (uniqueRows.has(rowString)) {
      sheet.deleteRow(i + 1);
    } else {
      uniqueRows.add(rowString);
    }
  }
}

Оптимизация и обработка ошибок при удалении строк

Как избежать ошибок ‘Index out of bounds’

Ошибка ‘Index out of bounds’ возникает, когда скрипт пытается обратиться к строке, которой не существует. Это часто происходит при удалении строк в цикле. Чтобы избежать этой ошибки, рекомендуется итерировать по строкам в обратном порядке (от последней к первой).

Удаление строк большими пакетами: влияние на производительность

Удаление строк по одной может быть неэффективным для больших таблиц. Метод deleteRows() позволяет удалять несколько строк за раз, что значительно повышает производительность. Рекомендуется группировать удаление строк в пакеты, если это возможно.

Логирование операций удаления

Для отладки и аудита полезно логировать операции удаления строк. Можно записывать информацию об удаленных строках в отдельный лист или использовать сервис Logger.

Альтернативные подходы и решения

Скрытие строк вместо удаления

Вместо удаления строк можно использовать метод hideRows(), который скрывает указанные строки. Это полезно, если данные могут понадобиться в будущем.

Использование фильтров для временного исключения строк

Фильтры позволяют временно исключить строки, не соответствующие определенным критериям, из отображения. Это не удаляет строки, но позволяет сосредоточиться на нужных данных.

Архивирование удаляемых строк в отдельный лист

Перед удалением строк можно скопировать их в отдельный лист для архивации. Это позволяет сохранить данные на случай, если они понадобятся в будущем. Такой подход обеспечивает дополнительную безопасность и контроль над данными.


Добавить комментарий