Обзор Google Apps Script и его возможностей работы с датами
Google Apps Script – это облачный язык сценариев, который позволяет автоматизировать задачи в Google Workspace, такие как Google Sheets, Docs, Forms и другие. Одним из фундаментальных аспектов автоматизации является работа с датами. Google Apps Script предоставляет различные способы получения, форматирования и манипулирования датами, что критически важно для многих сценариев.
Зачем получать текущую дату в Google Apps Script: примеры использования
Получение текущей даты необходимо во множестве случаев:
Автоматическая простановка меток времени: Например, при записи данных в Google Sheets.
Планирование и создание уведомлений: Отправка уведомлений по электронной почте в определенные дни.
Создание отчетов: Формирование отчетов с указанием даты их создания.
Анализ данных за определенный период: Выборка данных из Google Analytics или рекламных платформ за текущий месяц.
Основные методы получения текущей даты
Использование объекта `Date()` для получения текущей даты и времени
Самый простой способ получить текущую дату и время – использовать конструктор Date():
/**
* Получает текущую дату и время.
* @return {Date} Объект Date с текущей датой и временем.
*/
function getCurrentDateTime(): Date {
return new Date();
}
let now: Date = getCurrentDateTime();
Logger.log(now); // Выводит текущую дату и время в лог.Получение текущей даты в определенной временной зоне (TimeZone)
Для работы с датами в определенной временной зоне используется Utilities.formatDate():
/**
* Получает текущую дату и время в указанной временной зоне.
* @param {string} timeZone Временная зона (например, 'GMT+3').
* @return {string} Отформатированная строка с датой и временем.
*/
function getCurrentDateTimeInTimeZone(timeZone: string): string {
let now: Date = new Date();
return Utilities.formatDate(now, timeZone, "yyyy-MM-dd HH:mm:ss");
}
let moscowTime: string = getCurrentDateTimeInTimeZone('GMT+3');
Logger.log(moscowTime); // Выводит текущую дату и время в московском времени.Разница между `new Date()` и `Utilities.formatDate()`
new Date(): Создает объект Date, представляющий текущую дату и время в UTC.
Utilities.formatDate(): Форматирует объект Date в строку в соответствии с указанным форматом и временной зоной. Это полезно, когда нужно представить дату в определенном виде или в конкретной временной зоне.
Форматирование даты и времени в Google Apps Script
Использование `Utilities.formatDate()` для форматирования даты
Функция Utilities.formatDate() является ключевой для форматирования дат. Она принимает объект Date, временную зону и шаблон формата.
Настройка формата даты: шаблоны форматирования
Шаблоны форматирования определяют, как будет выглядеть дата. Вот некоторые распространенные шаблоны:
yyyy: год (четыре цифры)
MM: месяц (две цифры)
dd: день (две цифры)
HH: час (24-часовой формат)
mm: минута
ss: секунда
Примеры форматирования даты для различных целей (отчеты, логи и т.д.)
/**
* Форматирует дату для отчета.
* @param {Date} date Объект Date для форматирования.
* @return {string} Отформатированная строка даты.
*/
function formatDateForReport(date: Date): string {
return Utilities.formatDate(date, Session.getTimeZone(), "dd.MM.yyyy");
}
/**
* Форматирует дату и время для логов.
* @param {Date} date Объект Date для форматирования.
* @return {string} Отформатированная строка даты и времени.
*/
function formatDateTimeForLog(date: Date): string {
return Utilities.formatDate(date, Session.getTimeZone(), "yyyy-MM-dd HH:mm:ss z");
}
let today: Date = new Date();
let reportDate: string = formatDateForReport(today);
let logTimestamp: string = formatDateTimeForLog(today);
Logger.log("Дата для отчета: " + reportDate);
Logger.log("Метка времени для лога: " + logTimestamp);Работа с датами: продвинутые техники
Добавление и вычитание дней, месяцев, лет из текущей даты
Для добавления или вычитания дней можно использовать методы объекта Date. Важно помнить, что методы setDate, setMonth, setFullYear изменяют дату «на месте» и могут привести к неожиданным результатам при неправильном использовании.
/**
* Добавляет указанное количество дней к дате.
* @param {Date} date Исходная дата.
* @param {number} days Количество дней для добавления.
* @return {Date} Новая дата с добавленными днями.
*/
function addDays(date: Date, days: number): Date {
let result: Date = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
let tomorrow: Date = addDays(new Date(), 1);
Logger.log("Завтра: " + tomorrow);Получение номера дня недели, месяца, года
Для получения номера дня недели, месяца или года используются методы объекта Date:
getDay(): Возвращает номер дня недели (0 — воскресенье, 6 — суббота).
getMonth(): Возвращает номер месяца (0 — январь, 11 — декабрь).
getFullYear(): Возвращает год (четыре цифры).
Сравнение дат в Google Apps Script
Для сравнения дат необходимо сравнивать их как числовые значения (количество миллисекунд с 1 января 1970 года):
/**
* Сравнивает две даты.
* @param {Date} date1 Первая дата.
* @param {Date} date2 Вторая дата.
* @return {number} 0, если даты равны, отрицательное число, если date1 date2.
*/
function compareDates(date1: Date, date2: Date): number {
return date1.getTime() - date2.getTime();
}
let dateA: Date = new Date('2024-01-01');
let dateB: Date = new Date('2024-01-02');
let comparisonResult: number = compareDates(dateA, dateB);
if (comparisonResult 0) {
Logger.log("dateA позже dateB");
} else {
Logger.log("dateA и dateB равны");
}Практические примеры использования текущей даты в Google Apps Script
Автоматическое создание меток времени в Google Sheets
/**
* Добавляет метку времени в активную ячейку Google Sheets.
*/
function addTimestampToSheet(): void {
let ss: GoogleAppsScript.Spreadsheet.Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
let sheet: GoogleAppsScript.Spreadsheet.Sheet = ss.getActiveSheet();
let cell: GoogleAppsScript.Spreadsheet.Range = sheet.getActiveCell();
let now: Date = new Date();
cell.setValue(Utilities.formatDate(now, Session.getTimeZone(), "yyyy-MM-dd HH:mm:ss"));
}Создание расписаний и уведомлений на основе текущей даты
Используя Utilities.formatDate() и ClockTriggerBuilder, можно создавать расписания для отправки уведомлений в определенное время:
/**
* Создает триггер для запуска функции в определенное время.
* @param {string} timeString Время в формате 'HH:mm'.
* @param {string} functionName Имя функции для запуска.
*/
function createTimeBasedTrigger(timeString: string, functionName: string): void {
let [hours, minutes] = timeString.split(':').map(Number);
let now: Date = new Date();
let triggerTime: Date = new Date(now.getFullYear(), now.getMonth(), now.getDate(), hours, minutes, 0);
if (triggerTime.getTime() <= now.getTime()) {
triggerTime.setDate(triggerTime.getDate() + 1); // Переносим на следующий день, если время уже прошло
}
ScriptApp.newTrigger(functionName)
.timeBased()
.at(triggerTime)
.create();
Logger.log("Триггер создан для запуска функции " + functionName + " в " + Utilities.formatDate(triggerTime, Session.getTimeZone(), "yyyy-MM-dd HH:mm:ss"));
}Автоматизация задач с учетом текущей даты
Например, можно автоматизировать процесс создания резервных копий Google Sheets в конце каждого месяца:
/**
* Создает резервную копию Google Sheets в конце каждого месяца.
*/
function backupSheetMonthly(): void {
let today: Date = new Date();
if (today.getDate() === new Date(today.getFullYear(), today.getMonth() + 1, 0).getDate()) { // Проверяем, последний ли это день месяца
let ss: GoogleAppsScript.Spreadsheet.Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
let fileName: string = ss.getName() + " - Backup - " + Utilities.formatDate(today, Session.getTimeZone(), "yyyy-MM-dd");
DriveApp.getRootFolder().createFile(ss.getAs('application/vnd.google-apps.spreadsheet').copyBlob(), fileName);
Logger.log("Резервная копия создана: " + fileName);
}
}