Как связать гугл календарь и гугл таблицы

Обновлено: 24.04.2024

У офисных работников, работающих с Таблицами и Календарем на платформе Google Disk рано или поздно возникает насущная потребность синхронизировать эти два сервиса. Ниже в виде инструкции (а еще ниже в виде инфографики) дается типичный вариант такого решения.

Задача: Есть Гугл Таблица с днями рождения партнеров. Надо сделать так, чтобы мы могли автоматически в Гугл Календаре иметь напоминания об этих днях рождения с извещением на электронную почту владельца Календаря, т.е. на наш e-mail.

Решение: 1) Создаем таблицу дней рождения в Гугл Таблицах; 2) Пишем скрипт на языке Google Apps Script, который считывает таблицу и ретранслирует ее строки в Гугл Календарь в виде напоминаний; 3) Рисуем кнопку в интерфейсе Таблиц и задаем ей связь со скриптом; 4) Запускаем скрипт этой кнопкой.

СОЗДАЕМ ТАБЛИЦУ

Создаем таблицу по шаблону: Имя | Фамилия | Дата рождения. Первая строка – заголовок. Именно на такой шаблон рассчитан скрипт ниже. При изменении шаблона потребуется некоторая корректировка скрипта.

ПИШЕМ СКРИПТ

В Таблице с нашим расписанием дней рождения через меню Tools > Script Editor зайти в редактор скриптов. Написать код:

Сохранить код по кнопке [Save] (изображение дискеты).
Код можно просто методом копирования перенести в редактор.
Некоторые пояснения:

  • В первой строке фигурирует имя функции – DR – его можно изменить на другое. Его нужно запомнить, пригодится ниже.
  • Создается новый календарь с именем «Личный_календарь».
  • Если календарь с таким именем уже был, то он очищается от всех напоминаний с начала 2019 года по 2030 год.
  • Согласно расписанию дней рождения в Таблице на дни, даты которых фигурируют в третьем столбце, в «Личный_Календарь» выставляются напоминания с email-уведомлением.

Желтым в коде подсвечены те участки, которые должны будут подвергнуться ревизии при изменении формата таблицы, заложенного в постановке задачи:

i = 1 Единица соответствует второй строке, т.к. в программировании счет начинается с нуля. Т.е., если у вас заголовок будет занимать две строки, то 1 надо будет заменить на 2. data[i][0] Это имя. data[i][1] Это фамилия. data[i][2] Это дата рождения. Т.е., если вы изменяете формат и вводите вторым столбцом отчество, сдвигая фамилию и дату вправо, то в коде на месте data[i][2] должно стоять data[i][3], а отчество в виде data[i][1] вставьте после имени, а именно data[i][0] замените на data[i][0]+” ”+data[i][1]. И прежнюю переменную data[i][1], отвечавшую за фамилию, измените на data[i][2].

Таким образом, актуализировать расписание Календаря можно в любое время нажатием на кнопку [ДР]. Прежнее содержание календаря «Личный_Календарь» будет полностью заменяться на расписание, которое присутствует в Таблице.

РИСУЕМ КНОПКУ ДЛЯ СКРИПТА

Для запуска скрипта из интерфейса Таблицы в ней создадим кнопку:

  1. В меню выбрать: Insert > Drawing.
  2. Выбрать инструмент Shape.
  3. Нарисовать фигуру, которая вам нравится. Можно задать на фигуре текст, например, "ДР".
  4. Сохранить по кнопке [Save and Close].
  5. В Таблице на появившейся кнопке нажать на три вертикальные точки – это меню кнопки.
  6. Выбрать пункт Assign Script.
  7. Выбрать имя функции "DR" (без кавычек и без скобок)
  8. Сохранить [Ok].

Теперь связь кнопки и скрипта организована.
Потом, при желании изменить имя функции у кнопки, или отредактировать ее дизайн, или удалить, надо нажать на эту кнопку правой кнопкой мыши, чтобы увидеть заветные три вертикальные точки.

ЗАПУСКАЕМ СКРИПТ

  1. Нажать на созданную кнопку [ДР].
  2. Если это первый запуск, то Google запросит разрешение на выполнения скрипта. Дать это согласие.
  3. После выполнения скрипта зайти в Google Календарь.
  4. Увидеть слева "Личный_Календарь" в списке календарей. Но назначенных событий пока не видно в ячейках дней.
  5. Переключить галочку "Личный_Календарь" в списке календарей. События появятся.

ИНФОГРАФИКА

Специально для визуалов ниже изображено то, что написано выше:

Гугл: Таблицы-Календарь синхронизация: Инфографика

ВАРИАНТЫ ВЫЗОВА ФУНКЦИИ

Скрипт состоит из функций, часто независимых друг от друга. Вызвать функцию на исполнение можно из другой функции, а также независимо, и Гугл предоставляет 4 варианта такого независимого вызова:

Это можно сделать, перейдя на страницу своего Google Drive.



Рис. 1. Правый клик мышью по рабочему пространству открывает контекстное меню, где нужно выбрать "Google Таблицы" — "Создать пустую таблицу"

В созданную таблицу нужно скопировать имеющееся у Вас расписание, в моем случае это расписание занятий в университете. Важно, чтобы в таблицы были следующие поля:

  • Название мероприятия
  • Дата мероприятия
  • Время начала
  • Время конца или длительность (впрочем, это необязательно — в итоге вы сможете установить какое-нибудь общее дефолтное значение длительности мероприятия, например 1 час, или вовсе сделать мероприятие, длящимся целый день)

Вся остальная информация, в моем случае — преподаватель, тип занятия (лекция, семинар и т.д.), может быть отправлена в описание мероприятия.



Рис. 2. Таблица с расписанием

2. Создаем скрипт

2.1. Переходим в редактор скриптов

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



Рис. 3. Скрипт создается, через меню "Инструменты", в котором нужно выбрать пункт "Редактор скриптов"

Скрипты разрабатываются на языке JavaScript. Только что созданный скрипт содержит одну пустую функцию myFunction. Писать код можно в ней, но я предпочту дать ей более осмысленное имя SetCalendar.



Рис. 4. Созданный скрипт, дадим функции осмысленное имя — SetCalendar

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

2.2. Разбираемся с отладкой

Часто для отладки скриптов на JavaScript мы выводим различные значения в консоль:

В Google Apps Script логировать значения следует немного иначе. Вместо объекта console следует использовать глобальный объект Logger:

После запуска скрипта, все выведенные в лог значения можно посмотреть из меню "Вид", выбрав пункт "Журналы" или же по сочетанию клавиш Ctrl+Enter:



Рис. 5. Модальное окно с логами последнего запуска скрипта

2.3. Извлекаем информацию о мероприятиях из таблицы

Сразу небольшой кусок кода

Рассмотрим строку 11.

Глобальный объект SpreadsheetApp — глобальный объект, содержащий методы, представляющие собой интерфейс для взаимодействия скрипта с приложением Google Sheets.

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

Метод возвращает объект sheet.

Далее, нужно получить объект range — он представляет собой диапазон ячеек таблицы, из которых мы будем извлекать данные. Это делается путем вызова метода getRange. В качестве параметров передаются:

  • Индекс первой строки диапазона
  • Индекс первого столбца диапазона
  • Количество извлекаемых строк
  • Количество извлекаемых столбцов

Строка 15: мы получаем из выбранного выше диапазона ячеек непосредственно данные путем вызова метода getDisplayValues.

Обратите внимание! Метод getDisplayValues() отдает данные в том виде, в каком он отображается в ячейках таблицы. Например, если ячейка содержит дату, то указанный метод вернет не какое-то внутреннее представление записанной в ячейку даты, а ее представление, которое видит пользователь в ячейке.

2.4. Извлекаем данные из ячеек

Прежде, чем работать с ячейками, удобно было бы дать номерам столбцов имена, дабы избежать ошибок при указании номеров столбцов с интересующими нас данными. Создадим для этого несколько констант:

Вы можете посмотреть какие столбцы стоят в таблице под данными номерами на рисунке 2.

Объект data представляет набор ячеек с данными, которые были получены. Теперь нужно получить данные из отдельных ячеек.

Чтобы получить дату-время начала и окончания занятия, нужно вызывать функцию extractPeriod и передать две строки — дата и временной период, в который длится занятие.

2.7. Создание события в Google Calendar

Сразу небольшой листинг, пояснения будут дальше

Строки 1-6: получаем дату-время начала и окончания занятия, а также склеиваем в одну строку всю дополнительную информацию, которая будет записана в описание мероприятия в календаре.

Далее, к интерфейсу сервиса Google Calendar мы обращаемся через методы глобального объекта CalendarApp.

Посредством метода getCalendarsByName мы получаем массив календарей с указанным именем.

Получить объект-календарь можно также посредством метода getDefaultCalendar, тогда событие будет создано в основном календаре. Однако, я советую зайти в веб-версию Google Calendar и создать новый календарь, в который вы будете экспортировать мероприятия. Во-первых, вы получаете возможность скрывать события этого календаря, выделять события отдельным цветом.

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

В данном случае я создал календарь "Учеба", и собираюсь создавать события в нем. Поэтому в коде вызывается метод getCalendarsByName и в качестве параметра передается срока "Учеба".

Метод возвращает массив календарей с указанным названием, поэтому нужно взять из этого массива один элемент, в нашем случае нулевой:

У объекта-календаря необходимо вызывать метод createEvent. В качестве параметров нужно передать следующее:

  • Название мероприятия (в данном случае название дисциплины)
  • Объект Data — дата-время начала мероприятия
  • Объект Data — дата-время окончания мероприятия
  • Необязательный параметр — объект с дополнительными опциями (в данном случае я заполняю одно поле — description — это описание мероприятия)

Последняя строка в скрипте — задержка на 50 миллисекунд. Во время разработки скрипта и отладки я обнаружил, что иногда при выполнении кода выбрасывается исключение, суть которого в том, что Google Calendar не нравятся частые обращения к сервису, и в описании исключения рекомендуется вставить задержку между вызовами методов API календаря.

3. Итоговый скрипт

Ниже приведен полный скрипт, который получился

Обратите внимание! Данный скрипт заточен под структуру таблицы, которая приведена на рисунке 2. Если вы хотите использовать этот скрипт для себя как есть, убедитесь, что ваша таблица с расписанием имеет такую же структуру, или же измените скрипт под свою таблицу.

4. Немножко скриншотов



Что можно улучшить

  • Некоторые значения в коде я просто захардкодил — например, индексы начала таблицы, размеры таблицы, количество строк (количество мероприятий). Теоретически, можно покопаться в API Google Sheets для Google Apps Script и придумать, как выцеплять нужные координаты ячеек автоматически;
  • Я никогда плотно не изучал JavaScript, могут быть различные стилистические и прочие недостатки в коде, возможно тот же парсинг даты-времени можно сделать красивее и элегантнее.

Открыт к конструктивной критике, буду рад, если укажете на недостатки, посоветуете что можно улучшить, а что изменить в статье.

Скрипты google для автоматизации, создания документов, мини CRM.

вторник, 4 июня 2019 г.

Объединяем форму и календарь google

Формы google - простой, доступный инструмент для создания различных опросников. Конечно и он не лишён недостатков, я нашёл один существенный - нет возможности встраивать

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

Каким образом выстроить работу чтобы и клиенты знали когда к Вам можно обратиться, и не оплачивать работу секретаря. Можно создать google форму, в которой клиенту можно предложить заполнить желаемый день и время.
Например, такую.
Но проблема в том что клиент даже приблизительно не может себе представить Вашу загруженность.
Можно предоставить клиенту ссылку на один из Ваших рабочих календарей google. Но это скорее всего только запутает человека, да и в календарях может содержаться конфиденциальная информация (потому что это удобно для Вас).

Нужно объединить форму с календарём на странице одного из Ваших сайтов. Почему сайта - да потому что так проще встроить нужные Вам . В настройках каждого google календаря, а их может быть больше чем один, можно получить html-код для размещения календаря на страницах сайта.


Остаётся дело за малым - прочитать статью о кастомизации google форм и создать свою

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

Этот скрипт помещается в таблицу с ответами из формы, устанавливается триггер на функцию myOnFormSubmit на отправку формы. По умолчанию считается одно мероприятие - 1 час. Можно было бы добавить время окончания, но это уже мелочи. :)

Скрипты google для автоматизации, создания документов, мини CRM.

понедельник, 24 апреля 2017 г.

Объединение календаря и таблицы Google

Google таблицы прекрасный кросс-платформенный инструмент для работы с информацией. С этим трудно поспорить - из любой точки Земли, с любого современного устройства легко получить доступ к ней, если есть великий и могучий Интернет.

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

В данном блоге буду выкладывать интересные примеры таких скриптов, может кому-то понадобится.

И первый пример связан с возможностью объединить таблицу с календарём Google. Это открывает широкие возможности для пользователя ОС Android: всегда быть в курсе предстоящих событий, дней рождений всей родни, друзей, клиентов. Для этого даже не надо заглядывать в приложение календарь на Android смартфоне, оно само напомнит обо всех событиях.

  1. Пропуская 1-ю строчку (заголовок таблицы), берёт данные из текущей таблицы в которой в 1-м столбике Фамилия, Имя, Отчество вашего клиента, во 2-м - дата рождения, в 3-м номер телефона;
  2. Создаёт календарь (если такого нет) под названием "Дни рождения клиентов";
  3. Для исключения повторяющихся событий, удаляются все события из данного календаря в промежутке 01.01.2010 - 01.01.2030 (если нужно просто очистить календарь, придётся подключать дополнительные библиотеки);
  4. Создаются предстоящие события - дни рождения клиентов в текущем месяце и следующем (т.к. существует ограничение Google на создание слишком большого количества событий за короткий промежуток времени, а клиентов может быть много);
  5. Добавляет оповещение по почте и всплывающее напоминание

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

114 комментариев:

Роман, а как можно осуществить такой вариант. Например есть таблица, где есть столбец с именами клиентов, есть столбец с планируемой датой встречи.. как сделать, чтобы данные отправлялись с таблицы в календарь?

Нужно попробовать поработать с текстом для планируемой встречи. Там где текст для празднования д.р. поменять на "планируется встреча" с таким то таким то. Ну и дату поставить нужную.

Спасибо, подскажите как можно добавить время встречи и прикрутить кнопку на выполнение скрипта

в данном скрипте создаётся событие на весь день.

Во втором столбце вводить дату в формате

где время понятно?

и поменять в скрипте createAllDayEventSeries(блаблабла) на
createEvent('описание',data,new Date(data+1*60 * 60 * 1000))

Будет создано событие и будет считаться что ваша встреча будет проходить 1 час.

0 поменять на количество минут за которое Вас нужно предупредить о встрече.

I'm sorry. Давно писал, вылетело всё из головы.

В строке data+1*60*60*100 переменная data нужно написать с заглавной буквы, т
е. Data+1*60*60*1000.

Моя ошибка :) Виноват, исправлюсь.:)

К сожалению не спасло ситуацию, та же ошибка(

Конечно, уже открыл

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

В общем строка преобразуется в

var event = currentCalendar.createEvent("Сегодня запланирована встреча с "+Name+". \n"+", номер телефона:"+Phone,Data,new Date(Data.getTime()+1*60*60*1000))

Роман, спасибо вам большое за скрипт и кнопку)). Вы мастер!

Спасибо. Посмотрите другие статьи в блоге. Вдруг найдёте ещё что-то интересное для себя.:)

Роман, добрый вечер. Занимаюсь упрощением работы с базой клиентов в таблице гугл. Сделал кнопку для создания события в календаре из текущей строчки.Одновременно установил 3 скрипта (звонки,задачи, встречи) . Вот встречи со звонками нуждаются в хронометраже, а задачи нужно установить на весь день. Подскажите что добавить в скрипт или что убрать ,чтобы событие создавалось на целый день и не нужно было вводить время и событие устанавливалось вверх календаря

В моей статье создаются события на весь день. Дни рождения клиентов - события на весь день.

var event = currentCalendar.createAllDayEventSeries("Сегодня "+Name+" празднует день рождения. Не забудь поздравить \n"+", номер телефона:"+Phone,Data,CalendarApp.newRecurrence().addYearlyRule());

создаются события на весь день причем повторяющиеся 1 раз в год.

Если строчку заменить на

var event = currentCalendar.createAllDayEvent("Сегодня "+Name+" празднует день рождения. Не забудь поздравить \n"+", номер телефона:"+Phone,Data);

то будут создаваться события на целый день только без повторений.

В javascript время хранится в миллисекундах, поэтому если хочется установить длительность события в минутах нужно +15*60*1000 если время 15 минут. Ну и напоминание не добавляется из-за ошибки с 0.15.

Здравствуйте Роман,
Очень интересная статья.
У меня возникла проблема, все работает когда я вручную запускаю скрипт, но когда я запускаю триггер - нет. Хотя уверен что он написан правильно.
Моя таблица находиться на 3 аркуше документа, и с того что я понимаю триггер автоматически читает 1-ый аркуш а не 3-ий.
Можно ли вместо getActiveSheet написать getSheetById или getSheetByName или что то другое, что будет указывать путь именно к этому файлу к этому аркушу к этой таблице?

Буду очень благодарен за помощь, идеально было бы если бы Вы проверили то что я там понаписывал :)

getSheetByName('Название листа') - прямо идеально Ваш вариант.

Блииин а я ставил двойные скобки.
Спасибо - ты лучший

Добрый день! Очень полезная информация
Не могу разобраться в тригерах как мне через OnEdit () запускать скрипт при редактировании Даты.
Заранее Спасибо!

Здравствуйте.
Через функцию onEdit() этого не сделать.
Необходимо авторизовать триггер вручную: меню Изменить-Триггеры текущего проекта. Кнопка +Добавление триггера, выбрать функцию, тип события При изменении.

Здравствуйте.В первом столбце список клиентов. Как можно создать во втором столбце кнопки, при нажатии на которую открывается папка, расположенная на компьютере с именем клиента? Заранее спасибо

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

не поможете реализовать?

Спасибо огромное за скрипт, очень пригодился! Подскажите, где добавить -1, чтоб напоминание было за день до события?)

0 - количество минут до события. Если поставить 60 - то уведомления за час. 60*24 - уведомление за сутки

Привет.
Уже обращался к Вам по данной теме.
Сейчас, у меня возникла новая проблема.
Есть у меня такой скрипт:
function addEvents() var ss = SpreadsheetApp.openById("1LeJQXi0SEzIxXOVmOEG3dlckIBv56ZclLnDwkncqoCc").getSheetByName('Oswiadczenia');
var lr = ss.getLastRow();
var cal = CalendarApp.getCalendarById("est-pologne.eu_j28dmjh32cdbqpagj3npg6kadk@group.calendar.google.com");
var currentCalendar = CalendarApp.getCalendarById("est-pologne.eu_j28dmjh32cdbqpagj3npg6kadk@group.calendar.google.com");
var events = currentCalendar.getEvents(new Date(2010,01,01),new Date(2030,01,01));
for (var j = 0;j events[j].deleteEvent();

var data = ss.getRange("A2:C” + lr).getValues();
for(var i = 0;i cal.createAllDayEvent(data[i][0], data[i][1], );
>
>
И последная строка просто не работает, хотя раньше работала. Потом начал ковыряться в ней и перестала работать строка var data=.
Думаю что проблема в том, что ОНО не правильно читает данные и понимает о чем идет речь.
Есть ли другой способ показать програме о каких данных идет речь ?
Спасибо

К коментарию више. Cannot find method createAllDayEvent(string,string,object). (line 16, file "Code") - вот такую ошибку выдает

Попробуйте в строчке
cal.createAllDayEvent(data[i][0], data[i][1], );

data[i][1] заменить на
new Date(data[i][1])

Спасибо за скрипт, очень полезный, но нужно немного заточить. Подскажите пожалуйста:

1) если я хочу работать с конкретным листом Input я должен во второй строке написать:
var sheet = SpreadsheetApp.getSheetByName('Input');
Правильно?
Но выдает ошибку: TypeError: невозможно найти функцию getSheetByName в обьекте SpreadsheetApp. (строка 2, файл "Код")
Что я делаю не так?

2) Нужно убрать ежегодное повторение события. Делаю по Вашему рецепту и пропадает событие за этот день и через день. Что может быть?

3) Я хочу исключить вывод номера телефон в напоминании. Если я удаляю +Phone,Data,CalendarApp.newRecurrence().addYearlyRule()); - выжает ошибку.

1. SpreadsheetApp.getActiveSpreadsheet.getSheetByName('Input')
2.createAllDayEvent создает событие без повторения, посмотрите комментарий выше.
3. Смотрите п.2

Роман, спасибо за ответ. Но все равно не очень получается.

1. Появляется такая ошибка: TypeError: Не удается обнаружить функцию getSheetByName в объекте function getActiveSpreadsheet() .

2. Я пробовал createAllDayEvent но тупо пропадает часть событий. То есть, при createAllDayEventSeries - все ОК а при createAllDayEvent остается лишь 30% всех событий. Никакой логики не вижу. Вся моя строчка выглядит так: var event = currentCalendar.createAllDayEvent("Сегодня "+Name+" празднует День Рождения "+Phone,Data);

3. Куда смотреть? Нужно просто убрать телефон. Конструкция var event = currentCalendar.createAllDayEvent("Сегодня "+Name+" празднует День Рождения); порождает ошибку <>. Что не так?

4. Если я даю доступ со своего календаря на другой аккаунт - напоминание event.addPopupReminder(0) со скрипта работает на другом аккаунте? Или там нужно задавать отдельное напоминание?

Можете подготовить пример с данными и открыть доступ к примеру? Помогу разобраться.:)

Конечно! Все подготовил и отправил на е-мейл.
Спасибо))

Достаточно с другого аккаунта открыть соответствующий доступ к нужному календарю Вашей учетке.

Задача следующая: нужно переносить из таблицы с графиком платежей список платежей на дату в событие календаря. Таблица формата "Дата", "Статья", "Сумма". Записей немного. Желательно видеть платежи за одну дату в одном событии.

Честно говоря, опыт с GAS у меня первый, поэтому переписываю Ваш скрипт. Пока не работает. Новый календарь добавляется, записи не переносятся. Если сможете помочь, буду крайне благодарен.

function Payments() var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var calname = CalendarApp.getCalendarsByName("График платежей");
if (calname.length > 0)
currentCalendar = CalendarApp.getCalendarsByName("График платежей")[0];
>
else
var calendar = CalendarApp.createCalendar("График платежей");
var currentCalendar = calendar;
>
var events = currentCalendar.getEvents(new Date(2018,01,01),new Date(2050,01,01));
for (var j = 0 ; j < events.length; j++)
events[j].deleteEvent();
>
for (var i = 1; i < data.length; i++)
var Date = new Date(data[i][0]);
var now = new Date().getMonth();
var month = now+3;
if ((Data.getMonth()<=month)&&(Data.getMonth()>=month-1)) var item = data[i][1];
var Sum = data [i][2];
var event = currentCalendar.createAllDayEventSeries("Платежи в этом периоде:"+item,Sum,CalendarApp.newRecurrence().addYearlyRule());
event.addEmailReminder(0);
event.addPopupReminder(0)
>
>
>

замените на строчку

var event=currentCalendar.createAllDayEvent('Платежи в этом периоде: '+item+'. На сумму: '+Sum,Date)

Часто обновляете календарь?
Планируете много мероприятий, которые повторяются из недели в неделю, из месяца в месяц?
Это отнимает много времени.
Вам поможет импорт событий в календарь из таблицы Google.

Здесь вы узнаете, как облегчить эту работу. Перед тем, как производить импорт событий в календарь, необходимо подготовить исходную таблицу.

1. Заполняем таблицу деталями

В таблицу поместите детали мероприятий (событий, events). Можно создать строки с разными типами событий, а затем их скопировать и отредактировать. Это сильно ускорит процесс.


Детали событий введите в ячейки A7:F.

Не оставляйте пустых строк между шапкой и строками с вашими данными!

Обратите внимание на даты: не забудьте указать время начала и окончания события.

2. Идентификатор календаря

Идентификатор календаря поместите в ячейку E3. Найти его просто:

  • откройте календарь,
  • в списке календарей нажмите на 3 точки справа от нужного календаря,
  • выберите Настройки и общий доступ,
  • затем Интеграция календаря.

3. Установка дополнения

Установите дополнение Good Events Planner *.

4. Импорт событий в календарь

В меню Дополнения выберите CreateEvents и Send.

* Этот пункт можно пропустить.


Также можно нажать на кнопку В КАЛЕНДАРЬ!

Дайте все необходимые разрешения. Это делается только раз при первом запуске.


Для любителей смотреть — видео

Я сделал шаблон, который вы можете использовать.
Сделайте копию таблицы (меню Файл > Создать копию), замените данные в шаблоне на свои и вперёд!

Загляните в меню Файл/Настройки таблицы/Часовой пояс. Если ваш часовой пояс отличается от московского, выберите свой.

Читайте также: