11

Бывшая добавляет встречи - а жена всё знает. Как три календаря спасают нашу новую семью

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

Моя схема:

✅ календарь с бывшей женой - только ключевое по сыну - переезды, врачи, собрания.
✅ календарь с моей женой: наша личная жизнь - свидания, поездки, дела. Без сына.
✅ семейный календарь (я + жена + сын): всё, что касается сына в мои недели.

Зачем так сложно? Границы. Приватность новой семьи, уважение к бывшей жене и прозрачность в делах сына.

Бывшая добавляет встречи - а жена всё знает. Как три календаря спасают нашу новую семью Опыт, Программирование, Развод (расторжение брака), Жена, Отцовство, Длиннопост

Проблема: как не перегружать жену лишним
Когда сын у меня, хочется, чтобы всё важное сразу появлялось в семейном календаре - без ручной работы. Но когда он живёт у бывшей, жена не должна видеть в календаре чужие дела. Ей не нужно лишнее: “лоры”, “тренировки” и “встречи с бабушкой” в чужую неделю. Например, бывшая добавила “Приём у ортодонта” - хорошо бы, чтобы это появилось в семейном календаре только в нашу неделю. А в остальные - не мешало. Автоматическая фильтрация событий решает эту задачу: всё по делу, ничего лишнего.

Ручное управление тремя этими календарями неудобно. Я устал быть курьером между мирами новой семьи и бывшей жены. Автоматизация синхронизации календарей через Google Apps Script (GAS) стала спасением: события из календаря с бывшей автоматически попадают в семейный, но только если касаются сына в моё время.

Решение: Google Apps Script + логика по датам

Скрипт проверяет понедельник: если есть событие “Имя_ребёнка на Берёзовой аллее” - значит, неделя моя. Тогда он копирует все события на эту неделю в семейный календарь. Если такого события нет - значит, сын живёт у мамы, и ничего не копируется. Жена видит только то, что имеет к ней отношение.

Запуск настроен через триггеры Google Apps Script: каждое воскресенье вечером скрипт автоматически обрабатывает следующую неделю. Никаких ручных действий. Скрипт проверяет дубликаты, копирует только новые события с полным описанием и временем.

Если хотите сделать аналогичную систему, то:

  1. Замените CHILD_CALENDAR_ID и FAMILY_CALENDAR_ID на реальные ID ваших календарей (найти их можно через getCalendars()).

  2. Настройте фразу-маркер в коде (вместо "на Березовой аллее").

Полный код скрипта:

// Получаем список идентификаторов всех доступных календарей

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');

}

}

// Синхронизация из календаря сына в семейный

function syncChildEventsToFamily() {

const CHILD_CALENDAR_ID = 'example123@group.calendar.google.com';

const FAMILY_CALENDAR_ID = 'family456@group.calendar.google.com';

const today = new Date();

const nextMonday = new Date(today);

nextMonday.setDate(today.getDate() + ((1 - today.getDay() + 7) % 7));

nextMonday.setHours(0, 0, 0, 0);

const mondayEnd = new Date(nextMonday);

mondayEnd.setHours(23, 59, 59, 999);

const weekEnd = new Date(nextMonday);

weekEnd.setDate(weekEnd.getDate() + 6);

weekEnd.setHours(23, 59, 59, 999);

const childCalendar = CalendarApp.getCalendarById(CHILD_CALENDAR_ID);

const mondayEvents = childCalendar.getEvents(nextMonday, mondayEnd);

// Ищем события с определенным местоположением

const specialLocationEvents = mondayEvents.filter(event =>

event.getTitle().toLowerCase().includes("на березовой аллее")

);

if (specialLocationEvents.length === 0) {

Logger.log("Неделя не ваша. Событие с 'на Березовой аллее' не найдено.");

return;

}

const familyCalendar = CalendarApp.getCalendarById(FAMILY_CALENDAR_ID);

const existingFamilyEvents = familyCalendar.getEvents(nextMonday, weekEnd);

let copiedCount = 0;

// 🔁 Функция для проверки дубликатов

function isDuplicate(event, existingEvents) {

return existingEvents.some(famEvent =>

famEvent.getTitle() === event.getTitle() &&

famEvent.getStartTime().getTime() === event.getStartTime().getTime()

);

}

// ✅ Копируем событие "на Березовой аллее"

specialLocationEvents.forEach(event => {

if (!isDuplicate(event, existingFamilyEvents)) {

familyCalendar.createEvent(

event.getTitle(),

event.getStartTime(),

event.getEndTime(),

{

description: event.getDescription(),

location: event.getLocation(),

guests: event.getGuestList().map(g => g.getEmail()).join(",")

}

);

Logger.log(`Добавлено событие (Березовая аллея): ${event.getTitle()} (${event.getStartTime()} — ${event.getEndTime()})`);

copiedCount++;

}

});

const weekEvents = childCalendar.getEvents(nextMonday, weekEnd);

// 🔁 Копируем остальные события, кроме уже добавленных специальных

weekEvents.forEach(event => {

const isSpecialLocation = specialLocationEvents.some(specialEvent =>

specialEvent.getTitle() === event.getTitle() &&

specialEvent.getStartTime().getTime() === event.getStartTime().getTime()

);

if (isSpecialLocation) return; // ⚠️ Пропускаем — уже скопировано

if (!isDuplicate(event, existingFamilyEvents)) {

familyCalendar.createEvent(

event.getTitle(),

event.getStartTime(),

event.getEndTime(),

{

description: event.getDescription(),

location: event.getLocation(),

guests: event.getGuestList().map(g => g.getEmail()).join(",")

}

);

Logger.log(`Добавлено событие: ${event.getTitle()} (${event.getStartTime()} — ${event.getEndTime()})`);

copiedCount++;

}

});

Logger.log(`Всего добавлено событий: ${copiedCount}`);

}

Результат

Теперь всё работает как надо: жена видит только нужное и не раздражается из-за чужих дел в календаре. Бывшая не втягивается в жизнь нашей семьи. Никому не нужно синхронизировать события вручную. Спокойствие, порядок, и никакой лишней суеты.

Бывшая добавляет встречи - а жена всё знает. Как три календаря спасают нашу новую семью Опыт, Программирование, Развод (расторжение брака), Жена, Отцовство, Длиннопост

Заключение

Развод - это не конец совместных дел, особенно если у вас есть ребёнок. Школа, кружки, врачи и поездки не исчезают. И чем меньше шума вокруг логистики, тем спокойнее живётся всем сторонам. Современные инструменты, такие как Google Apps Script, помогают навести порядок и снизить напряжение. Просто работает - и каждый занят своей жизнью.

А как вы организовали свою жизнь в новой семье или после развода? Используете какие-то технические моменты, облегчающие Вам жизнь?

Автор: Михаил Шардин
🔗 Моя онлайн-визитка
📢 Telegram «Умный Дом Инвестора»

2 июля 2025 г.

Правила сообщества

В Лиге приветствуется Эпистолярный жанр, мысли. тексты, рассуждения именно из них возникают СПОРЫ. Для видосов, мемасов, юмора есть другие сообщества, спорить там не о чем.

К размещению допускаются авторские посты, перепосты, ответы, соответствующие теме Лиги и правилам сайта. Подробнее по ссылке - https://pikabu.ru/information/rules-sn

+Администрация сообщества оставляет за собой право скрывать негативные комментарии в которых содержится ярый сексизм (дискриминация людей по половому признаку)
+Администрация сообщества не поощряет переход на личности, раскрытия личной информации (если только обсуждаемый сам не предложил это к обсуждению).

За нарушение правил и токсичное поведение в сообществе по отношению к другим пользователям или авторам действует система банов согласно правилам.

+Контент, подлежащий к публикации в прочих тематических сообществах может быть перемещен в соответствующее тематике сообщество.
Очень не рекомендуется в сообществе употреблять слова "бред", "чушь", "ИИ", "нейросеть" и т.п. (если у вас нет убедительных доказательств)
Не рекомендуется в сообществе употреблять мат. Если это "крепкое слово" для выражения градуса эмоций - это допустимо. Но если мат упоребляется для оскорбления или просто для связки слов - за это может быть бан.
В Лиге не приветствуются "минусовщики" (люди, которые ставят много минусов толком не читая, просто обидевшись на Автора или Сообщество). Минусы ставить можно, если у вас что-то вызывает негативную реакцию (есть основания). Но если у вас ВСЕ вызывает негативную реакцию, то лучше заблокировать Лигу или Автора, в противном случае заблокируют вас. ОСТОРОЖНО! Если ваши действия совпали с действиями минусовщиков, то вас могут случайно заблокировать вместе с ними (обратитесь к администрации Лиги для урегулирования инцидента).
Если в посте приводится чужое мнение, мем, видео, чужая история, чужая ситуация, переводная история, то нам интересно мнение автора об этом, а не голимый копипаст.

Требований к верификации: пока нет