Google Apps Script: Как создать класс?

Что такое класс и зачем он нужен?

Класс – это чертеж или шаблон для создания объектов. Объект, в свою очередь, является экземпляром класса. Классы позволяют структурировать код, делая его более организованным, переиспользуемым и удобным в поддержке. В Google Apps Script, как и в других языках программирования, поддерживающих объектно-ориентированное программирование (ООП), классы предоставляют возможность создавать собственные типы данных с определенными свойствами (данными) и методами (действиями).

Основные принципы объектно-ориентированного программирования (ООП)

ООП базируется на нескольких ключевых принципах:

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

Наследование: Создание новых классов на основе существующих, что позволяет повторно использовать код и создавать иерархии классов.

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

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

Применение классов в Google Apps Script дает следующие преимущества:

Улучшение структуры кода: Код становится более модульным и легче читается.

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

Облегчение поддержки и отладки: Изменения в классе не затрагивают остальную часть кода, если не меняется интерфейс.

Возможность создания сложных иерархий объектов: Упрощает разработку больших и сложных приложений.

Создание класса в Google Apps Script: Синтаксис и структура

Объявление класса с использованием `class`

Для объявления класса в Google Apps Script используется ключевое слово class:

/**
 * Представляет собой класс для работы с рекламными кампаниями Google Ads.
 */
class GoogleAdsCampaign {
  constructor(campaignId: string, campaignName: string) {
    // ...
  }
}

Определение свойств класса (переменные экземпляра)

Свойства класса – это переменные, хранящие данные, связанные с конкретным экземпляром класса.

class GoogleAdsCampaign {
  /**
   * Идентификатор рекламной кампании.
   */
  campaignId: string;

  /**
   * Название рекламной кампании.
   */
  campaignName: string;

  constructor(campaignId: string, campaignName: string) {
    this.campaignId = campaignId;
    this.campaignName = campaignName;
  }
}

Определение методов класса (функции экземпляра)

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

class GoogleAdsCampaign {
  campaignId: string;
  campaignName: string;

  constructor(campaignId: string, campaignName: string) {
    this.campaignId = campaignId;
    this.campaignName = campaignName;
  }

  /**
   * Возвращает название рекламной кампании.
   * @returns {string} - Название кампании.
   */
  getCampaignName(): string {
    return this.campaignName;
  }

  /**
   * Устанавливает новое название для рекламной кампании.
   * @param {string} newName - Новое название кампании.
   */
  setCampaignName(newName: string): void {
    this.campaignName = newName;
  }
}

Конструктор класса: `constructor()`

Конструктор – это специальный метод, который вызывается при создании нового экземпляра класса. Он используется для инициализации свойств объекта.

class GoogleAdsCampaign {
  campaignId: string;
  campaignName: string;

  constructor(campaignId: string, campaignName: string) {
    this.campaignId = campaignId;
    this.campaignName = campaignName;
  }
}

Создание экземпляров класса и работа с ними

Создание нового объекта класса с помощью `new`

Для создания нового экземпляра класса используется ключевое слово new.

const myCampaign = new GoogleAdsCampaign("12345", "Моя кампания");

Доступ к свойствам и методам экземпляра класса

Доступ к свойствам и методам объекта осуществляется через оператор ..

const campaignName = myCampaign.getCampaignName(); // Получаем название кампании
Logger.log(campaignName); // Выводим название в лог
myCampaign.setCampaignName("Новое название кампании"); // Изменяем название
Logger.log(myCampaign.campaignName); // Выводим новое название
Реклама

Передача аргументов в конструктор класса

В конструктор класса можно передавать аргументы, необходимые для инициализации объекта. Эти аргументы указываются в скобках после имени класса при создании экземпляра.

const anotherCampaign = new GoogleAdsCampaign("67890", "Еще одна кампания");

Примеры использования классов в Google Apps Script

Пример 1: Класс для работы с Google Sheets (чтение/запись данных)

class SpreadsheetManager {
  spreadsheetId: string;
  sheetName: string;

  constructor(spreadsheetId: string, sheetName: string) {
    this.spreadsheetId = spreadsheetId;
    this.sheetName = sheetName;
  }

  /**
   * Возвращает данные из таблицы.
   * @returns {Array<Array>} - Данные из таблицы.
   */
  getData(): any[][] {
    const spreadsheet = SpreadsheetApp.openById(this.spreadsheetId);
    const sheet = spreadsheet.getSheetByName(this.sheetName);
    if (!sheet) {
      throw new Error(`Sheet '${this.sheetName}' not found.`);
    }
    return sheet.getDataRange().getValues();
  }

  /**
   * Записывает данные в таблицу.
   * @param {Array<Array>} data - Данные для записи.
   */
  writeData(data: any[][]): void {
    const spreadsheet = SpreadsheetApp.openById(this.spreadsheetId);
    const sheet = spreadsheet.getSheetByName(this.sheetName);
    if (!sheet) {
      throw new Error(`Sheet '${this.sheetName}' not found.`);
    }
    sheet.getDataRange().clearContent(); // Очищаем текущие данные
    sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
  }
}

// Пример использования:
// const sheetManager = new SpreadsheetManager("your_spreadsheet_id", "Sheet1");
// const data = sheetManager.getData();
// Logger.log(data);

Пример 2: Класс для работы с Google Calendar (создание/обновление событий)

class CalendarEventManager {
  calendarId: string;

  constructor(calendarId: string) {
    this.calendarId = calendarId;
  }

  /**
   * Создает новое событие в календаре.
   * @param {string} title - Название события.
   * @param {Date} startTime - Время начала события.
   * @param {Date} endTime - Время окончания события.
   */
  createEvent(title: string, startTime: Date, endTime: Date): void {
    CalendarApp.getCalendarById(this.calendarId).createEvent(title, startTime, endTime);
  }
}

// Пример использования:
// const eventManager = new CalendarEventManager("your_calendar_id");
// const now = new Date();
// const later = new Date(now.getTime() + 60 * 60 * 1000); // Через час
// eventManager.createEvent("Встреча", now, later);

Пример 3: Класс для отправки электронных писем (настройка шаблона)

class EmailSender {
  template: string;

  constructor(template: string) {
    this.template = template;
  }

  /**
   * Отправляет электронное письмо.
   * @param {string} recipient - Адрес получателя.
   * @param {object} data - Данные для подстановки в шаблон.
   */
  sendEmail(recipient: string, data: object): void {
    let message = this.template;
    for (const key in data) {
      if (data.hasOwnProperty(key)) {
        message = message.replace(new RegExp(`\{\{${key}\}\}`), data[key]);
      }
    }

    MailApp.sendEmail({
      to: recipient,
      subject: "Уведомление",
      htmlBody: message,
    });
  }
}

// Пример использования:
// const template = "

Здравствуйте, {{name}}!

Ваш заказ №{{orderId}} оформлен.

"; // const emailSender = new EmailSender(template); // const data = { name: "Иван", orderId: "12345" }; // emailSender.sendEmail("recipient@example.com", data);

Наследование и полиморфизм (краткий обзор)

Наследование: Создание подклассов

Наследование позволяет создать новый класс (подкласс), который наследует свойства и методы от существующего класса (суперкласса). Для этого используется ключевое слово extends.

class EnhancedGoogleAdsCampaign extends GoogleAdsCampaign {
  budget: number;

  constructor(campaignId: string, campaignName: string, budget: number) {
    super(campaignId, campaignName);
    this.budget = budget;
  }

  /**
   * Возвращает бюджет рекламной кампании.
   * @returns {number} - Бюджет кампании.
   */
  getBudget(): number {
    return this.budget;
  }
}

Полиморфизм: Переопределение методов

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

class EnhancedGoogleAdsCampaign extends GoogleAdsCampaign {
  budget: number;

  constructor(campaignId: string, campaignName: string, budget: number) {
    super(campaignId, campaignName);
    this.budget = budget;
  }

  /**
   * Возвращает название рекламной кампании (расширенная версия).
   * @returns {string} - Название кампании с добавлением информации о бюджете.
   */
  getCampaignName(): string {
    return super.getCampaignName() + ` (Бюджет: ${this.budget})`;
  }
}

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