Как использовать Moment.js в Google Apps Script для работы с датами?

Что такое 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 и его плагинов.

Тщательно тестируйте свой код, чтобы убедиться в правильности работы с датами и временем.


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