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

Google Apps Script предоставляет мощные инструменты для работы с Google Sheets, и одним из ключевых понятий здесь является диапазон (Range). Эффективное управление диапазонами позволяет автоматизировать рутинные задачи, анализировать данные и создавать интерактивные отчеты.

Что такое Range (диапазон) в Google Sheets?

Диапазон – это группа смежных ячеек в Google Sheets. Это может быть одна ячейка, строка, столбец или блок ячеек. В Apps Script диапазоны представлены объектом Range, который предоставляет методы для чтения, записи, форматирования и манипулирования данными.

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

Основным методом для получения объекта Range является getRange(), который доступен через объект Sheet (лист). Мы рассмотрим различные варианты использования getRange() ниже.

Различия между листами (Sheet) и диапазонами (Range)

Важно понимать разницу между листом (Sheet) и диапазоном (Range). Sheet представляет собой целый лист Google Sheets, в то время как Range представляет собой определенный набор ячеек на этом листе. Чтобы работать с конкретными ячейками, сначала нужно получить объект Sheet, а затем использовать его метод getRange() для получения нужного Range.

Получение диапазонов различными способами

Получение диапазона по A1 нотации (getRange(‘A1:B2’))

Самый простой способ получить диапазон – использовать A1 нотацию. Например:

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function getRangeByA1Notation(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
  if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const range = sheet.getRange('A1:B2');
  console.log(range.getA1Notation()); // Output: A1:B2
}

Получение диапазона по номерам строк и столбцов (getRange(row, column, numRows, numColumns))

Этот метод позволяет указать начальную строку, столбец, количество строк и столбцов в диапазоне:

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function getRangeByRowColumn(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
   if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const range = sheet.getRange(1, 1, 2, 2); // Начиная с 1 строки, 1 столбца, 2 строки, 2 столбца
  console.log(range.getA1Notation()); // Output: A1:B2
}

Получение последнего ряда с данными (getLastRow()) и столбца (getLastColumn()) и использование их в getRange()

Часто необходимо получить диапазон, который динамически меняется в зависимости от количества данных. getLastRow() и getLastColumn() помогут в этом:

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function getDynamicRange(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
   if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const lastRow = sheet.getLastRow();
  const lastColumn = sheet.getLastColumn();
  const range = sheet.getRange(1, 1, lastRow, lastColumn); // Весь диапазон с данными
  console.log(range.getA1Notation());
}

Получение всего листа как диапазона (getDataRange())

getDataRange() возвращает диапазон, охватывающий все ячейки на листе, содержащие данные. Это полезно для обработки всего листа целиком.

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function getAllDataRange(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
   if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const range = sheet.getDataRange();
  console.log(range.getA1Notation());
}

Чтение и запись данных в диапазоны

Метод getValue() и setValue() для работы с одиночными ячейками

getValue() возвращает значение одной ячейки, а setValue() устанавливает значение одной ячейки. Например:

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function readWriteSingleCell(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
   if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const cellValue = sheet.getRange('A1').getValue();
  console.log(cellValue);
  sheet.getRange('B1').setValue('Новое значение');
}
Реклама

Методы getValues() и setValues() для работы с массивами данных (двумерные массивы)

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

Пример: Запись данных из массива в диапазон

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function writeDataFromArray(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
   if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const data = [    
    ['Имя', 'Возраст'],
    ['Иван', 30],
    ['Мария', 25],
  ];
  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}

Чтение данных из диапазона в массив

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function readDataToArray(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
   if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const range = sheet.getDataRange();
  const data = range.getValues();
  console.log(data);
}

Форматирование диапазонов

Изменение шрифта, размера и стиля текста

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function formatText(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
   if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const range = sheet.getRange('A1:B2');
  range.setFontFamily('Arial')
       .setFontSize(12)
       .setFontWeight('bold')
       .setFontStyle('italic');
}

Установка цвета фона и текста

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function setColors(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
   if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const range = sheet.getRange('A1:B2');
  range.setBackground('#FFFF00') // Желтый фон
       .setFontColor('#0000FF'); // Синий текст
}

Установка выравнивания

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function setAlignment(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
   if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const range = sheet.getRange('A1:B2');
  range.setHorizontalAlignment('center')
       .setVerticalAlignment('middle');
}

Применение числовых форматов

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet
 */
function setNumberFormat(spreadsheet) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
   if (!sheet) {
    console.error('Sheet not found');
    return;
  }
  const range = sheet.getRange('A1');
  range.setNumberFormat('$#,##0.00'); // Формат валюты
}

Примеры практического использования диапазонов

Поиск данных в диапазоне

/**
 * Finds the first cell in a range that matches a given value.
 *
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} spreadsheet The spreadsheet object.
 * @param {string} searchValue The value to search for.
 * @return {GoogleAppsScript.Spreadsheet.Range | null} The range of the first matching cell, or null if not found.
 */
function findDataInRange(spreadsheet, searchValue) {
  const sheet = spreadsheet.getSheetByName('Sheet1');
  if (!sheet) {
    console.error('Sheet not found');
    return null;
  }
  const dataRange = sheet.getDataRange();
  const values = dataRange.getValues();

  for (let i = 0; i < values.length; i++) {
    for (let j = 0; j < values[i].length; j++) {
      if (values[i][j] === searchValue) {
        // Return the A1 notation of the found cell
        return sheet.getRange(i + 1, j + 1);
      }
    }
  }
  return null; // Not found
}

Фильтрация данных на основе диапазона

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

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

copyTo() копирует диапазон в другое место, а moveTo() перемещает диапазон.

Удаление строк или столбцов в диапазоне

Можно удалять строки или столбцы в диапазоне, например, если они не соответствуют определенным критериям. Используйте deleteRow() и deleteColumn().

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


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