Google Apps Script: Как Разобрать Дату и Время? Полное Руководство

Google Apps Script предоставляет мощные инструменты для работы с датами и временем, что особенно важно при автоматизации задач, связанных с обработкой данных, отчетами и планированием. Корректный разбор и манипуляция датами позволяют создавать надежные и эффективные скрипты.

Типы данных даты и времени в Apps Script (Date object)

В Google Apps Script для представления дат и времени используется объект Date. Этот объект основан на JavaScript Date и предоставляет стандартный набор методов для работы с датами.

Получение текущей даты и времени

Чтобы получить текущую дату и время, достаточно создать новый экземпляр объекта Date:

/**
 * Получает текущую дату и время.
 *
 * @return {Date} Текущая дата и время.
 */
function getCurrentDateTime(): Date {
  return new Date();
}

let now: Date = getCurrentDateTime();
console.log(now);

Основные методы объекта Date

Объект Date предоставляет множество методов для получения и установки различных компонентов даты и времени, например: getFullYear(), getMonth(), getDate(), getHours(), getMinutes(), getSeconds(), getMilliseconds(). Также есть методы set... для установки этих значений. Важно помнить, что getMonth() возвращает значение от 0 до 11 (где 0 — январь, 11 — декабрь).

Разбор даты и времени из строки

Использование Date.parse()

Метод Date.parse() пытается преобразовать строку в дату. Он возвращает количество миллисекунд, прошедших с 1 января 1970 года UTC до указанной даты, или NaN, если строка не может быть разобрана.

/**
 * Разбирает строку даты с помощью Date.parse().
 *
 * @param {string} dateString Строка даты.
 * @return {number} Количество миллисекунд или NaN.
 */
function parseDateString(dateString: string): number {
  return Date.parse(dateString);
}

let milliseconds: number = parseDateString("2024-10-27T10:00:00");
console.log(milliseconds); // Выведет количество миллисекунд

Использование Utilities.parseDate()

Utilities.parseDate() предоставляет более гибкий способ разбора дат, позволяя указать часовой пояс и формат строки. Этот метод особенно полезен при работе с данными из Google Sheets.

/**
 * Разбирает строку даты с использованием Utilities.parseDate().
 *
 * @param {string} dateString Строка даты.
 * @param {string} timeZone Часовой пояс.
 * @param {string} format Формат даты.
 * @return {Date} Объект Date.
 */
function parseDateWithFormat(dateString: string, timeZone: string, format: string): Date {
  return Utilities.parseDate(dateString, timeZone, format);
}

let date: Date = parseDateWithFormat("27.10.2024 10:00:00", "Europe/Moscow", "dd.MM.yyyy HH:mm:ss");
console.log(date); // Выведет разобранную дату

Обработка различных форматов даты и времени

Для успешного разбора даты важно знать формат, в котором она представлена. Используйте Utilities.parseDate() с соответствующим форматом. Наиболее распространенные форматы: yyyy-MM-dd, dd.MM.yyyy, MM/dd/yyyy и их комбинации с временем.

Обработка ошибок при разборе неверного формата даты

При попытке разбора строки, не соответствующей указанному формату, Utilities.parseDate() выдаст исключение. Рекомендуется оборачивать код разбора даты в блок try...catch для обработки таких ситуаций.

try {
  let date: Date = parseDateWithFormat("invalid date", "Europe/Moscow", "dd.MM.yyyy HH:mm:ss");
  console.log(date);
} catch (e) {
  console.error("Ошибка при разборе даты: " + e);
}

Форматирование даты и времени

Использование Utilities.formatDate()

Utilities.formatDate() позволяет представить дату в нужном формате. Необходимо указать объект Date, часовой пояс и формат строки.

/**
 * Форматирует дату в строку.
 *
 * @param {Date} date Объект Date.
 * @param {string} timeZone Часовой пояс.
 * @param {string} format Формат даты.
 * @return {string} Отформатированная строка даты.
 */
function formatDate(date: Date, timeZone: string, format: string): string {
  return Utilities.formatDate(date, timeZone, format);
}

let now: Date = new Date();
let formattedDate: string = formatDate(now, "Europe/Moscow", "dd.MM.yyyy HH:mm:ss");
console.log(formattedDate); // Выведет текущую дату и время в указанном формате

Спецификаторы формата даты и времени

Форматная строка состоит из спецификаторов, определяющих, как будут представлены различные компоненты даты и времени. Например:

yyyy — год (4 цифры)

MM — месяц (2 цифры)

dd — день (2 цифры)

Реклама

HH — час (2 цифры, 24-часовой формат)

mm — минута (2 цифры)

ss — секунда (2 цифры)

Примеры форматирования для разных задач

Для отображения даты в формате, принятом в России: dd.MM.yyyy

Для логирования времени: HH:mm:ss

Для создания имени файла с датой и временем: yyyyMMdd_HHmmss

Манипуляции с датами и временем

Добавление и вычитание дней, месяцев, лет

Для добавления или вычитания дней, месяцев или лет, можно использовать методы setDate(), setMonth(), setFullYear(). Важно учитывать, что изменение месяца может повлиять на день (например, при переходе с 31 января на февраль).

/**
 * Добавляет дни к дате.
 *
 * @param {Date} date Исходная дата.
 * @param {number} days Количество дней для добавления.
 * @return {Date} Новая дата.
 */
function addDays(date: Date, days: number): Date {
  let newDate: Date = new Date(date);
  newDate.setDate(date.getDate() + days);
  return newDate;
}

let tomorrow: Date = addDays(new Date(), 1);
console.log(tomorrow);

Вычисление разницы между датами

Разницу между двумя датами можно вычислить, получив их представление в виде количества миллисекунд, прошедших с 1 января 1970 года, и вычтя одно из другого. Результат необходимо перевести в нужные единицы (дни, часы и т.д.).

/**
 * Вычисляет разницу в днях между двумя датами.
 *
 * @param {Date} date1 Первая дата.
 * @param {Date} date2 Вторая дата.
 * @return {number} Разница в днях.
 */
function daysBetween(date1: Date, date2: Date): number {
  let diffInMs: number = Math.abs(date2.getTime() - date1.getTime());
  return diffInMs / (1000 * 60 * 60 * 24); // milliseconds -> seconds -> minutes -> hours -> days
}

let days: number = daysBetween(new Date("2024-10-26"), new Date("2024-10-27"));
console.log(days); // Выведет 1

Определение дня недели

Метод getDay() возвращает день недели (0 — воскресенье, 1 — понедельник и т.д.).

/**
 * Возвращает день недели.
 *
 * @param {Date} date Дата.
 * @return {number} День недели (0-6).
 */
function getDayOfWeek(date: Date): number {
  return date.getDay();
}

let dayOfWeek: number = getDayOfWeek(new Date());
console.log(dayOfWeek); // Выведет день недели

Определение, попадает ли дата в определенный период (например, в выходные)

Используйте getDay() для определения дня недели и проверьте, является ли он субботой (6) или воскресеньем (0).

Примеры практического использования

Разбор даты из Google Sheets

Предположим, у вас есть столбец с датами в формате dd.MM.yyyy в Google Sheets. Следующий код прочитает эти даты и преобразует их в объекты Date.

/**
 * Разбирает даты из Google Sheets.
 */
function parseDatesFromSheet(): void {
  let ss: GoogleAppsScript.Spreadsheet.Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet: GoogleAppsScript.Spreadsheet.Sheet = ss.getActiveSheet();
  let data: any[][] = sheet.getDataRange().getValues();

  // Предполагаем, что даты находятся в первом столбце (индекс 0).
  for (let i: number = 1; i < data.length; i++) { // Начинаем с 1, чтобы пропустить заголовки.
    let dateString: string = data[i][0];
    try {
      let date: Date = Utilities.parseDate(dateString, Session.getTimeZone(), "dd.MM.yyyy");
      console.log(date);
      // Здесь можно выполнять другие действия с датой, например, записывать в другой столбец.
    } catch (e) {
      console.error("Ошибка при разборе даты в строке " + (i + 1) + ": " + e);
    }
  }
}

Автоматическое форматирование даты при записи в Google Sheets

Этот код автоматически форматирует дату при ее записи в Google Sheets.

/**
 * Форматирует дату при записи в Google Sheets.
 *
 * @param {GoogleAppsScript.Events.SheetsOnEditEvent} e Объект события onEdit.
 */
function onEdit(e: GoogleAppsScript.Events.SheetsOnEditEvent): void {
  let sheet: GoogleAppsScript.Spreadsheet.Sheet = e.range.getSheet();
  let column: number = e.range.getColumn();
  let row: number = e.range.getRow();
  let value: any = e.value;

  // Предполагаем, что столбец с датами - второй (индекс 2).
  if (column === 2) {
    try {
      let date: Date = new Date(value);
      let formattedDate: string = Utilities.formatDate(date, Session.getTimeZone(), "dd.MM.yyyy");
      sheet.getRange(row, column).setValue(formattedDate);
    } catch (e) {
      // Обработка ошибок, если введенное значение не является датой.
      console.error("Ошибка при форматировании даты: " + e);
    }
  }
}

Преобразование даты и времени для API

При работе с API часто требуется представлять дату и время в определенном формате, например, в формате ISO 8601.

/**
 * Преобразует дату в формат ISO 8601.
 *
 * @param {Date} date Дата.
 * @return {string} Дата в формате ISO 8601.
 */
function convertToISO8601(date: Date): string {
  return Utilities.formatDate(date, "UTC", "yyyy-MM-dd'T'HH:mm:ss'Z'");
}

let isoDate: string = convertToISO8601(new Date());
console.log(isoDate);

Это руководство предоставляет основные сведения о работе с датами и временем в Google Apps Script. Используя эти знания, вы сможете создавать мощные и гибкие скрипты для автоматизации различных задач.


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