Google Apps Script: Как работать с диапазоном в Google Таблицах?

Google Apps Script предоставляет мощные инструменты для автоматизации работы с Google Таблицами. Ключевым элементом этой автоматизации является взаимодействие с диапазонами ячеек. В этой статье мы подробно рассмотрим, как работать с диапазонами, как получать и изменять данные, форматировать ячейки, и выполнять расширенные операции.

Введение в работу с диапазонами в Google Apps Script

Что такое диапазон в Google Таблицах и зачем он нужен?

Диапазон в Google Таблицах – это группа смежных ячеек, которую можно определить для чтения, записи или форматирования данных. Работа с диапазонами позволяет автоматизировать рутинные задачи, такие как заполнение таблиц, обработка данных, форматирование отчетов, и создание дашбордов.

Основные методы для получения диапазонов: getRange(), getActiveRange(), getDataRange()

getRange(row, column, numRows, numColumns): Получает диапазон, начиная с указанной строки и столбца, заданной высоты и ширины.
Пример: sheet.getRange(1, 1, 10, 5) получит диапазон A1:E10.

getActiveRange(): Возвращает текущий выделенный диапазон в активном листе.
Пример: sheet.getActiveRange() получит диапазон, выделенный пользователем.

getDataRange(): Получает диапазон, содержащий все данные на листе.
Пример: sheet.getDataRange() получит диапазон, содержащий все ячейки с данными.

/**
 * Получает диапазон ячеек на листе Google Таблиц.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Объект листа Google Таблиц.
 * @param {number} row Начальный номер строки.
 * @param {number} column Начальный номер столбца.
 * @param {number} numRows Количество строк в диапазоне.
 * @param {number} numColumns Количество столбцов в диапазоне.
 * @return {GoogleAppsScript.Spreadsheet.Range} Объект диапазона.
 */
function getRangeFromSheet(
  sheet: GoogleAppsScript.Spreadsheet.Sheet,
  row: number,
  column: number,
  numRows: number,
  numColumns: number
): GoogleAppsScript.Spreadsheet.Range {
  return sheet.getRange(row, column, numRows, numColumns);
}

/**
 * Получает активный диапазон ячеек на активном листе Google Таблиц.
 *
 * @return {GoogleAppsScript.Spreadsheet.Range} Объект активного диапазона.
 */
function getActiveRangeFromActiveSheet(): GoogleAppsScript.Spreadsheet.Range {
  const sheet = SpreadsheetApp.getActiveSheet();
  return sheet.getActiveRange();
}

/**
 * Получает диапазон данных на листе Google Таблиц.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Объект листа Google Таблиц.
 * @return {GoogleAppsScript.Spreadsheet.Range} Объект диапазона данных.
 */
function getDataRangeFromSheet(sheet: GoogleAppsScript.Spreadsheet.Sheet): GoogleAppsScript.Spreadsheet.Range {
  return sheet.getDataRange();
}

Объяснение координат A1 и R1C1. Какой формат использовать?

Google Таблицы поддерживают два формата указания координат:

A1: Традиционный формат, где столбцы обозначаются буквами (A, B, C, …), а строки – цифрами (1, 2, 3, …). Пример: A1, B12, AZ100.

R1C1: Формат, где строки и столбцы обозначаются цифрами. Пример: R1C1 (ячейка A1), R10C5 (ячейка E10).

Формат A1 более читабелен и удобен для большинства случаев. R1C1 полезен, когда координаты вычисляются динамически.

Получение и изменение данных в диапазоне

Чтение данных из диапазона: getValue(), getValues()

getValue(): Возвращает значение одной ячейки в диапазоне.
Пример: const value = sheet.getRange('A1').getValue();

getValues(): Возвращает двумерный массив значений всех ячеек в диапазоне. Этот метод подходит для чтения больших объемов данных.
Пример: const values = sheet.getRange('A1:C10').getValues();

/**
 * Считывает значение из ячейки в Google Таблицах.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Объект листа Google Таблиц.
 * @param {string} cell Адрес ячейки в формате A1 (например, 'A1').
 * @return {any} Значение ячейки.
 */
function getCellValue(sheet: GoogleAppsScript.Spreadsheet.Sheet, cell: string): any {
  return sheet.getRange(cell).getValue();
}

/**
 * Считывает значения из диапазона ячеек в Google Таблицах.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Объект листа Google Таблиц.
 * @param {string} range Адрес диапазона в формате A1 (например, 'A1:C10').
 * @return {any[][]} Двумерный массив значений.
 */
function getRangeValues(sheet: GoogleAppsScript.Spreadsheet.Sheet, range: string): any[][] {
  return sheet.getRange(range).getValues();
}

Запись данных в диапазон: setValue(), setValues()

setValue(value): Записывает указанное значение в одну ячейку диапазона.
Пример: sheet.getRange('A1').setValue('Новое значение');

setValues(values): Записывает двумерный массив значений в диапазон. Важно, чтобы размеры массива соответствовали размерам диапазона.
Пример: sheet.getRange('A1:C3').setValues([['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]);

/**
 * Записывает значение в ячейку в Google Таблицах.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Объект листа Google Таблиц.
 * @param {string} cell Адрес ячейки в формате A1 (например, 'A1').
 * @param {any} value Значение для записи.
 */
function setCellValue(sheet: GoogleAppsScript.Spreadsheet.Sheet, cell: string, value: any): void {
  sheet.getRange(cell).setValue(value);
}

/**
 * Записывает значения в диапазон ячеек в Google Таблицах.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Объект листа Google Таблиц.
 * @param {string} range Адрес диапазона в формате A1 (например, 'A1:C10').
 * @param {any[][]} values Двумерный массив значений.
 */
function setRangeValues(sheet: GoogleAppsScript.Spreadsheet.Sheet, range: string, values: any[][]): void {
  sheet.getRange(range).setValues(values);
}

Особенности работы с разными типами данных (числа, текст, даты)

Google Apps Script автоматически преобразует типы данных при чтении и записи. Однако, для дат может потребоваться явное указание формата, чтобы избежать ошибок.

Очистка содержимого диапазона: clearContent()

clearContent(): Удаляет все данные из диапазона, оставляя форматирование нетронутым.

Пример: sheet.getRange('A1:C10').clearContent();

/**
 * Очищает содержимое диапазона ячеек в Google Таблицах.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Объект листа Google Таблиц.
 * @param {string} range Адрес диапазона в формате A1 (например, 'A1:C10').
 */
function clearRangeContent(sheet: GoogleAppsScript.Spreadsheet.Sheet, range: string): void {
  sheet.getRange(range).clearContent();
}

Работа с форматированием диапазона

Изменение шрифта, размера, цвета текста: setFontFamily(), setFontSize(), setFontColor()

setFontFamily(fontFamily): Устанавливает шрифт текста в диапазоне.

Реклама

setFontSize(size): Устанавливает размер шрифта в диапазоне.

setFontColor(color): Устанавливает цвет текста в диапазоне.

Пример:

const range = sheet.getRange('A1:C1');
range.setFontFamily('Arial').setFontSize(12).setFontColor('red');

Установка выравнивания текста: setHorizontalAlignment(), setVerticalAlignment()

setHorizontalAlignment(alignment): Устанавливает горизонтальное выравнивание текста (left, center, right).

setVerticalAlignment(alignment): Устанавливает вертикальное выравнивание текста (top, middle, bottom).

Пример:

const range = sheet.getRange('A1:C1');
range.setHorizontalAlignment('center').setVerticalAlignment('middle');

Изменение цвета фона ячеек: setBackground()

setBackground(color): Устанавливает цвет фона ячеек в диапазоне.

Пример:

const range = sheet.getRange('A1:C1');
range.setBackground('yellow');

Установка формата чисел: setNumberFormat()

setNumberFormat(numberFormat): Устанавливает формат чисел в диапазоне (например, 0.00, #,##0.00, dd/mm/yyyy).

Пример:

const range = sheet.getRange('A1:C1');
range.setNumberFormat('0.00');

Расширенные операции с диапазонами

Поиск и замена данных в диапазоне: find(), replace()

find(searchText): Находит первую ячейку в диапазоне, содержащую указанный текст.

replace(searchText, replacement): Заменяет указанный текст на новый во всех ячейках диапазона.

/**
 * Ищет и заменяет текст в диапазоне ячеек.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Объект листа Google Таблиц.
 * @param {string} range Адрес диапазона в формате A1.
 * @param {string} searchText Текст для поиска.
 * @param {string} replacement Текст для замены.
 */
function findAndReplaceText(
  sheet: GoogleAppsScript.Spreadsheet.Sheet,
  range: string,
  searchText: string,
  replacement: string
): void {
  sheet.getRange(range).replace(searchText, replacement);
}

Сортировка данных в диапазоне: sort()

sort(column, ascending): Сортирует данные в диапазоне по указанному столбцу. ascendingtrue для сортировки по возрастанию, false – по убыванию.

/**
 * Сортирует данные в диапазоне ячеек по указанному столбцу.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Объект листа Google Таблиц.
 * @param {string} range Адрес диапазона в формате A1.
 * @param {number} column Номер столбца для сортировки (начиная с 1).
 * @param {boolean} ascending `true` для сортировки по возрастанию, `false` - по убыванию.
 */
function sortRangeByColumn(
  sheet: GoogleAppsScript.Spreadsheet.Sheet,
  range: string,
  column: number,
  ascending: boolean
): void {
  sheet.getRange(range).sort({ column: column, ascending: ascending });
}

Удаление и вставка строк/столбцов в диапазоне: deleteRow(), insertRowBefore(), etc.

deleteRow(rowPosition): Удаляет строку по указанной позиции.

insertRowBefore(beforeRow): Вставляет новую строку перед указанной строкой.

deleteColumn(columnPosition): Удаляет столбец по указанной позиции.

insertColumnBefore(beforeColumn): Вставляет новый столбец перед указанным столбцом.

/**
 * Вставляет новую строку перед указанной строкой.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Объект листа Google Таблиц.
 * @param {number} row Номер строки перед которой нужно вставить новую строку.
 */
function insertRowBeforeRow(sheet: GoogleAppsScript.Spreadsheet.Sheet, row: number): void {
  sheet.insertRowBefore(row);
}

Копирование и перемещение диапазонов: copyTo(), moveTo()

copyTo(destination, options): Копирует диапазон в указанное место.

moveTo(destination): Перемещает диапазон в указанное место.

/**
 * Копирует данные из одного диапазона в другой.
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sourceSheet Исходный лист.
 * @param {string} sourceRange Адрес исходного диапазона в формате A1.
 * @param {GoogleAppsScript.Spreadsheet.Sheet} destinationSheet Целевой лист.
 * @param {string} destinationRange Адрес целевого диапазона в формате A1.
 */
function copyRangeToAnotherSheet(
  sourceSheet: GoogleAppsScript.Spreadsheet.Sheet,
  sourceRange: string,
  destinationSheet: GoogleAppsScript.Spreadsheet.Sheet,
  destinationRange: string
): void {
  const rangeToCopy = sourceSheet.getRange(sourceRange);
  rangeToCopy.copyTo(destinationSheet.getRange(destinationRange));
}

Практические примеры работы с диапазонами

Автоматизация заполнения таблицы на основе данных из другого листа

Предположим, у вас есть два листа: "Source" и "Destination". Скрипт ниже копирует данные из диапазона A1:C10 листа "Source" в диапазон A1:C10 листа "Destination".

function copyDataFromSourceToDestination() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheet = ss.getSheetByName('Source');
  const destinationSheet = ss.getSheetByName('Destination');
  if (!sourceSheet || !destinationSheet) {
    Logger.log('Не найдены листы Source или Destination');
    return;
  }
  copyRangeToAnotherSheet(sourceSheet, 'A1:C10', destinationSheet, 'A1:C10');
}

Создание пользовательских функций для обработки данных в диапазоне

Можно создать пользовательскую функцию для суммирования значений в диапазоне, умноженных на коэффициент.

/**
 * Складывает значения в диапазоне, умноженные на коэффициент.
 *
 * @param {any[][]} rangeValues Двумерный массив значений диапазона.
 * @param {number} coefficient Коэффициент.
 * @return {number} Сумма значений, умноженных на коэффициент.
 * @customfunction
 */
function SUM_WITH_COEFFICIENT(rangeValues: any[][], coefficient: number): number {
  let sum = 0;
  for (let i = 0; i < rangeValues.length; i++) {
    for (let j = 0; j < rangeValues[i].length; j++) {
      const value = Number(rangeValues[i][j]);
      if (!isNaN(value)) {
        sum += value * coefficient;
      }
    }
  }
  return sum;
}

Пример скрипта для валидации данных в определенном диапазоне

Скрипт, который проверяет, что значения в диапазоне A1:A10 являются числами и находятся в диапазоне от 1 до 100.

function validateDataInRange() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  const range = sheet.getRange('A1:A10');
  const values = range.getValues();

  for (let i = 0; i < values.length; i++) {
    const value = Number(values[i][0]);
    if (isNaN(value) || value  100) {
      sheet.getRange(i + 1, 1).setBackground('red');
    } else {
      sheet.getRange(i + 1, 1).setBackground('white');
    }
  }
}

Как избежать ошибок при работе с большими объемами данных

При работе с большими объемами данных используйте getValues() и setValues() для чтения и записи данных массивами. Это значительно эффективнее, чем чтение и запись каждой ячейки по отдельности. Избегайте циклов, работающих с каждой ячейкой напрямую. Используйте пакетную обработку данных.


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