Google Apps Script: получение данных с другого листа — полное руководство

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

Что такое Google Apps Script и его преимущества

Google Apps Script – это облачный язык сценариев, основанный на JavaScript, который позволяет автоматизировать задачи и расширять функциональность Google Workspace (Sheets, Docs, Forms, Gmail и др.). Преимущества Apps Script включают интеграцию с сервисами Google, простоту использования, отсутствие необходимости в установке дополнительного ПО и возможность создания веб-приложений.

Основные понятия: Spreadsheet, Sheet, Range

  • Spreadsheet (таблица) – это основной объект, представляющий собой файл Google Sheets.
  • Sheet (лист) – это отдельная страница внутри таблицы.
  • Range (диапазон) – это группа ячеек на листе. Диапазон может быть одной ячейкой, строкой, столбцом или блоком ячеек.

Получение доступа к Google Sheets через Apps Script

Для работы с Google Sheets в Apps Script используется объект SpreadsheetApp. Этот объект предоставляет методы для открытия таблиц, получения листов и доступа к данным.

Получение данных с другого листа в той же таблице

Метод SpreadsheetApp.getActiveSpreadsheet(): получение текущей таблицы

Этот метод возвращает объект Spreadsheet, представляющий таблицу, в которой выполняется скрипт.

/**
 * Получает текущую таблицу.
 * @return {Spreadsheet} Текущая таблица.
 */
function getActiveSpreadsheet() {
  return SpreadsheetApp.getActiveSpreadsheet();
}

Метод getSheetByName(sheetName): получение листа по имени

Этот метод позволяет получить объект Sheet по его имени. Важно помнить, что имя листа должно быть указано точно.

/**
 * Получает лист по имени.
 * @param {string} sheetName Имя листа.
 * @return {Sheet} Лист с указанным именем.
 */
function getSheetByName(sheetName) {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  return spreadsheet.getSheetByName(sheetName);
}

Методы getDataRange(), getLastRow(), getLastColumn(): определение диапазона данных

  • getDataRange(): возвращает диапазон, содержащий все данные на листе.
  • getLastRow(): возвращает номер последней строки, содержащей данные.
  • getLastColumn(): возвращает номер последнего столбца, содержащего данные.
/**
 * Получает диапазон данных на листе.
 * @param {Sheet} sheet Лист.
 * @return {Range} Диапазон данных.
 */
function getDataRange(sheet) {
  return sheet.getDataRange();
}

/**
 * Получает номер последней строки с данными.
 * @param {Sheet} sheet Лист.
 * @return {number} Номер последней строки.
 */
function getLastRow(sheet) {
  return sheet.getLastRow();
}

/**
 * Получает номер последнего столбца с данными.
 * @param {Sheet} sheet Лист.
 * @return {number} Номер последнего столбца.
 */
function getLastColumn(sheet) {
  return sheet.getLastColumn();
}

Метод getRange(row, column, numRows, numColumns): получение конкретного диапазона

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

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

Метод getValues(): получение данных из диапазона в виде массива

Этот метод возвращает двумерный массив, содержащий значения ячеек из указанного диапазона.

/**
 * Получает значения из диапазона в виде массива.
 * @param {Range} range Диапазон.
 * @return {any[][]} Массив значений.
 */
function getValues(range) {
  return range.getValues();
}

Пример: Копирование данных с листа ‘Sheet1’ на лист ‘Sheet2’

/**
 * Копирует данные с листа 'Sheet1' на лист 'Sheet2'.
 */
function copyDataBetweenSheets() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheetName: string = 'Sheet1';
  const targetSheetName: string = 'Sheet2';

  const sourceSheet: GoogleAppsScript.Spreadsheet.Sheet = ss.getSheetByName(sourceSheetName);
  const targetSheet: GoogleAppsScript.Spreadsheet.Sheet = ss.getSheetByName(targetSheetName);

  if (!sourceSheet || !targetSheet) {
    Logger.log("One or both sheets not found.");
    return;
  }

  const lastRow: number = sourceSheet.getLastRow();
  const lastColumn: number = sourceSheet.getLastColumn();

  if (lastRow === 0 || lastColumn === 0) {
    Logger.log("Source sheet is empty.");
    return;
  }

  const dataRange: GoogleAppsScript.Spreadsheet.Range = sourceSheet.getDataRange();
  const values: any[][] = dataRange.getValues();

  targetSheet.getRange(1, 1, lastRow, lastColumn).setValues(values);
  Logger.log("Data copied successfully.");
}

Получение данных с другого листа в другой таблице

Метод SpreadsheetApp.openById(id): открытие таблицы по ID

Этот метод открывает таблицу по ее ID. ID таблицы можно найти в URL таблицы.

/**
 * Открывает таблицу по ID.
 * @param {string} id ID таблицы.
 * @return {Spreadsheet} Таблица.
 */
function openSpreadsheetById(id) {
  return SpreadsheetApp.openById(id);
}

Метод SpreadsheetApp.openByUrl(url): открытие таблицы по URL

Этот метод открывает таблицу по ее URL.

/**
 * Открывает таблицу по URL.
 * @param {string} url URL таблицы.
 * @return {Spreadsheet} Таблица.
 */
function openSpreadsheetByUrl(url) {
  return SpreadsheetApp.openByUrl(url);
}

Получение листа и диапазона данных (аналогично предыдущему разделу)

После открытия таблицы, получение листа и диапазона данных выполняется аналогично тому, как это делалось в предыдущем разделе.

Пример: Импорт данных из одной таблицы в другую

/**
 * Импортирует данные из одной таблицы в другую.
 */
function importDataFromAnotherSpreadsheet() {
  const sourceSpreadsheetId: string = 'YOUR_SOURCE_SPREADSHEET_ID';
  const sourceSheetName: string = 'SourceSheet';
  const targetSheetName: string = 'TargetSheet';

  const targetSpreadsheet: GoogleAppsScript.Spreadsheet.Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSpreadsheet: GoogleAppsScript.Spreadsheet.Spreadsheet = SpreadsheetApp.openById(sourceSpreadsheetId);

  const sourceSheet: GoogleAppsScript.Spreadsheet.Sheet = sourceSpreadsheet.getSheetByName(sourceSheetName);
  const targetSheet: GoogleAppsScript.Spreadsheet.Sheet = targetSpreadsheet.getSheetByName(targetSheetName);

  if (!sourceSheet || !targetSheet) {
    Logger.log("One or both sheets not found.");
    return;
  }

  const lastRow: number = sourceSheet.getLastRow();
  const lastColumn: number = sourceSheet.getLastColumn();

    if (lastRow === 0 || lastColumn === 0) {
    Logger.log("Source sheet is empty.");
    return;
  }

  const values: any[][] = sourceSheet.getDataRange().getValues();
  targetSheet.getRange(1, 1, lastRow, lastColumn).setValues(values);
  Logger.log("Data imported successfully.");
}

Безопасность: Разрешения и доступ к таблицам

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

Обработка полученных данных

Итерация по массиву данных

Для обработки данных, полученных из таблицы, необходимо итерировать по массиву, возвращенному методом getValues(). Можно использовать циклы for или методы массивов, такие как forEach() и map().

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

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

Например, если у вас есть данные о рекламных кампаниях и вы хотите оставить только кампании с CTR больше 2%, код может выглядеть так:

const campaignsData = sheet.getDataRange().getValues();
const filteredCampaigns = campaignsData.filter(campaign => campaign[5] > 0.02); // Предполагаем, что CTR в 6м столбце (индекс 5)

Преобразование данных (например, изменение формата дат)

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

Например, для приведения дат к определенному формату можно использовать:

const formattedDates = dates.map(date => Utilities.formatDate(date, Session.getTimeZone(), "yyyy-MM-dd"));

Запись обработанных данных на другой лист

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

Оптимизация и обработка ошибок

Оптимизация скорости выполнения скрипта при работе с большими объемами данных

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

Обработка ошибок: проверка существования листа, таблицы, диапазона

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

if (sheet) {
  // Работаем с листом
} else {
  Logger.log("Sheet not found.");
}

Логирование и отладка скрипта

Используйте Logger.log() для логирования информации о работе скрипта. Это поможет отследить ошибки и понять, что происходит в скрипте.

Также можно использовать встроенный отладчик Apps Script для пошаговой отладки скрипта.

Примеры практического применения

Автоматическое обновление данных из мастер-таблицы

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

Сбор статистики из нескольких листов в сводную таблицу

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

Создание отчетов на основе данных из других листов

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

Заключение

Краткое резюме основных моментов

В этой статье мы рассмотрели, как получать данные с другого листа в Google Apps Script. Мы научились открывать таблицы по ID и URL, получать листы, диапазоны и данные. Также мы рассмотрели вопросы оптимизации, обработки ошибок и примеры практического применения.

Полезные ресурсы и ссылки для дальнейшего изучения


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