Как добавить напоминания о днях рождениях в Google Календарь

Константин Докучаев
Константин Докучаев
Как добавить напоминания о днях рождениях в Google Календарь
PST

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

Решение проблемы на самом деле очень простое. Откройте Google Script и создайте в нём новые проект. Затем перейдите по этой ссылке. Из открывшегося скрипта скопируйте текст в новый проект:

Скопируйте код скрипта в новый проект
Скопируйте код скрипта в новый проект

Затем в меню «Ресурсы» выберите раздел «Дополнительные функции Google...». Здесь нужно включить «Calendar API» и нажать на ссылку консоли разработчика:

Открываем консоль рарзработчика
Открываем консоль рарзработчика

В строке поиска введите «calendar» и выберите «Google Calendar API» и на открывшейся странице нажмите «Включить»:

Включаем «Calendar API»
Включаем «Calendar API»

Закройте страницу «Диспетчера API» и на странице создания скрипта нажмите «OK» в окне дополнительных функций. Затем в меню «Выполнить» включите и разрешите доступ для «createTrigger:

Включаем скрипт
Включаем скрипт

После того как скрипт закончит выполняться, перейдите в Google Календарь. В правом верхнем углу нажмите на шестерёнку чтобы перейти в настройки:

Настройки календаря
Настройки календаря

И включите календарь «Birthday Notifications»:

Добавляем календарь с напоминаниями
Добавляем календарь с напоминаниями

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



41 comments
Avatar
Alexander Manaeff
Архиполезнейшая фича, спасибо!
Есть пара вопросов:

  1. При изменении данных контакта в контактах Гугл, его данные сразу же соответственно изменяются в календаре "Дни рождения", а в "Birthday reminder" - нет.
  2. При добавлении новых контактов с днями рождений они тоже не появляются в "Birthday reminder".
    Это так и должно быть?
    ... а если скрипт прогонять два раза вручную, то события в календаре "Birthday reminder" дублируются
    Спасибо
Hide Replies 1
Avatar
Dokuchaev Konstantin
Я бы и рад ответить, но я не писал скрипт. Можно спросить у его автора здесь https://github.com/nikhilkalige
Avatar
Alex Verden
Оооочень кривой скрипт.
Уведомления только через почту.
С 1 января по 1 апреля все нормально.
С 1 апреля по 7 октября - всё сместилось на 1 день влево.
С 8 октября по 31 декабря - ни одного дня рождения.
Больше геморроя, чем пользы.
Hide Replies 1
Avatar
Dokuchaev Konstantin
Сообщите об этом автору скрипта https://github.com/nikhilkalige . Он исправит
Avatar Placeholder
Странник
Едва ли данный способ рассчитан на массового пользователя т.к. надо немножко думать... )
Автор, думаю следует немного дополнить статью.
Попробую ответить на вопросы, которые проскакивали в комментариях:
"1. При изменении данных контакта в контактах
Гугл, его данные сразу же соответственно изменяются в календаре "Дни
рождения", а в "Birthday reminder" - нет.
2. При добавлении новых контактов с днями рождения они тоже не появляются в "Birthday reminder"."
Данный вариант предоставлен в виде скрипта, скрипт, что логично, отрабатывает только в момент запуска, соответственно для того, чтобы календари синхронизировались постоянно, необходимо создать задание (триггер), делается это в настройках скрипта.
--
"Уведомления только через почту."
Если необходимо получать уведомления отличные от тех что предусмотрены скриптом, нужно удалить из скрипта строку 55 (только не забудьте оставить точку с запятой). Далее все по инструкции и в настройках календаря настроить свои собственные уведомления, в том варианте, который будет удобен для вас.
--
"Оооочень кривой скрипт.
Уведомления только через почту.
С 1 января по 1 апреля все нормально.
С 1 апреля по 7 октября - всё сместилось на 1 день влево.
С 8 октября по 31 декабря - ни одного дня рождения.
Больше геморроя, чем пользы."
Смотреть первый вопрос, это все из одной оперы.
--
Важно так же в настройках календаря указать часовой пояс в котором вы живете!
Hide Replies 4
Avatar
Dokuchaev Konstantin
я бы и рад способ проще написать. Но его нет. За ответы спасибо
Avatar
Viktor Zdorenko
Помогите удалить все, что создал скрипт
Hide Replies 2
Avatar
Dokuchaev Konstantin
Просто отключите календарь в настройках или удалите его.
Hide Replies 1
Avatar
Viktor Zdorenko
Спасибо!
Avatar
Yury Smolsky
В предложенном скрипте есть ошибка: в строке 20 нужно заменить номер месяца "0" на "1". Иначе все январские уведомления задваиваются. И проверьте свой календарь уведомлений - лишние события можно удалить вручную.
Avatar Placeholder
Александр Кузнецов
Ребят, вроде нормально все отработало. С первого раза не все сделалось.Потом изменил по совету Yury Smolsky в 20 строке месяц с 0 на 1. И все сделалось. Но я не программер ни разу. Делал как мартышка. Ребят, опытные, посмотрите пожалуйста,а? Вроде триггер внизу есть, что типа каждый день запускается скрипт. Или я ошибаюсь? Автору респект. А гуглу я поражаюсь. Такая элементарная вещь не реализована годами!
Hide Replies 2
Avatar
Dokuchaev Konstantin
добавьте новое день рождение любому контакту. Если отработает, значит все ok
Hide Replies 1
Avatar Placeholder
Александр Кузнецов
  1. Нет. Сам он не работает. непонятно, что за кусок кода с созданием триггера.
  2. Непонятен кусок кода с почтой. Ничего на почту не приходит (и не надо)
  3. Триггер можно создать самому, в своих проектах. Этим и займусь.
    понял. В этом скрипте три функции. Запускаются каждая отдельно, а не все сразу друг за другом. Одна основная, вторая уведомления на почту, третья создает триггер, который будет выполнять основной скрипт каждый день!
Avatar Placeholder
Gvozd
Переработал этот скрипт с нуля
Убрал дублирование январских ДР
Поддержал обновление изменившихся контактов, и удаление для удаленных
https://gist.github.com/Gvozd/84f9c5ee011fc1344f21ac16db3c58b6
Важно: моя версия скрипта не совместима со скриптом из статьи - будет создан новый календарь
Также удалил нотификацию по мылу - считаю более уместным задавать ее в настройках календаря
К сожалению скриптом эти настройки не задаются - задайте вручную
Функция main - для одноразового запуска
createTrigger - для создания тригера
Hide Replies 16
Avatar
Dokuchaev Konstantin
Я правильно понимаю, что я могу заменить ссылку на ваш скрипт, убрать строку "В восьмой строке скрипта нужно поменять «Birthdays» на «Contacts»." и в остальном инструкция остается прежней?
Hide Replies 12
Avatar Placeholder
Gvozd
В целом да
Но нужно еще добавить пункт про нотификацию - ведь я убрал из скрипта навешивание нотификации на каждое событие
Вместо этого я вручную настроил нотификацию в настройках календаря
Только она почему-то не сработала
Мне нужен еще 1-2 дня, для настройки/проверки нотификации, и либо я дам уточненную инструкцию, либо добавлю нотификацию в скрипт
Hide Replies 11
Avatar
Dokuchaev Konstantin
Обновил пост, спасибо
Hide Replies 10
Avatar Placeholder
Gvozd
Вы можете пока вернуть старую версию поста?
Я еще не успел обновить скрипт, чтобы уведомления правильно работали
У гугла куча сложностей с уведомлениями для полнодневных событий, добавляемых через скрипт
Мне нужен еще 1-2 дня для того чтобы привести в порядок скрипт с новыми воркэраундами.
Я сообщу об исправленной версии скрипта, и дополнительные инструкции по настройке уведомлений
PS статья будет лучше смотреться со скриншотами нового скрипта
Хотя бы потому что у меня вызываемые функции называются по-другому
PPS думаю стоит упомянуть в статье, что главных функций 2 - выполнить сейчас, и создать тригер. Это было актуально и для предыдущего скрипта, о чем уже писал Странник
PPPS последний пункт про включение календаря тоже не верен
В моей версии скрипта он каждый день будет делаться обратно невидимым. Если это не нужно - нужно убрать строку .setHidden(true) из скрипта
Логика такая, что события этого календаря лучше не редактировать
А смотреть в календаре лучше оригинальный календарь дней рождения
Но это дело вкуса конечно
Hide Replies 9
Avatar
Dokuchaev Konstantin
вернул все обратно
Hide Replies 8
Avatar Placeholder
Gvozd
Обновил скрипт

  1. календарь не делается принудительно скрытым.
    Если нужно скрыть - нужно сделать это в настройках
  2. исправил работу с уведомлениями
    Теперь уведомления можно настроить в настройках календаря(для всех событий) в секции "Мероприятия на весь день"
    Таким образом, в отличии от изначального авторского скрипта можно задать уведомление в сам день рождения
  3. важно иметь ввиду, что синхронизация односторонняя
    Любые изменения в гугл-календаре будут удалены, и заменены изменениями из контактов
  4. Нужно упомянуть что скрипт состоит из двух главных функций - main и createTrigger
    Первая - для одноразового выполнения вручную
    Вторая - для того чтобы скрипт начал работать ежедневно, автоматически
    Это было актуально и для изначлаьного скрипта - о чем упоминал Странник
    В таком виде можно пользоваться
    PS Важно иметь ввиду, что уведомления на андроид могут запаздывать из-за настроек экономии батареи для приложения календаря. Это никак не связано со скриптом, и является особенностью андроида. Поэтому лучше продублировать уведомления на почту
Hide Replies 7
Avatar Placeholder
Александр Кузнецов
Спасибо! Скрипт отработал, календарь создался. Я так понимаю он создается без уведомлений? Т.е. уведомления надо настраивать уже под себя. Верно? И вопрос, конечно, не к скрипту, а так... может кто подскажет.... Если ставлю прошивку (MIUI) то этот календарь добавляется в калеyдарь MIUI и все хорошо. Но если прошивка уже стоит (как сейчас) и в гугле появляется новый календарь (как сейчас), то никак не получается его увидеть из MIUI. И не могу понять, что за фигня...
Hide Replies 6
Avatar Placeholder
Gvozd
Да, в моем варианте скрипта уведомления не проставляются
Проставить их правильно в скрипте вообще трудно для событий на весь день - гугл не дает нормального API
Предполагается их самому настроить в настройках календаря
По поводу неотображения - календарь точно не отмечен как скрытый?
Вы скопировали скрипт сегодня, после моего сегодняшнего коммента?
Если раньше - то календарь создавался скрытым.
Проверьте что у вас сейчас такой же скрипт, как моей моей ссылке - можете проверить по строке const {tmp, from, to} = getCalendars(); - раньше она бала другой
Если скрипт не совпадает, то рекомендую грохнуть старый календарь, и скопировать новую версию скрипта
В предыдущем моем варианте был ряд отличий в синхронизации, и багов с уведомлениями, и потому лучше грохнуть старый календарь
Ссылка на мой скрипт все та же - https://gist.github.com/Gvozd/84f9c5ee011fc1344f21ac16db3c58b6
Hide Replies 5
Avatar Placeholder
Александр Кузнецов
Спасибо ещё раз. 9 строка выглядит так: const {tmp, from, to} = getCalendars ();. Календарь создался, синхронизация заработала (это проблемы не скрипта, а системы). Сейчас добавил дни рождения некоторым контактам, завтра посмотрю
Avatar Placeholder
Александр Кузнецов
Сегодня стало ошибку выдавать. Exception: Служба была вызвана слишком много раз за короткий период времени: calendar. Попробуйте Utilities.sleep(1000) между вызовами.
at unknown function
at main(Код:11:6)
Hide Replies 3
Avatar Placeholder
Gvozd
Uploaded Image
Для использования нового скрипта нужно обязательно включить среду V8
Обернул все запросы в прогрессивную задержку от 10мс до 2сек
Думаю должно теперь всегда нормально работать
Ссылка на скрипт та же
Hide Replies 2
Avatar Placeholder
Александр Кузнецов
Спасибо большое. Новая среда была включена. Но за последние 4 суток 0 из 4 удачных выполнений. Сейчас заменил код. Скрипт отработал. Посмотрю как дальше по триггеру будет срабатывать.
Hide Replies 1
Avatar Placeholder
Gvozd
Новая среда была не нужна предыдущему скрипту, и ни на что не влияла.
Поэтому продолжало падать.
А вот новый скрипт без новой среды не запустился бы вообще.
PS У вас скорее всего от старых неудачных выполнений остались временные скрытые календари с именем "Temp calendar"
Вы можете увидеть их в настройках календаря, и их можно удалить
Avatar
Dokuchaev Konstantin
еще раз обновил пост
Avatar
Станислав Носырев
Спасибо за обновление. Первая загрузка (main) прошла успешно. Будем смотреть дальше.
Из пожеланий. Хотелось бы, чтобы у мероприятий не был статус "Занят" по-умолчанию, так как это часто мешает планированию (например, автоматическому, от Гугла). Ведь не все ДР моих контактов у меня заняты, да и не только у меня, думаю.
А исправлять каждое мероприятие и менять в нем статус сложно, так как ДР очень много.
Спасибо Вам за труд!
Hide Replies 1
Avatar Placeholder
Gvozd
К сожалению базовое API, используемое в скрипте не позволяет задать статус
Можно было бы использовать расширенное API, но данная проблема меня не беспокоит в данный момент, поэтому тратить время на доработку я не хочу
Скрипт я доводил до ума в первую очередь для себя, и он меня целиком устраивает в текущем виде.
По вашей проблеме сразу хочу предупредить, что вероятнее всего события будут пересозданы с нуля(а старые удалены), после нового года.
На 100% не могу сказать - с момента написания скрипта год еще не прошел)
Поэтому, вероятно вы потеряете свои ручные изменения в событиях
Avatar
Андрей Тимашов
желательно чуток обновить статью, прошло время и все выглядит немного по другому сейчас. Сделал все по инструкции но календарь такой не появился (
Hide Replies 1
Avatar
Dokuchaev Konstantin
Тут выше автор скрипта активно отвечает (Gvozd). Можно задать вопрос ему.
А что именно пошло не так? Я статью недавно обновлял.
Avatar Placeholder
Иван
А можно дополнить скрипт функцией автоматического добавления напоминания о ДР по умолчанию на тот же день на 09:00 для новых и дополненных контактов.
Hide Replies 1
Avatar Placeholder
Александр Кузнецов
Если появился новый контакт, то скрипт добавляет его ДР к календарю и все. А уж календарь у вас настроен на уведомление в тот же день в 9:00 в сам ДР. Разве нет? У меня так.
Avatar Placeholder
Александр Кузнецов
Случилась какая то ошибка. Что-то у меня за год насоздавалось календарей "Temp calendar" очень много. В ручную их удалять месяц, наверное. Можно попросить скрипт какой для их массового удаления? И вообще, это из-за ошибки или норма, что каждый день создается новый "Temp calendar"?
Hide Replies 2
Avatar Placeholder
Дмитрий Василенко
function getCalIdFromName(name) {
var cals = Calendar.CalendarList.list({showHidden:true,
minAccessRole:'owner', fields:'items(id,summary)'}).items;
var calendars = [];
for( var i = 0; i < cals.length; i++ ) {
if( cals[i].summary == name )
calendars.push(cals[i].id);
}
Logger.log('Найдено ' + calendars.length + ' временных календарей')
return calendars;
}
function deleteTempCalendars() {
let calendars = getCalIdFromName('Temp calendar');
calendars.forEach(function(id) {
Calendar.Calendars.remove(id);
Logger.log('Удален календарь с ID - ' + id)
});
Logger.log('Удалено ' + calendars.length + ' временных календарей')
}
Запустить deleteTempCalendars нужно только будет.
Hide Replies 1
Avatar Placeholder
Александр Кузнецов
Спасибо!
Avatar Placeholder
Александр Кузнецов
Понял, что вызвало создание кучи TempCalendar. Google ограничивает работу скрипта 360 секунд. У меня не успевает. То до августа, то до ноября доходит. Разбил на два скрипта, два календаря. Не очень удобно. Знаю, что можно обойти эти 360 секунд, но я не смогу, не силён.
Avatar Placeholder
Александр Зиняков
del
Avatar Placeholder
SergeyB
Здравствуйте,
Пару лет назад сделал себе эти уведомления, все отлично работало, спасибо. И вот неделю назад добавил для одного существующего контакта день рождения, он как раз сегодня. И сегодня никакого уведомления не получил. Полез в календарь в гугле, и там нет этого события. Что могло сломаться?
Нашел ошибки, каждый день вот такое повторяется:Uploaded Image
Hide Replies 1
Avatar Placeholder
SergeyB
Отвечу сам себе. Оказалось, версия скрипта у меня устарела. Спасибо автору, ответил мне на github и помог.
Great! Next, complete checkout for full access to All-In-One Person
Welcome back! You've successfully signed in
You've successfully subscribed to All-In-One Person
Success! Your account is fully activated, you now have access to all content
Success! Your billing info has been updated
Your billing was not updated