Что такое Moment.js и зачем он нужен?
Moment.js – это мощная JavaScript-библиотека, предназначенная для парсинга, валидации, манипулирования и форматирования дат. Она значительно упрощает работу с датами и временем, предоставляя удобный и интуитивно понятный API. Вместо того, чтобы вручную обрабатывать строки и числа, представляющие даты, Moment.js позволяет работать с объектами Moment, которые содержат всю необходимую информацию и методы для работы с датами.
Преимущества использования Moment.js в Google Apps Script
Google Apps Script предоставляет встроенные средства для работы с датами (Date object), но они могут быть недостаточно удобными и функциональными для сложных задач. Moment.js предлагает ряд преимуществ:
Упрощение операций с датами: Выполняйте сложные операции, такие как добавление дней, вычитание месяцев, форматирование дат в различные строки, всего несколькими строками кода.
Улучшенная читаемость кода: Интуитивно понятный API делает код более читаемым и легким для понимания.
Широкий набор функций: Поддержка различных форматов дат, временных зон, локализации и многого другого.
Совместимость: Обеспечивает более предсказуемое и кросс-браузерное поведение, чем встроенный Date object.
Подключение Moment.js к Google Apps Script
К сожалению, напрямую подключить Moment.js через CDN или require() в Google Apps Script нельзя. Вместо этого, необходимо скопировать код Moment.js (обычно, минифицированную версию) непосредственно в ваш скрипт.
Скачайте минифицированную версию Moment.js с официального сайта или через CDN (например, jsDelivr).
В Google Apps Script создайте новый скрипт или откройте существующий.
Создайте новый файл в проекте (Файл -> Создать -> Скрипт).
Вставьте скачанный код Moment.js в этот файл. Переименуйте файл, например, в moment.gs.
Теперь вы можете использовать Moment.js в своем коде.
Основные операции с датами в Moment.js
Создание объектов Moment.js
/**
* Создает объект Moment.js с текущей датой и временем.
* @return {Moment} - Объект Moment.js.
*/
function createMomentNow() {
return moment();
}
/**
* Создает объект Moment.js из строки.
* @param {string} dateString - Строка, представляющая дату (например, '2023-10-27').
* @param {string} format - Формат даты (например, 'YYYY-MM-DD').
* @return {Moment} - Объект Moment.js или null, если строка недействительна.
*/
function createMomentFromString(dateString, format) {
return moment(dateString, format);
}
/**
* Создает объект Moment.js из объекта Date.
* @param {Date} dateObject - Объект Date.
* @return {Moment} - Объект Moment.js.
*/
function createMomentFromDate(dateObject) {
return moment(dateObject);
}
//Пример
function exampleCreateMoment() {
let now = createMomentNow();
Logger.log(now.format('YYYY-MM-DD HH:mm:ss'));
let fromString = createMomentFromString('2023-11-15', 'YYYY-MM-DD');
Logger.log(fromString.format('DD.MM.YYYY'));
let dateObj = new Date();
let fromDateObj = createMomentFromDate(dateObj);
Logger.log(fromDateObj.format('YYYY/MM/DD'));
}Форматирование дат и времени
Moment.js предоставляет гибкие возможности для форматирования дат и времени с использованием маркеров. Некоторые из наиболее распространенных маркеров:
YYYY: Год (4 цифры)
MM: Месяц (2 цифры)
DD: День месяца (2 цифры)
HH: Час (24-часовой формат)
mm: Минуты
ss: Секунды
/**
* Форматирует объект Moment.js в строку.
* @param {Moment} momentObject - Объект Moment.js.
* @param {string} formatString - Строка формата (например, 'YYYY-MM-DD').
* @return {string} - Отформатированная строка даты.
*/
function formatMoment(momentObject, formatString) {
return momentObject.format(formatString);
}
//Пример
function exampleFormatMoment() {
let now = moment();
Logger.log(formatMoment(now, 'YYYY-MM-DD HH:mm:ss')); // 2023-10-27 10:30:00 (пример)
Logger.log(formatMoment(now, 'DD/MM/YYYY')); // 27/10/2023
Logger.log(formatMoment(now, 'MMMM Do, YYYY')); // October 27th, 2023
}Манипуляции с датами (добавление, вычитание)
/**
* Добавляет дни к объекту Moment.js.
* @param {Moment} momentObject - Объект Moment.js.
* @param {number} days - Количество дней для добавления.
* @return {Moment} - Новый объект Moment.js с добавленными днями.
*/
function addDaysToMoment(momentObject, days) {
return momentObject.clone().add(days, 'days'); // .clone() чтобы не изменять исходный объект
}
/**
* Вычитает месяцы из объекта Moment.js.
* @param {Moment} momentObject - Объект Moment.js.
* @param {number} months - Количество месяцев для вычитания.
* @return {Moment} - Новый объект Moment.js с вычтенными месяцами.
*/
function subtractMonthsFromMoment(momentObject, months) {
return momentObject.clone().subtract(months, 'months');
}
//Пример
function exampleManipulateMoment() {
let now = moment();
let tomorrow = addDaysToMoment(now, 1);
Logger.log(tomorrow.format('YYYY-MM-DD'));
let lastMonth = subtractMonthsFromMoment(now, 1);
Logger.log(lastMonth.format('YYYY-MM'));
}Сравнение дат
/**
* Сравнивает два объекта Moment.js и возвращает true, если первая дата раньше второй.
* @param {Moment} momentObject1 - Первый объект Moment.js.
* @param {Moment} momentObject2 - Второй объект Moment.js.
* @return {boolean} - True, если первая дата раньше второй, иначе false.
*/
function isBeforeMoment(momentObject1, momentObject2) {
return momentObject1.isBefore(momentObject2);
}
/**
* Сравнивает два объекта Moment.js и возвращает true, если первая дата позже второй.
* @param {Moment} momentObject1 - Первый объект Moment.js.
* @param {Moment} momentObject2 - Второй объект Moment.js.
* @return {boolean} - True, если первая дата позже второй, иначе false.
*/
function isAfterMoment(momentObject1, momentObject2) {
return momentObject1.isAfter(momentObject2);
}
/**
* Сравнивает два объекта Moment.js и возвращает true, если даты равны.
* @param {Moment} momentObject1 - Первый объект Moment.js.
* @param {Moment} momentObject2 - Второй объект Moment.js.
* @return {boolean} - True, если даты равны, иначе false.
*/
function isEqualMoment(momentObject1, momentObject2) {
return momentObject1.isSame(momentObject2);
}
//Пример
function exampleCompareMoment() {
let date1 = moment('2023-10-26', 'YYYY-MM-DD');
let date2 = moment('2023-10-27', 'YYYY-MM-DD');
Logger.log(isBeforeMoment(date1, date2)); // true
Logger.log(isAfterMoment(date1, date2)); // false
Logger.log(isEqualMoment(date1, date2)); // false
}Примеры использования Moment.js в Google Apps Script
Предположим, вам нужно автоматизировать отправку отчетов в контекстной рекламе.
Получение текущей даты и времени в нужном формате
function getCurrentDateTime() {
let now = moment();
return now.format('YYYY-MM-DD HH:mm:ss');
}
function sendReport() {
let dateTime = getCurrentDateTime();
//Код для отправки отчета с указанием времени
Logger.log("Отчет отправлен: " + dateTime);
}Расчет разницы между двумя датами
/**
* Рассчитывает количество дней между двумя датами.
* @param {string} startDate - Начальная дата (YYYY-MM-DD).
* @param {string} endDate - Конечная дата (YYYY-MM-DD).
* @return {number} - Количество дней между датами.
*/
function calculateDaysBetween(startDate, endDate) {
let start = moment(startDate, 'YYYY-MM-DD');
let end = moment(endDate, 'YYYY-MM-DD');
return end.diff(start, 'days');
}
function analyzeCampaignPerformance(startDate, endDate) {
let days = calculateDaysBetween(startDate, endDate);
//Код для анализа кампании за указанный период
Logger.log("Анализ кампании за " + days + " дней");
}Преобразование даты из одного формата в другой
/**
* Преобразует дату из формата YYYY-MM-DD в формат DD.MM.YYYY.
* @param {string} dateString - Дата в формате YYYY-MM-DD.
* @return {string} - Дата в формате DD.MM.YYYY.
*/
function formatDate(dateString) {
let date = moment(dateString, 'YYYY-MM-DD');
return date.format('DD.MM.YYYY');
}
function displayAdStatistics(date) {
let formattedDate = formatDate(date);
//Код для отображения статистики за указанную дату
Logger.log("Статистика за " + formattedDate);
}Определение дня недели для заданной даты
/**
* Возвращает день недели для заданной даты.
* @param {string} dateString - Дата в формате YYYY-MM-DD.
* @return {string} - День недели (например, 'Понедельник').
*/
function getDayOfWeek(dateString) {
let date = moment(dateString, 'YYYY-MM-DD');
return date.format('dddd'); // 'dddd' возвращает полное название дня недели
}
function scheduleReport(date) {
let dayOfWeek = getDayOfWeek(date);
//Код для планирования отправки отчета в определенный день недели
Logger.log("Отчет запланирован на " + dayOfWeek);
}Продвинутые возможности Moment.js в Google Apps Script
Работа с временными зонами
Moment.js поддерживает работу с временными зонами с помощью плагина Moment Timezone. К сожалению, из-за особенностей Google Apps Script, напрямую использовать плагины может быть затруднительно. Рекомендуется использовать встроенные возможности Google Apps Script для работы с временными зонами в сочетании с Moment.js для форматирования и манипуляций.
Локализация Moment.js
Moment.js поддерживает локализацию, что позволяет отображать даты и время на разных языках. Аналогично временным зонам, подключение файлов локализации может быть сложным. Однако, можно скопировать необходимые функции локализации непосредственно в ваш скрипт.
Использование плагинов Moment.js
Подключение плагинов Moment.js в Google Apps Script может быть сложным, так как требует включения кода плагина непосредственно в ваш скрипт. Рассмотрите возможность использования основных функций Moment.js и, при необходимости, поиска альтернативных решений для функциональности, предоставляемой плагинами.
Заключение
Преимущества и ограничения Moment.js в Google Apps Script
Преимущества:
Удобный и интуитивно понятный API для работы с датами.
Широкий набор функций для форматирования, манипуляций и сравнения дат.
Улучшенная читаемость кода.
Ограничения:
Необходимость копирования кода Moment.js в скрипт.
Сложность подключения плагинов и файлов локализации.
Альтернативы Moment.js для работы с датами
Встроенный объект Date в JavaScript: Подходит для простых операций с датами, но может быть менее удобным для сложных задач.
Luxon: Еще одна библиотека для работы с датами, рассматриваемая как более современная альтернатива Moment.js, но также требующая подключения кода в Google Apps Script.
Рекомендации по использованию Moment.js в ваших проектах
Используйте Moment.js для задач, требующих сложного форматирования или манипуляций с датами.
Учитывайте ограничения Google Apps Script при подключении Moment.js и его плагинов.
Тщательно тестируйте свой код, чтобы убедиться в правильности работы с датами и временем.