Повысьте продуктивность с помощью кода! Узнайте, как подключить Таблицы к Календарю с помощью скрипта приложений для автоматизации расписания.

Введение

Google Apps Script - это инструмент создания сценариев, который позволяет связать все ваши приложения Google из одного места с помощью кода JavaScript. Среда разработки (доступная на script.googgle.com) предоставляет несколько высокоуровневых интерфейсов программирования приложений (API), которые позволяют вам взаимодействовать с вашими любимыми приложениями Google (создавать, изменять документы, читать и писать таблицы, создавать события календаря и т. Д. ).

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

Мотивация

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

Когда моя вкладка была создана и у меня появился список фильмов для просмотра и набор дат, я подумал: Разве не было бы неплохо иметь возможность синхронизировать эту таблицу с моим календарем? Быстрый поиск в Google Обзор привел меня к сообщению в блоге защитника разработчиков G Suite Джоанны Смит. В этом коротком посте и прилагаемом к нему видео на YouTube рассказывается, как точно решить эту задачу с помощью Google Apps Script. К разочарованию многих комментаторов YouTube видео, фрагмент кода для задачи нигде недоступен для быстрого копирования, вставки и работы.

К счастью, код довольно тривиален, и мы покажем, как легко его улучшить, добавив несколько дополнительных строк кода.

Процесс

Таблица

Я предполагаю, что вы знаете, как создать электронную таблицу с помощью Google Sheets, и, конечно, если вы хотите воспроизвести эту работу, вам понадобится учетная запись Google. Моя таблица выглядит так:

Как видите, некоторые записи отсутствуют, поскольку мы еще не решили, какие фильмы мы будем смотреть дальше. Кроме того, обратите внимание, что столбец DATE имеет формат Дата и время, это предпочтительнее, так как позже он упростит код (обработка дат в программировании немного затруднительна). Чтобы изменить формат ячеек, выберите ячейки даты и нажмите Формат ›Число› Дата и время.

Календарь

Для этого я создал новый календарь в Google Calendar и получил его идентификатор календаря, выполнив следующие простые шаги:

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

Кодекс - шаг за шагом

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

Теперь, когда все готово, вернитесь к электронной таблице и нажмите Инструменты ›Редактор скриптов. Теперь мы готовы писать код, но мы находимся перед пустым холстом с именем Code.gs, который содержит пустой шаблон для функции с именем myFunction(). Поскольку код не объясняется подробно в Руководстве по G Suite, мы разберем его здесь (и не волнуйтесь, весь код будет доступен в конце этой публикации).

Сначала мы настраиваем нашу электронную таблицу и календарь:

Я вызвал свою функцию sheet2calendar. Строка 4 в приведенном выше блоке устанавливает переменную spreadsheet для электронной таблицы, в которой находится наше расписание, в этом случае мой лист называется CALENDARIO. Строка 5 извлекает идентификатор календаря из ячейки H1, и, наконец, я загружаю объект calendar в строку 6.

Затем мы загружаем наши фильмы этой единственной строкой:

Это просто говорит о загрузке записей из ячейки A4 в ячейку B15, эффективно извлекая таблицу 12x2. Первый столбец соответствует датам, а второй столбец - названиям фильмов.

Теперь мы собираемся перебрать каждую запись в этой таблице (FOR LOOP!) И создать календарное событие для указанной даты. Каждое мероприятие будет длиться 3 часа, а название мероприятия будет названием фильма. Кроме того, мы реализуем несколько функций, которые не обсуждались в блоге G Suite:

  • Если название фильма недоступно, мы пропустим эту запись и не создадим никаких событий.
  • Если в этот временной интервал есть запись (в нашем новом Календаре, который работает независимо от других наших календарей), удалите это событие и создайте новое - многие из вас могут не согласиться с таким способом разрешения конфликтов, хотя это всего лишь доказательство концепции!
  • Добавьте функциональность, чтобы делиться событиями с гостями, указав их адреса электронной почты.
  • Оберните код для создания и публикации события в автономной функции.

Наш основной цикл for будет выглядеть так:

Хороший! У нас есть почти все необходимое, теперь давайте добавим наши новые функции. Во-первых, мы пропустим текущую итерацию, если переменная movie пуста (т.е. равна ''). Далее нам понадобится наш код обработки конфликтов. Для этого мы извлечем существующие события между временем начала и окончания нашего фильма и удалим события, для которых текущее имя отличается от нового имени.

Логика обработки конфликта проста: если длина объекта conflicts равна 0, конфликта нет, и мы можем спокойно создать новое событие. Если длина объекта conflicts больше 0, мы перебираем события в пределах conflicts (в случае, если их больше одного). Затем мы сравниваем имя конфликтующего события с именем movie, если они оба равны, мы пропускаем текущую итерацию (нет необходимости удалять событие и создавать событие с тем же именем). Однако, если названия различаются, мы переходим к удалению конфликтующего события и созданию нового события.

В предыдущем блоке кода мы дважды вызываем функцию createAndShare() (в строках 13 и 31). Я оставил эту функцию внешней по отношению к функции sheet2calendar(), чтобы избежать повторного написания кода и для наглядности. Вот его реализация:

Последние штрихи - из сообщения Джоанны

Наконец, чтобы избежать необходимости обращаться к редактору скриптов каждый раз, когда мы хотим синхронизировать наш календарь с нашей электронной таблицей, мы можем добавить кнопку на нашу панель инструментов Таблиц, как показано в сообщении Джоанны Смит от 2018 ». Вам просто нужно добавить эту функцию в ваш .gs файл:

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

Это просто!

Результат

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

Окончательный код

Вы могли бы сделать больше

В качестве передового опыта и если вы используете это для серьезного проекта, я рекомендую использовать функцию App Scripts Logger.log() для регистрации всех операций, выполняемых вашим кодом. Таким образом, вы всегда можете вернуться к журналу и посмотреть, какие изменения были внесены и какой код / ​​действия были выполнены. Подробнее о классе Logger читайте в официальной документации.

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

Вывод

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

Ресурсы