Гугл скрипт в помощь молодому отцу

от автора

Если у вас есть маленькие дети, один или несколько, то возможно вам будет интересен этот скрипт, который ежемесячно создаёт событие в гугл календаре, в котором точно указан возраст ребенка, а также указаны значимые вехи из жизни родителей.

С этим скриптом вам не придётся помнить даты, а ещё вам придёт оповещение стандартными средствами гугл календаря. Вот результат работы этого скрипта:

Созданное событие в Calendar with Google
Созданное событие в Calendar with Google

Перед вами улучшенная версия моего скрипта, который впервые был опубликован ещё в 2019 году на гитхабе. Вот его текущая редакция (нажмите ниже для раскрытия спойлера):

Google Calendar_A child’s age_v2.gs
/*  * Скрипт, который ежемесячно создаёт событие в гугл календаре, в котором точно указан возраст ребенка, а также значимые события из жизни родителей  * (c) 2022.01. Mikhail Shardin https://shardin.name/  *   * Дополнительные инструкции: https://habr.com/ru/post/645935/  * Исходное размещение: https://github.com/empenoso/Google-Apps-Script/   */  function AddCalendarCurrentAge() { //вычисляем значимые даты и добавляем всё это в выбраный календарь     eval(UrlFetchApp.fetch('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment-with-locales.min.js').getContentText());     moment.locale('ru');          const offset = 9;     var now = moment().add(offset, 'days'); // триггер из TriggersCreateTimeDriven работает в 1й день месяца, но сам день рождения ведь в другой день, то есть если день рождения ребёнка 9 числа, то offset = 9      const childBirthday = '2017-03-07'     var childFullYears = ~~(moment(now).diff(childBirthday, 'months', false) / 12)     childText = `Ребенок родился ${childFullYears} года и ${moment().diff(childBirthday, 'months', false)-childFullYears*12} месяцев назад.`      const fatherBirthday = '1991-06-15'     var fatherFullYears = ~~(moment(now).diff(fatherBirthday, 'months', false) / 12)     fatherText = `Папа родился ${fatherFullYears} лет и ${moment().diff(fatherBirthday, 'months', false)-fatherFullYears*12} месяцев назад.`      const motherBirthday = '1995-07-18'     var motherFullYears = ~~(moment(now).diff(motherBirthday, 'months', false) / 12)     motherText = `Мама родилась ${motherFullYears} лет и ${moment().diff(motherBirthday, 'months', false)-motherFullYears*12} месяцев назад.`      const relationshipStart = '2015-06-16'     const relationshipEnd = moment().format('YYYY-MM-DD') // или поставьте дату :(     var relationshipFullYears = ~~(moment(relationshipEnd).diff(relationshipStart, 'months', false) / 12)     relationshipText = `Отношениям ${relationshipFullYears} лет и ${moment(relationshipEnd).diff(relationshipStart, 'months', false)-relationshipFullYears*12} месяцев (с ${relationshipStart} по ${relationshipEnd}).`     Logger.log(childText + '\n' + fatherText + '\n' + motherText + '\n' + relationshipText);      // добавляем в календарь     var defaultCal = CalendarApp.getDefaultCalendar(); // создаем события в календаре по умолчанию     // var defaultCal = CalendarApp.getCalendarById('54r4muXXXXXXXXXvgh4vr2h8@group.calendar.google.com'); //или другом календаре. узнать идентификатор через функцию get_calendars ниже      var title = `Ребенку сегодня исполняется ${childFullYears} года и ${moment().diff(childBirthday, 'months', false)-childFullYears*12} месяцев`;     var event = defaultCal.createAllDayEvent(title,         new Date(now), {             location: "58.0100442,56.2275679",             description: motherText + '\n' + fatherText + '\n\n' + relationshipText         });     event.setColor(CalendarApp.EventColor.RED);     event.addPopupReminder(12 * 60 + 5 * 24 * 60); //за 5 дней }  function TriggersCreateTimeDriven() { //автоматически создаем новые триггеры для запуска     // Deletes all triggers in the current project.     var triggers = ScriptApp.getProjectTriggers();     for (var i = 0; i < triggers.length; i++) {         ScriptApp.deleteTrigger(triggers[i]);     }     // а теперь создаем     ScriptApp.newTrigger("AddCalendarCurrentAge")         .timeBased()         .onMonthDay(1) //триггер на 1й день месяца         .atHour(2)         .create(); }  //=================================================================================================  function getCalendars() { //получить список идентификаторов всех доступных календарей     var calendars = CalendarApp.getAllCalendars();     Logger.log('Этот пользователь подписан на %s календарей:', calendars.length);     for (var i = 0; i < calendars.length; i++) {         var calendar = calendars[i];         Logger.log((i + 1) + 'й календарь: "' + calendar.getName() + '",\n ID: "' + calendar.getId() + '"\n');     } }

Как пользоваться?

Для того, чтобы воспользоваться скриптом создайте новый скрипт через меню. Если у вас нет в меню такого пункта «Google Apps Script», то там же надо нажать «Подключить другие приложения» и в поиске найти «Google Apps Script» и подключить, тогда пункт в меню появится:

Создание файла скрипта
Создание файла скрипта

Скопируйте туда содержимое примера:

Содержимое файла скрипта
Содержимое файла скрипта

Тестово запустите функцию AddCalendarCurrentAge():

Тестовый запуск
Тестовый запуск

Теперь вам надо дать все необходимые разрешения, чтобы скрипт мог выполнять свою работу:

Окно авторизации при первом запуске
Окно авторизации при первом запуске

Перейдите в дополнительные настройки и просмотрите все разрешения:

Авторизация этого скрипта
Авторизация этого скрипта

Приложение запрашивает следующие разрешения:

  • Просмотр, изменение и безвозвратное удаление всех календарей, с которыми вы можете работать в Google Календаре, а также предоставление доступа к ним

  • Подключение к внешнему сервису

  • Работа приложения во время отсутствия пользователя

Нажмите «Разрешить», для того, чтобы начать использовать скрипт. Вы в любое время можете посмотреть список выданных вами разрешений на специальной странице и в один клик их отозвать.

После получения разрешения появится окно журнала выполнения:

Результат работы скрипта
Результат работы скрипта

Что в итоге?

В календаре появится созданная тестовая запись через 9 дней (это значение offset) от текущей даты:

Автоматически созданная запись
Автоматически созданная запись

Измените данные примера на свои собственные

После того, как всё заработало, просто внесите свои даты в код и исправьте имена:

Изменение данных и имён
Изменение данных и имён

После этого выполните функцию TriggersCreateTimeDriven() для того чтобы каждый раз 1го числа каждого месяца этот скрипт выполнялся автоматически, создавая событие в календаре на грядущий месяц:

Автопостановка триггера на исполнение
Автопостановка триггера на исполнение

После этого обязательно задайте offset. Если день рождение ребёнка приходится на 9 число, то этот параметр равен 9. Этот параметр — сдвиг в расчётах нужен потому что все расчёты будут выполняться первого числа каждого месяца, а день рождения, например, 9 числа:

Задание сдвига - ведь скрипт будет работать 1го числа, а ДР может быть в любой день месяца
Задание сдвига — ведь скрипт будет работать 1го числа, а ДР может быть в любой день месяца

Вот и всё! Автоматическая напоминалка создана.

Автор: Михаил Шардин,

18 января 2022 г.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
А вы помните сколько лет и сколько месяцев вашему ребёнку?
50% Помню сколько лет 11
13.64% Помню сколько месяцев 3
45.45% Нет детей 10
9.09% Смотреть варианты 2
Проголосовали 22 пользователя. Воздержался 1 пользователь.

ссылка на оригинал статьи https://habr.com/ru/post/645935/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *