Что такое класс и зачем он нужен?
Класс – это чертеж или шаблон для создания объектов. Объект, в свою очередь, является экземпляром класса. Классы позволяют структурировать код, делая его более организованным, переиспользуемым и удобным в поддержке. В 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})`;
}
}