Google Apps Script для начинающих: с чего начать?

Определение и основные возможности Google Apps Script

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

Ключевые возможности:

Интеграция: Глубокая интеграция со всеми сервисами Google Workspace.

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

Внешние сервисы: Взаимодействие с внешними API и базами данных через сервисы UrlFetchApp и Jdbc.

Расширения: Создание дополнений (Add-ons) для Google Workspace Marketplace.

Преимущества использования Google Apps Script для автоматизации задач

Использование GAS предоставляет ряд существенных преимуществ:

Низкий порог входа: Основан на JavaScript, широко известном языке программирования.

Бессерверная архитектура: Нет необходимости управлять серверами или инфраструктурой.

Централизация: Весь код и управление триггерами находятся в экосистеме Google.

Экономия времени: Автоматизация рутинных операций высвобождает ресурсы для более сложных задач.

Гибкость: Позволяет создавать кастомные решения, точно соответствующие бизнес-требованиям.

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

Маркетинг: Автоматическая рассылка персонализированных email-кампаний на основе данных из Google Таблиц; сбор данных из веб-форм и их запись в CRM-подобную структуру в Таблицах; парсинг данных из отчетов рекламных систем через API.

Аналитика: Загрузка данных из внешних источников (API) в Google Таблицы для дальнейшего анализа; автоматическое обновление сводных таблиц и диаграмм; генерация кастомных отчетов в Google Документах или Презентациях.

Документооборот: Создание документов (договоров, счетов) по шаблону с подстановкой данных из Таблиц; управление доступом к файлам на Google Диске; автоматическое архивирование старых файлов.

Начало работы: подготовка к использованию Google Apps Script

Необходимые инструменты и доступ к Google Workspace

Для начала работы с Google Apps Script достаточно иметь аккаунт Google (личный Gmail или корпоративный Google Workspace). Специализированное ПО не требуется, так как разработка ведется в веб-редакторе.

Открытие редактора Google Apps Script: несколько способов

Напрямую: Перейти по адресу script.google.com.

Из Документа/Таблицы/Презентации/Формы: В меню выбрать Инструменты -> Редактор скриптов (Tools -> Script editor). Созданный таким образом скрипт будет привязан к конкретному файлу (container-bound script).

Из Google Drive: Создать новый файл Еще -> Google Apps Script.

Обзор интерфейса редактора: основные элементы и функции

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

Панель слева: Список файлов проекта (.gs для кода, html для веб-интерфейсов, appsscript.json — манифест проекта).

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

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

Сервисы: Доступные API Google (SpreadsheetApp, GmailApp и др.).

Триггеры: Настройка автоматического запуска скриптов.

Журналы: Просмотр логов выполнения (Logger.log, console.log) и ошибок.

Настройки проекта: Управление областью видимости OAuth, часовым поясом и др.

Первый скрипт: основы синтаксиса и логики

Базовый синтаксис JavaScript (переменные, типы данных, операторы)

Google Apps Script использует JavaScript версии ES5, с частичной поддержкой возможностей ES6 и более поздних версий. Важно понимать:

Переменные: Объявление с помощью var, let, const.

Типы данных: string, number, boolean, object, array, null, undefined.

Операторы: Арифметические (+, -, *, /), сравнения (==, ===, !=, !==, >, <), логические (&&, ||, !).

Структуры управления: Условия (if...else), циклы (for, while, do...while).

Функции: Основа любого скрипта GAS.

JSDoc: Используйте аннотации JSDoc для указания типов данных, что улучшает читаемость и автодополнение в редакторе.

/**
 * Пример функции с использованием JSDoc для типизации.
 * @param {string} name Имя пользователя.
 * @param {number} age Возраст пользователя.
 * @returns {string} Приветственное сообщение.
 */
function greetUser(name, age) {
  const message = `Привет, ${name}! Вам ${age} лет.`;
  Logger.log(message); // Вывод в журнал выполнения
  return message;
}

Основные объекты и методы Google Apps Script

Взаимодействие с сервисами Google происходит через глобальные объекты:

SpreadsheetApp: Работа с Google Таблицами (getActiveSpreadsheet(), getSheetByName(name), getRange(a1Notation), getValue(), setValue(value), appendRow(rowContents)).

DocumentApp: Работа с Google Документами (getActiveDocument(), getBody(), appendParagraph(text), replaceText(searchPattern, replacement)).

GmailApp: Отправка и чтение писем (sendEmail(recipient, subject, body), getInboxThreads()).

DriveApp: Работа с Google Диском (getFiles(), createFile(name, content)).

UrlFetchApp: Выполнение HTTP-запросов к внешним API (fetch(url, params)).

CacheService: Кеширование данных для ускорения выполнения.

PropertiesService: Хранение простых данных (настроек скрипта).

Написание простого скрипта: пример с записью данных в таблицу

/**
 * Записывает текущую дату и время в первую свободную строку
 * на листе 'Логи' активной Google Таблицы.
 */
function logTimestampToSheet() {
  // Получаем активную таблицу
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  // Получаем лист с именем 'Логи'. Если его нет, создаем.
  let sheet = ss.getSheetByName('Логи');
  if (!sheet) {
    sheet = ss.insertSheet('Логи');
    // Добавляем заголовок, если лист только что создан
    sheet.appendRow(['Timestamp', 'Message']);
  }

  // Получаем текущую дату и время
  const timestamp = new Date();
  const message = 'Script executed';

  // Добавляем новую строку с данными
  sheet.appendRow([timestamp, message]);

  Logger.log(`Timestamp logged to sheet 'Логи': ${timestamp}`);
}
Реклама

Запуск скрипта и проверка результатов

Сохраните скрипт (Ctrl+S или иконка дискеты).

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

Нажмите кнопку Выполнить (Run).

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

Проверка: Откройте Google Таблицу, к которой привязан скрипт (или активную, если скрипт автономный). Найдите лист Логи и убедитесь, что новая строка с датой и сообщением добавлена. Проверьте Журналы (Ctrl+Enter или Просмотр -> Журналы) на наличие сообщений Logger.log или ошибок.

Практические примеры для начинающих

Автоматическая отправка email уведомлений из Google Таблиц

/**
 * Отправляет email-уведомление, если значение в ячейке A1 на листе 'Dashboard'
 * превышает заданный порог.
 * @param {string} recipientEmail Адрес получателя уведомления.
 * @param {number} threshold Пороговое значение.
 */
function checkThresholdAndNotify(recipientEmail = 'your_email@example.com', threshold = 100) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Dashboard');
  if (!sheet) {
    Logger.log('Sheet "Dashboard" not found.');
    return;
  }

  const value = sheet.getRange('A1').getValue();

  // Проверяем, что значение является числом и превышает порог
  if (typeof value === 'number' && value > threshold) {
    const subject = `Превышен порог значения на Dashboard: ${value}`;
    const body = `Текущее значение в ячейке A1 (${value}) превысило установленный порог (${threshold}).\n\nИсточник: ${ss.getUrl()}`;

    try {
      GmailApp.sendEmail(recipientEmail, subject, body);
      Logger.log(`Notification sent to ${recipientEmail}. Value: ${value}`);
    } catch (e) {
      Logger.log(`Error sending email: ${e}`);
    }
  } else {
    Logger.log(`Value (${value}) does not exceed threshold (${threshold}). No notification sent.`);
  }
}

Запуск этого скрипта можно настроить по триггеру (например, ежедневно).

Создание копий Google Документов с заменой данных

/**
 * Создает копию Google Документа-шаблона и заменяет плейсхолдеры данными.
 * @param {string} templateId ID документа-шаблона.
 * @param {string} folderId ID папки для сохранения копии.
 * @param {object} data Объект с данными для замены (ключ - плейсхолдер, значение - текст для замены).
 * @param {string} newFileName Имя нового файла.
 * @returns {string | null} URL созданного документа или null в случае ошибки.
 */
function createDocFromTemplate(templateId, folderId, data, newFileName) {
  try {
    const templateFile = DriveApp.getFileById(templateId);
    const targetFolder = DriveApp.getFolderById(folderId);

    // Создаем копию шаблона
    const newFile = templateFile.makeCopy(newFileName, targetFolder);
    const doc = DocumentApp.openById(newFile.getId());
    const body = doc.getBody();

    // Заменяем плейсхолдеры вида {{key}}
    for (const key in data) {
      if (data.hasOwnProperty(key)) {
        body.replaceText(`{{${key}}}`, data[key]);
      }
    }

    doc.saveAndClose();
    Logger.log(`Document created: ${newFile.getUrl()}`);
    return newFile.getUrl();

  } catch (e) {
    Logger.log(`Error creating document: ${e}`);
    return null;
  }
}

// Пример вызова:
function testCreateDoc() {
  const templateId = 'YOUR_TEMPLATE_DOC_ID'; // Замените на ID вашего шаблона
  const folderId = 'YOUR_FOLDER_ID'; // Замените на ID папки
  const clientData = {
    client_name: 'ООО "Пример"',
    contract_date: new Date().toLocaleDateString('ru-RU'),
    amount: '15000 RUB'
  };
  const fileName = `Договор для ${clientData.client_name} от ${clientData.contract_date}`;

  createDocFromTemplate(templateId, folderId, clientData, fileName);
}

Импорт данных из внешнего источника в Google Таблицы

/**
 * Загружает данные из JSON API и записывает их на лист 'API Data'.
 * @param {string} apiUrl URL API эндпоинта.
 * @param {string} sheetName Имя листа для записи данных.
 */
function importDataFromApi(apiUrl = 'https://jsonplaceholder.typicode.com/users', sheetName = 'API Data') {
  try {
    const response = UrlFetchApp.fetch(apiUrl);
    const json = response.getContentText();
    const data = JSON.parse(json);

    if (!Array.isArray(data) || data.length === 0) {
      Logger.log('No data received or data is not an array.');
      return;
    }

    const ss = SpreadsheetApp.getActiveSpreadsheet();
    let sheet = ss.getSheetByName(sheetName);
    if (sheet) {
      sheet.clearContents(); // Очищаем лист перед записью новых данных
    } else {
      sheet = ss.insertSheet(sheetName);
    }

    // Получаем заголовки из ключей первого объекта
    const headers = Object.keys(data[0]);
    sheet.appendRow(headers);

    // Записываем данные
    data.forEach(item => {
      const row = headers.map(header => {
        // Обработка вложенных объектов (например, address)
        if (typeof item[header] === 'object' && item[header] !== null) {
          return JSON.stringify(item[header]);
        } else {
          return item[header];
        }
      });
      sheet.appendRow(row);
    });

    Logger.log(`Data imported successfully to sheet '${sheetName}'. Rows: ${data.length}`);

  } catch (e) {
    Logger.log(`Error fetching or processing API data: ${e}`);
  }
}

// Пример вызова:
function testImportData() {
  importDataFromApi();
}

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

Официальная документация Google Apps Script

Основной и наиболее полный источник информации. Содержит справочники по всем сервисам, руководства, примеры кода и информацию о квотах.

Google Apps Script Overview

Reference Documentation

Сообщества и форумы для разработчиков

Места, где можно задать вопросы, найти решения и обменяться опытом:

Stack Overflow: Используйте тег [google-apps-script].

Google Workspace Developer Community: Официальное сообщество разработчиков.

Курсы и туториалы для изучения Google Apps Script

Существует множество онлайн-ресурсов, блогов и видеоуроков. Ищите конкретные примеры и задачи, релевантные вашим потребностям. Для разработчиков уровня middle/senior часто бывает достаточно официальной документации и практических экспериментов.


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