Как добавить Google Apps Script в Google Sheets: Полное руководство

Краткое описание Google Apps Script

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

Преимущества использования Google Apps Script в Sheets: автоматизация, расширение функциональности и интеграция

Интеграция GAS с Google Sheets открывает широкие возможности:

Автоматизация: Устранение рутинных задач, таких как форматирование данных, создание отчетов, отправка уведомлений или обновление ячеек на основе триггеров (например, по времени или при редактировании таблицы).

Расширение функциональности: Создание пользовательских функций, недоступных в стандартном наборе Sheets, добавление кастомных меню и боковых панелей для упрощения взаимодействия с таблицей.

Интеграция: Подключение к другим сервисам Google (Gmail, Calendar, Drive) и внешним API для обмена данными, например, загрузка данных о рекламных кампаниях из API рекламных сетей или отправка лидов в CRM.

Примеры задач, которые можно автоматизировать с помощью Google Apps Script

Ежедневный импорт данных о расходах из API рекламных систем (Google Ads, Facebook Ads).

Автоматическая отправка email-уведомлений при достижении определенных KPI в таблице (например, превышение бюджета).

Создание пользовательской функции для извлечения UTM-меток из URL.

Очистка и форматирование данных, импортированных из CSV-файлов.

Генерация кастомных отчетов на основе данных из нескольких листов.

Как открыть редактор Google Apps Script из Google Sheets

Открытие редактора скриптов через меню «Расширения»

Доступ к редактору скриптов осуществляется непосредственно из интерфейса Google Sheets:

Откройте вашу Google Таблицу.

Перейдите в меню «Расширения» (Extensions).

Выберите пункт «Apps Script».

Откроется новая вкладка браузера с редактором скриптов, привязанным к вашей таблице. Скрипты, созданные таким образом, называются привязанными (bound scripts) и имеют прямой доступ к открытой таблице.

Создание нового скрипта с нуля или использование существующего

При первом открытии редактора для таблицы будет автоматически создан проект скрипта с одним файлом Code.gs. Вы можете начать писать код в этом файле или создать дополнительные файлы (.gs для кода, .html для пользовательских интерфейсов) через меню «Файл» > «Создать».

Если у вас уже есть непривязанный (standalone) скрипт, его нельзя напрямую «привязать» к таблице через интерфейс редактора. Однако вы можете скопировать код из непривязанного скрипта в редактор привязанного скрипта.

Основы работы с редактором Google Apps Script

Интерфейс редактора скриптов: основные элементы и их назначение

Новый интерфейс редактора включает:

Панель навигации (слева): Позволяет переключаться между файлами проекта, библиотеками, службами Google, триггерами, настройками проекта и журналом выполнений.

Область редактора кода (центр): Основное пространство для написания и редактирования кода с подсветкой синтаксиса, автодополнением и проверкой ошибок.

Панель инструментов (сверху): Содержит кнопки для сохранения проекта, выбора и запуска функций, отладки.

Консоль/Журналы (снизу): Отображает вывод console.log() и Logger.log(), а также информацию об ошибках выполнения.

Написание и запуск простого скрипта для Google Sheets (например, вывод сообщения)

Давайте создадим простую функцию, которая выводит всплывающее сообщение в активной таблице:

/**
 * Выводит приветственное сообщение в активной Google Таблице.
 */
function showWelcomeToast() {
  // Получаем доступ к активной электронной таблице
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // Проверяем, что таблица успешно получена
  if (!ss) {
    console.error('Не удалось получить доступ к активной таблице.');
    return;
  }

  // Выводим всплывающее сообщение (toast)
  ss.toast('Добро пожаловать в Google Apps Script!', 'Статус', 5); // Сообщение, Заголовок, Время показа в секундах
  console.log('Сообщение успешно показано.');
}

Чтобы запустить скрипт:

Сохраните изменения (значок дискеты или Ctrl+S/Cmd+S).

В выпадающем меню рядом с иконкой отладки (жук) выберите функцию showWelcomeToast.

Нажмите кнопку «Выполнить».

При первом запуске потребуется предоставить разрешения скрипту на доступ к вашим данным Google Sheets. Внимательно изучите запрашиваемые разрешения и подтвердите их.

Сохранение скрипта и его привязка к таблице

Проекты Apps Script сохраняются автоматически по мере внесения изменений, но рекомендуется использовать ручное сохранение (Ctrl+S/Cmd+S или иконка дискеты) перед запуском или закрытием редактора. Дайте вашему проекту осмысленное имя, кликнув на «Проект без названия» в левом верхнем углу.

Как упоминалось ранее, скрипт, созданный из меню «Расширения» > «Apps Script», уже привязан к конкретной таблице. Эта привязка дает скрипту специальные методы, такие как SpreadsheetApp.getActiveSpreadsheet(), для прямого взаимодействия с этой таблицей.

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

Автоматическая отправка email-уведомлений

Скрипт для мониторинга бюджета рекламной кампании и отправки уведомления при превышении порога:

/**
 * Проверяет бюджет рекламной кампании в ячейке B2
 * и отправляет email-уведомление при превышении лимита.
 *
 * @param {number} budgetLimit Максимально допустимый бюджет.
 * @param {string} recipientEmail Email получателя уведомления.
 */
function checkCampaignBudget(budgetLimit = 1000, recipientEmail = 'your_email@example.com') {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet(); // Или ss.getSheetByName('Campaign Data');

  // Получаем текущие расходы из ячейки B2
  const budgetCell = sheet.getRange('B2');
  const currentSpending = budgetCell.getValue();

  // Проверяем, является ли значение числом
  if (typeof currentSpending !== 'number') {
    console.error('Значение в ячейке B2 не является числом.');
    return;
  }

  console.log(`Текущие расходы: ${currentSpending}, Лимит: ${budgetLimit}`);

  // Проверяем превышение бюджета
  if (currentSpending > budgetLimit) {
    const subject = `Превышен бюджет кампании в таблице: ${ss.getName()}`;
    const body = `Бюджет кампании превышен!

Текущие расходы: ${currentSpending}
Установленный лимит: ${budgetLimit}

Таблица: ${ss.getUrl()}`;

    try {
      MailApp.sendEmail(recipientEmail, subject, body);
      console.log(`Уведомление отправлено на ${recipientEmail}`);
    } catch (error) {
      console.error(`Ошибка отправки email: ${error}`);
    }
  } else {
    console.log('Бюджет в пределах нормы.');
  }
}

// Для запуска этой функции можно настроить временной триггер
// (например, ежедневно проверять бюджет)
Реклама

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

Пользовательские функции позволяют использовать ваши скрипты прямо в ячейках таблицы, как стандартные функции (SUM, VLOOKUP).

/**
 * Извлекает значение указанного UTM-параметра из URL.
 *
 * @param {string} url URL для анализа.
 * @param {string} parameterName Имя UTM-параметра (например, 'utm_source').
 * @return {string} Значение параметра или пустая строка, если параметр не найден.
 * @customfunction
 */
function GET_UTM_PARAMETER(url, parameterName) {
  if (!url || !parameterName) {
    return '';
  }
  try {
    // Используем регулярное выражение для поиска параметра
    const regex = new RegExp('[?&]' + parameterName + '=([^&#]*)');
    const results = regex.exec(url);
    // Декодируем найденное значение
    return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
  } catch (e) {
    return ''; // Возвращаем пустое значение в случае ошибки
  }
}

// Использование в ячейке: =GET_UTM_PARAMETER(A1; "utm_medium")

Импорт данных из внешних источников

Импорт данных о курсах валют из публичного API.

/**
 * Получает текущий курс USD к RUB с использованием публичного API
 * и записывает его в ячейку C1.
 */
function fetchExchangeRate() {
  const apiUrl = 'https://api.exchangerate-api.com/v4/latest/USD'; // Пример API
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  const targetCell = sheet.getRange('C1');

  try {
    const response = UrlFetchApp.fetch(apiUrl, { 'muteHttpExceptions': true });
    const responseCode = response.getResponseCode();
    const jsonResponse = response.getContentText();

    if (responseCode === 200) {
      const data = JSON.parse(jsonResponse);
      const rate = data.rates.RUB;

      if (rate) {
        targetCell.setValue(rate);
        console.log(`Курс USD/RUB (${rate}) успешно записан в ячейку C1.`);
      } else {
        console.error('Не удалось найти курс RUB в ответе API.');
      }
    } else {
      console.error(`Ошибка запроса к API. Код: ${responseCode}, Ответ: ${jsonResponse}`);
    }
  } catch (error) {
    console.error(`Не удалось выполнить запрос к API: ${error}`);
    targetCell.setValue('Ошибка API');
  }
}

Автоматическая обработка данных и форматирование

Скрипт для форматирования строк с лидами из определенного источника.

/**
 * Находит строки, где значение в колонке B (Источник) равно 'Google Ads',
 * и выделяет их фон желтым цветом, а текст делает полужирным.
 */
function formatGoogleAdsLeads() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  const range = sheet.getDataRange(); // Получаем весь диапазон с данными
  const values = range.getValues();
  const sourceColumnIndex = 1; // Индекс колонки B (нумерация с 0)
  const targetSource = 'Google Ads';

  console.log(`Начинаем обработку ${values.length} строк.`);

  // Проходим по всем строкам, начиная со второй (пропускаем заголовок)
  for (let i = 1; i < values.length; i++) {
    const row = values[i];
    const source = row[sourceColumnIndex];

    if (source === targetSource) {
      // Получаем диапазон текущей строки (нумерация строк в getRange с 1)
      const rowRange = sheet.getRange(i + 1, 1, 1, sheet.getLastColumn());
      try {
        rowRange.setBackground('#FFFF00'); // Желтый фон
        rowRange.setFontWeight('bold'); // Полужирный шрифт
        console.log(`Строка ${i + 1} отформатирована (Источник: ${source}).`);
      } catch(e) {
        console.error(`Ошибка форматирования строки ${i + 1}: ${e}`);
      }
    }
  }
  console.log('Обработка завершена.');
}

Отладка и устранение неполадок в Google Apps Script

Использование логов для отслеживания выполнения скрипта

Логирование — ключевой инструмент для понимания хода выполнения скрипта и диагностики проблем. Используйте console.log() (рекомендуется для нового V8 runtime) или Logger.log() (старый Rhino runtime) для вывода значений переменных или сообщений о статусе.

Просмотреть логи можно на вкладке «Выполнения» в левой панели редактора. Выберите конкретное выполнение, чтобы увидеть его статус и подробные логи.

Инструменты отладки в редакторе скриптов

Редактор предоставляет встроенный отладчик:

Точки останова (Breakpoints): Кликните на номер строки слева от кода, чтобы установить точку останова. Выполнение скрипта приостановится на этой строке.

Пошаговое выполнение: После остановки на точке останова используйте кнопки «Шаг с обходом» (F10), «Шаг с заходом» (F11), «Шаг с выходом» (Shift+F11) для детального контроля выполнения.

Инспекция переменных: В режиме отладки можно навести курсор на переменную или использовать панель «Отладчик» для просмотра текущих значений переменных в области видимости.

Запускайте скрипт в режиме отладки, нажав кнопку «Отладка» (значок жука).

Поиск и исправление распространенных ошибок

Ошибки разрешений (Authorization): Убедитесь, что скрипту предоставлены все необходимые разрешения. Иногда требуется повторная авторизация после добавления новых служб (например, MailApp).

Опечатки и синтаксические ошибки: Редактор подсвечивает многие ошибки, но внимательно проверяйте имена переменных, функций и методов.

Неправильные диапазоны (Range): Ошибки типа «Range not found» часто возникают из-за неправильного имени листа или неверных координат ячеек/диапазонов.

Лимиты и квоты Google Services: Скрипты имеют ограничения на время выполнения, количество вызовов API, отправленных писем и т.д. Ознакомьтесь с квотами Apps Script. Используйте Utilities.sleep() для добавления пауз между вызовами API, если это необходимо.

Типы данных: JavaScript имеет динамическую типизацию, что может приводить к ошибкам. Убедитесь, что операции выполняются с ожидаемыми типами данных (например, не пытайтесь выполнить математические операции со строками без преобразования).

Проблемы с API: Внешние API могут быть недоступны или изменять формат ответа. Реализуйте надежную обработку ошибок (try...catch) и проверяйте коды ответа HTTP при использовании UrlFetchApp.


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