Не так давно я писал статью о том, как добавить календарь Exchange в календарь Google.
Google Calendar — добавляем календарь из Exchange
Если вкратце, то там задача разбивается на два этапа:
- Открыть общий доступ к календарю Outlook в формате iCalendar (ICS).
- Добавить календарь в формате iCalendar (ICS) в Google.
И всё работает, но есть одно большое НО. События обновляются раз в сутки, поэтому использовать такой календарь для "горячих" встреч не получится. Можно что-нибудь пропустить. Новое событие в календаре Exchange может появиться только через 24 часа.
Это печально, и даже понятно. Google переманивает корпоративных пользователей в Google Workspace, где календарь синхронизируется чаще. Но удовольствие платное.
Как сделать так, чтобы было бесплатно и быстро? - спросите вы меня. Легко! - отвечу я. Будем программировать в Google Apps Script. Ну как, программировать. Всё уже запрограммировано за нас, воспользуемся GAS-ICS-Sync:
https://github.com/derekantrican/GAS-ICS-Sync
GAS-ICS-Sync можно расшифровать так: Google Applications Script for Internet Calendaring and Scheduling Syncronisation. Что в переводе на кириллический означает: Не Дам Денег Гуглу За Синхронизацию Календаря или попросту НеДаДеГуЗаСиК.
Из этого чудо-проекта мы скачиваем 5 файлов:
- Code.gs
- Helpers.gs
- ical.js.gs
- tzid.gs
- appsscript.json
Переходим к скриптам Google:
Можно также в Google Диске Создать → Ещё → Google Apps Script.
Указываем название проекта, например, GAS-ICS-Sync.
Добавляем файлы в новый проект. Файлы Code.gs, Helpers.gs, ical.js.gs, tzid.gs добавляем через + Скрипт в редакторе. После чего указываем название файла и копируем соответствующее содержимое в поле справа для каждого файла.
Переходим в настройки проекта и включаем галку "Показывать файл манифеста appsscript.json в редакторе".
Возвращаемся в редактор, там добавился файл appsscript.json, вставляем в него содержимое из скачанного файла.
Добавляем сервисы через Сервисы +.
Добавляем Google Calendar API. Идентификатор не меняем!
Добавляем Tasks API. Идентификатор не меняем!
Переходим в редакторе на файл Code.gs, редактируем раздел настроек.
/*
*=========================================
* SETTINGS
*=========================================
*/
var sourceCalendars = [ // The ics/ical urls that you want to get events from along with their target calendars (list a new row for each mapping of ICS url to Google Calendar)
// For instance: ["https://www.calendarlabs.com/ical-calendar/ics/76/US_Holidays.ics", "US Holidays"]
// ["icsUrl1", "targetCalendar1"],
// ["icsUrl2", "targetCalendar2"],
["https://ссылка_на_мой_календарь.ics", "Evo календарь"]
];
var howFrequent = 10; // What interval (minutes) to run this script on to check for new events
var onlyFutureEvents = false; // If you turn this to "true", past events will not be synced (this will also removed past events from the target calendar if removeEventsFromCalendar is true)
var addEventsToCalendar = true; // If you turn this to "false", you can check the log (View > Logs) to make sure your events are being read correctly before turning this on
var modifyExistingEvents = true; // If you turn this to "false", any event in the feed that was modified after being added to the calendar will not update
var removeEventsFromCalendar = true; // If you turn this to "true", any event created by the script that is not found in the feed will be removed.
var addAlerts = true; // Whether to add the ics/ical alerts as notifications on the Google Calendar events, this will override the standard reminders specified by the target calendar.
var addOrganizerToTitle = false; // Whether to prefix the event name with the event organiser for further clarity
var descriptionAsTitles = false; // Whether to use the ics/ical descriptions as titles (true) or to use the normal titles as titles (false)
var addCalToTitle = false; // Whether to add the source calendar to title
var addAttendees = false; // Whether to add the attendee list. If true, duplicate events will be automatically added to the attendees' calendar.
var defaultAllDayReminder = -1; // Default reminder for all day events in minutes before the day of the event (-1 = no reminder, the value has to be between 0 and 40320)
// See https://github.com/derekantrican/GAS-ICS-Sync/issues/75 for why this is neccessary.
var overrideVisibility = ""; // Changes the visibility of the event ("default", "public", "private", "confidential"). Anything else will revert to the class value of the ICAL event.
var addTasks = false;
var emailSummary = false; // Will email you when an event is added/modified/removed to your calendar
var email = ""; // OPTIONAL: If "emailSummary" is set to true or you want to receive update notifications, you will need to provide your email address
Указываем здесь ссылки на свои календари и их названия. Указываем настройки синхронизации, у меня настроено на один раз в 10 минут.
Выбираем install и нажимаем Выполнить.
Попросят авторизоваться. Инструкцию по шагам авторизации можно посмотреть здесь:
https://youtu.be/_5k10maGtek?t=1m22s
Теперь каждые 10 минут будет запускаться скрипт синхронизации календарей. Если нужно только один раз синхронизировать календари, то вместо install можно выполнить startSync. Uninstal, соответственно, остановит синхронизацию и удалит импортированные календари.
Новые календари появятся в разделе "Мои календари". У меня скрипт уже работает год без нареканий.
Ссылки
https://github.com/derekantrican/GAS-ICS-Sync/wiki/Setting-up-the-script-manually