Дни рождения в Google Календаре с обозначением возраста

от автора

Уже много лет я пользуюсь Гугл календарем. Всегда было непонятно, почему в нем не отображается возраст людей из Google Контактов в момент наступления дня рождения, годовщины или других значимых событий.

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

Почему именно гугл скрипты?

Не хотелось использовать какую-то стороннюю платформу или сервис, ведь все мои контакты находятся в адресной книге гугла. Также не хотелось пользоваться приложением или дополнением, которое бы собирало какие либо мои персональные данные для использования в непонятных целях. Нужна была прозрачная работающая структура.

Где код?

Не могу сказать что скрипт написан с нуля — я воспользовался наработками Bryan Patterson, которые были опубликованы аж 6 лет назад, в 2014 году.

Вот получившийся результат:

Birthdays and anniversaries with dates for your calendar.gs

// Глобальные переменные var contactsCal; var defaultCal; var now; var fromDate; var toDate; var events;  // Инициализация (function() {     contactsCal = CalendarApp.getCalendarById('addressbook#contacts@group.v.calendar.google.com');     defaultCal = CalendarApp.getDefaultCalendar(); // создаем события в календаре по умолчанию     // var defaultCal = CalendarApp.getCalendarById('regrncqXXXXXXp07eihepag74@group.calendar.google.com'); //или другой календарь      now = new Date();     fromDate = new Date(now.getTime());     toDate = new Date(now.getTime() + 31 * (1000 * 60 * 60 * 24)); // + 31 дней от текущей даты     Logger.log('С даты: ' + Utilities.formatDate(fromDate, 'Asia/Yekaterinburg', 'MMMM dd, yyyy HH:mm:ss Z'));     Logger.log('По дату: ' + Utilities.formatDate(toDate, 'Asia/Yekaterinburg', 'MMMM dd, yyyy HH:mm:ss Z'));     events = contactsCal.getEvents(fromDate, toDate);     Logger.log('Найдено событий: ' + events.length); })();  function birthdayAgeToCalendar() { //дни рождения     for (var i in events) {         Logger.log('birthdayAgeToCalendar. дни рождения. Найдено: ' + events[i].getTitle());         var name = events[i].getTitle().split(" – день рождения")[0];         var contacts = ContactsApp.getContactsByName(name);         Logger.log('birthdayAgeToCalendar. дни рождения. Name: ' + name);          for (var c in contacts) {             var bday = contacts[c].getDates(ContactsApp.Field.BIRTHDAY);             var bdayMonthName, bdayYear, bdayDate;             try {                 bdayMonthName = bday[0].getMonth();                 bdayYear = bday[0].getYear();                 bdayDate = new Date(bdayMonthName + ' ' + bday[0].getDay() + ', ' + bdayYear);                 Logger.log('birthdayAgeToCalendar. bdayDate: ' + bdayDate);             } catch (error) {}              var years = parseInt(new Date().getFullYear()) - bdayYear;             try {                 defaultCal.createAllDayEvent(name + " – день рождения, " + years + " лет (года)",                     new Date(bdayMonthName + ' ' + bday[0].getDay() + ', ' + new Date().getFullYear()));                 Logger.log("Создано: " + name + " – день рождения, " + years + " лет (года)");             } catch (error) {}         }     } }  function anniversaryAgeToCalendar() { //юбилеи     for (var i in events) {         Logger.log('anniversaryAgeToCalendar. Юбилеи. Найдено: ' + events[i].getTitle());         var name = events[i].getTitle().split("Юбилей у пользователя ")[1];         var contacts = ContactsApp.getContactsByName(name);         Logger.log('anniversaryAgeToCalendar. юбилеи. Name: ' + name);          for (var c in contacts) {             var bday = contacts[c].getDates(ContactsApp.Field.ANNIVERSARY); //существующие типы данных https://developers.google.com/apps-script/reference/contacts/field             var bdayMonthName, bdayYear, bdayDate;             try {                 bdayMonthName = bday[0].getMonth();                 bdayYear = bday[0].getYear();                 bdayDate = new Date(bdayMonthName + ' ' + bday[0].getDay() + ', ' + bdayYear);                 Logger.log('anniversaryAgeToCalendar. bdayDate: ' + bdayDate);             } catch (error) {}              var years = parseInt(new Date().getFullYear()) - bdayYear;             try {                 defaultCal.createAllDayEvent("Юбилей у пользователя " + name + ", " + years + " лет (года)",                     new Date(bdayMonthName + ' ' + bday[0].getDay() + ', ' + new Date().getFullYear()));                 Logger.log("Создано: " + "Юбилей у пользователя " + name + ", " + years + " лет (года)");             } catch (error) {}         }     } }  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("birthdayAgeToCalendar") //дни рождения         .timeBased()         .onMonthDay(1) //день месяца         .atHour(1)         .create();     ScriptApp.newTrigger("anniversaryAgeToCalendar") //юбилеи         .timeBased()         .onMonthDay(1)         .atHour(2)         .create(); }

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

1.Создайте новый Google Apps Script на гугл диске:

2.Скопируйте код скрипта.

3.Тестово запустите функцию “birthdayAgeToCalendar” — скрипт создаст события в календаре по умолчанию с указанием возраста для людей, у которых в течении 31 дня (но в текущем году) будет день рождение:

4.Посмотрите Вид/Журналы:

5.Проверьте календарь:

6.Если всё в порядке запустите функцию “TriggersCreateTimeDriven” — она создаст автозапуск функций “birthdayAgeToCalendar” и “anniversaryAgeToCalendar” на каждое первое число на месяц вперед.

Итог

Считаю, что проблема отображения возраста в Гугл календаре при наступлении значимых событий решена. Также я хочу поблагодарить Евгения Намоконова (телеграм канал “Google Таблицы”) и Александра Иванова вместе с его телеграм каналом за помощь в напутствии и редактировании написанного кода.

Дополнительные подробности можно найти на GitHub.

Автор: Михаил Шардин,
25 декабря 2019 г.


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


Комментарии

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

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