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. Используя эти знания, вы сможете создавать мощные и гибкие скрипты для автоматизации различных задач.