Недавно на Хабре мы публиковали небольшой обзор системы управления задачами, над которой работаем. Одна из ее возможностей — односторонняя и двусторонняя синхронизация с Google Tasks. Настроив ее, можно существенно расширить возможности по работе с вашими задачами в Google Tasks, к примеру, достаточно быстро реализовав следующие «плюшки»:
- создание задач в Google Tasks по почте (причем каждая задача имеет свой адрес и можно отсылать подзадачи к любой задаче)
- сделать повторяющиеся задачи в Google Tasks (к примеру, каждый вторник будет возникать задача «Проверить операции по карте»)
- запланировать будущие задачи (т.е. они появятся в Google Tasks в нужную дату)
- уведомлять о приближении срока (даты завершения, due date) задачи из Google Tasks по почте (один или несколько раз)
- через некоторое время (к примеру, неделю) удалять уже выполненную задачу
- предоставить доступ к своим задачам другим пользователям Google Tasks (грубо говоря, расшарить свой список, подробнее ниже)
Реализация всего этого сделана через синхронизацию с нашим сервисом, т.е. мы не говорим о каких-то «хаках» или недокументированных возможностях Google Tasks, а реализуем их через обработку ваших задач у нас. Поэтому если вы не согласны доверить ваши тасклисты сторонним сайтам, то наше решение не для вас.
В комментариях к предыдущему посту мы были «заклеваны» за дизайн, поэтому все эти дни работали над русификацией и причесыванием дизайна и интерфейса. Признаемся честно, дизайн при разработке стоял далеко не на первом месте, большую часть времени заняла реализация функций. Но сегодня разговор не об этом, т.к. реализация вышеперечисленных «плюшек» потребует достаточно кратковременной настройки вашего аккаунта у нас, а далее можно к нам и не заходить. Именно на таких use cases я и хочу сконцентрироваться в данном посте.
Предлагаемые варианты использования нашего сервиса изначально не планировались, но в процессе разработки оказалось, что уже реализованного функционала хватает и было интересно попробовать новые сценарии работы.
Прежде всего о самом предлагаемом принципе работы. Проще представить наш сервис как хранилище задач, которое может учитывать все, в т.ч. будущие задачи, чужие, создавать их, удалять, изменять, выдавать их в нужном виде и фильтровать по всевозможным критериям. Путем постоянной синхронизации (или репликации изменений) возможно построить свою работу так – большая часть работы с задачами производится в Google Tasks, все изменения постоянно синхронизируются с вашим аккаунтом у нас. На нашей стороне отрабатываются остальные действия (триггеры, уведомления, письма) и далее синхронизируются обратно. В целом ничего революционного, с помощью некоторых сервисов можно организовать нечто подобное, но мы решили «прокачать» этот механизм.
Настройка синхронизации
Прежде всего, чтобы предоставить доступ нашему сервису к вашим задачам Google Tasks, необходимо зарегистрироваться у нас и пройти по ссылке «авторизуйтесь» из окна «Синхронизация»:
и подтвердить разрешение на доступ к вашим задачам:
После этого статус авторизации изменится на ОК. Взаимодействие с Google Tasks настраивается с помощью «синхронизационных пар», которых может быть и несколько. Настройка заключается в установке:
- направления синхронизации (из Google Tasks, в Google Tasks или в двустороннем режиме)
- указания тасклиста в Google Tasks
- указания списка задач или фильтра на стороне нашего сервиса
- указания периодичности обмена (пока оставили варианты «раз в 15 мин», «раз в час», «раз в 4 часа», «раз в день»).
Также для односторонней синхронизации в Google Tasks доступен выбор варианта синхронизации (об этом чуть ниже). Google Tasks не поддерживает push-технологию, поэтому синхронизации в реальном времени сделать невозможно.
Лог синхронизации также доступен:
Синхронизация осуществляется периодически путем сравнения имеющихся задач в Google Tasks и нашем сервисе. Двусторонняя синхронизация предполагает асболютную идентичность имеющихся задач на обоих сторонах, поэтому при ее установке будут скопированы все имеющиеся задачи с каждой стороны на противоположную. При последующих синхронизациях будут копироваться только изменения. При одновременном изменении на обоих сторонах одной и той же задачи с момента предыдущей синхронизации приоритет будет у Google Tasks.
Создание будущих (отложенных) задач в Google Tasks
Чтобы какая-либо задача появилась в Google Tasks только в определенное время, нужно создать ее у нас, в поле «Дата задачи» указать время и дату. После наступления этой даты она станет актуальна (станет выводиться на текущую дату) у нас и потом появится в Google Tasks. В зависимости от настроек периодичности синхронизации она появится там либо в течение 15 минут, либо в течение часа и т.д.
Далее настраиваем одностороннюю либо двустороннюю синхронизацию списка в Google Tasks. Если в поле «Фильтр или список» указываете фильтр, то следите чтобы в настройках фильтра не стояло опции «Показывать будущие задачи».:
После первой синхронизации в Google Tasks скопируются все уже наступившие задачи или задачи без даты, а наша задача скопируется только при наступлении 00:00 25 января 2014 года. Точнее, в течение 15 минут после этого времени.
Повторяющиеся задачи в Google Tasks (периодическое повторение задачи или ее «восстановление»)
У нас реализовано несколько механизмов повторения задач, но пока остановимся на самом простом и, на самом деле, наиболее часто нужном — когда под повторением задачи понимается не создание второго экземпляра задачи, а «восстановление» (т.е. заново снимается пометка выполнения задачи). Как пример — нам нужно напоминать себе о посещении бассейна в субботу. Делаем задачу «Бассейн в субботу», дату задачи можно не ставить, т.к. пока реализуем все по-простому. И вешаем триггер именно на эту задачу (список триггеров к задаче вызывается пунктом «Триггеры» в контекстном меню, вызываемом по правой кнопке мыши на задаче). Тип триггера — «Расписание», ставим ближайшую нужную дату в будущем (именно в будущем), когда задача должна стать невыполненной, к примеру, 29 декабря. Действие — «Пометить как невыполненную». Устанавливаем повторение каждые 7 дней, начиная с 29 декабря. Поле «Распространяется на» оставляем «Только на эту задачу». В итоге при наступлении 29 декабря задача пометится как невыполненная (если она до этого была выполнена) и через некоторое время (период синхронизации) эти изменения дойдут до Google Tasks.
По контекстному меню на задаче вызываем настройку ее триггеров:
Настраиваем триггер, чтобы он делал эту задачу заново невыполненной по субботам в 7 утра:
Ну и не забываем настроить двустороннюю синхронизацию для списка «Личное»:
Все. После установки синхронизации задача скопируется в Google Tasks и в дальнейшем, независимо от того, где вы отметите задачу выполненной — у нас или в Google Tasks, каждую субботу в 7 утра она станет невыполненной и там и там. Возможно, пример с бассейном немного неподходящий, как вариант, можно представить задачу как «Уборка», «Запрос выписок из банка и т.д.». Отметим, что для данного типа повторения задач необходима настройка двусторонней синхронизации.
Повторение (восстановление) задачи в Google Tasks с установленной задержкой после выполнения
Опять приведу простейший бытовой пример. Допустим, необходимо вам делать уборку каждые 10 дней. Повторение (восстановление) задачи «Уборка дома (кухня, гостиная)» каждые 10 дней — не вариант, т.к. в какие-то дни вы опоздаете с уборкой и следующая задача возникнет слишком рано — между уборками получится меньше 10 дней, а зачем нам делать лишнюю работу. Поэтому проще поступить следующим образом. У задачи задачи «Уборка дома (кухня, гостиная)» устанавливается триггер, срабатывающий при выполнении задачи, отмечающий задачу снова невыполненной и у нас и в Google Tasks через 10 дней после ее выполнения.
По контекстному меню вызываем настройку триггеров:
Добавляем триггер:
Ну и не забываем настроить двустороннюю синхронизацию этого списка задач с Google Tasks:
Все. При первой синхронизации задачи с обоих сторон скопируются, в дальнейшем при выполнении этой задачи либо у нас, либо в Google Tasks сработает триггер, который через 10 суток вернет эту задачу (сначала у нас, а потом через некоторое время и в Google Tasks). Когда бы вы не сделали уборку (точнее, отметили что сделали), через 10 дней задача снова появится. Отложенные действия (т.е. ее восстановление в данном случае) в системе напрямую не виды, но в дальнейшем сделаем вывод списка всех запланированных будущих действий над задачей, чтобы было понятно, как будет вести себя система.
Совместное использование (расшаривание) задач Google Tasks между несколькими пользователями
Задача чуть сложнее, т.к. манипуляций потребуется чуть больше. Google Tasks не позволяет передавать доступ к своим задачам другим пользователям. Поэтому расшаривание определенного списка задач Google Tasks между несколькими пользователями реализуем следующим образом — для каждого из пользователей Google Tasks настроим двустороннюю синхронизацию с совместно используемым списком у нас. Т.е. последовательность действий следующая:
- каждого из пользователей Google Tasks, который хочет использовать свой или чужой список совместно с другими пользователями того же Google Tasks регистрируем у нас (зарегистрироваться можно и с помощью Google ID). Одного нашего пользователя можно связать только с одним аккаунтом Google, поэтому и требуется каждого пользователя регистрировать у нас.
- на нашем сервисе один из пользователей (назовем его «владелец») предоставляет доступ к одному из своих списков другим пользователям (при желании владелец может установить каждому подключенному пользователю разные права доступа)
- все пользователи у себя настраивают двустороннюю синхронизацию в Google Tasks
В итоге каждый пользователь имеет у себя в Google Tasks общий совместный список задач, такой же как и у других пользователей. Точнее копию. Точнее постоянно актуализируемую копию. Внося в свой экземпляр списка изменения, они через некоторое время синхронизируются с нашим сервисом и «растекаются» другим пользователям. Каких-то пользователей можно сделать «read-only».
Этот пользователь регистрируется у нас, создает у нас список задач «Покупки» и настраивает двустороннюю синхронизацию с его списком в Google Tasks. Подробно эти шаги рассказывать не буду, это вроде и так понятно из предыдущих пунктов. После успешной синхронизации список у нас заполняется задачами из Google Tasks. Пользователь у нас может редактировать метки, даты задач, другие поля. Но синхронизироваться с Google Tasks будут только названия задач, заметки и сроки.
Т.к. одному аккаунту у нас может соответствовать только один аккаунт Google Tasks, то чтобы делегировать доступ к своим задачам другому пользователю Google Tasks он должен быть зарегистрирован у нас также отдельно. Т.е. второй пользователь регистрируется у нас и предоставляет доступ к Google Tasks. Далее нам надо в рамках нашего сервиса предоставить доступ к списку «Покупки» первого пользователя второму пользователю. Для этого первый пользователь открывает настройку своих списков и берет оттуда ссылку к расшариваемому списку из столбца «Ссылка для совместного доступа» с названием «Полный доступ».
Далее эта ссылка передается второму пользователю, который после перехода по ней (в этот момент ему нужно быть залогиненным на нашем сервисе) получает сообщение "Поздравляем! Доступ предоставлен, перезагрузите теперь главную страницу". Теперь у второго пользователя общий список доступен:
Далее второму пользователю остается в свою очередь настроить двустороннюю синхронизацию со своим списком в Google Tasks и все.
Если в процессе предоставления доступа получите сообщение «Доступ запрещен. Возможно этот google аккаунт уже подключен к другому пользователю на betasked.ru ?», то попробуйте повторить выйти из текущего гугл аккаунта (если он открыт), либо проделать то же самое в режиме «Инкогнито» (для Google Chrome).
В дальнейшем для обоих пользователей нет необходимости заходить в наш сервис, все измененные задачи в Google Tasks у любого пользователя будут периодически синхронизироваться и изменяться у другого пользователя Google Tasks. Пользователей, работающих совместно с одним списком, можеты быть сколько угодно.
Расшаривание только для чтения (read-only) задач Google Tasks другим пользователям
Задача аналогична предыдущей, только с некоторыми особенностями. Иногда нужно дать доступ к своему списку другому человеку, но нежелательно чтобы была возможность модификации данных. Эту задачу можно решить путем односторонней синхронизации задач от нас в Google Tasks пользователя, которому предоставлен доступ только для чтения. Строго говоря, это не совсем «read-only», такого гугл не позволяет, но за счет постоянной синхронизации все вносимые пользователем вручную изменения будут затираться. Пользователь также может добавлять туда свои задачи, но при синхронизации они затрагиваться не будут, т.к. синхронизация предполагает, что изменяться и удаляться на стороне Google Tasks могут только те задачи, которые созданы при синхронизации.
Тогда второй пользователь никак задачи в этом списке не изменит. Можно также установить другие права, к примеру, «Добавление и редактирование (без удаления)», тогда второй пользователь сможет изменять задачи, но не удалять. Кому нужна еще более тонкая настройка, можно запретить изменение определенного поля, к примеру срока и названия задачи. Тогда второй пользователь сможет только добавлять задачи в используемый совместный список и изменять заметки у имеющихся задач.
Уведомление по почте о приближающихся сроках по задачам из списка Google Tasks
Именно такая функция, возможно, мало кому нужна, но мы ее используем достаточно активно.
Чтобы получать уведомления по почте о предстоящем (например, за 7 дней) наступлении дедлайнов (due date, «срок задачи» в гугловской терминологии) у задач из определенного списка можно поступить так:
- настроить одностороннюю синхронизацию из Google Tasks к нам
- установить на список, в который будут синхронизироваться задачи, триггер, срабатывающий за 7 дней до срока задачи и отсылающий по почте зарегистрированному у нас пользователю письмо с темой «АХТУНГ! ...» и заметками задачи в теле письма.
После сохранения настроек задачи из Google Tasks скопируются в список «Основной». Далее устанавливаем триггер для всего списка, это доступно по пункту контекстного меню при правом клике по названию списка:
Устанавливаем триггер, он будет срабатывать за 7 дней до наступления срока задачи:
Все. Получаем уведомления с настраиваемым текстом и темой:
Примечание — пока система триггеров реализована так, что используемый в данном примере триггер будет срабатывать и тогда, когда задача помечена как выполненная. Это, естественно, не всегда удобно. Мы пока думаем над наиболее удобным механизмом решения этой проблемы.
Создание задач в Google Tasks по почте
Чтобы добавлять задачи в Google Tasks из писем, можно воспользоваться таким механизмом. Каждая задача у нас имеет свой адрес электронной почты (он доступен по пункту «Свойства» контекстного меню задачи), при отсылке письма на него через некоторое время у этой задачи появится подзадача, название которой будет взято из темы письма, а заметки — из тела письма. Текст берется без html тагов, поэтому если тело письма будет в html формате, то в тексте останутся заэкранированные таги. По этой причине лучше писать plain text письма. Созданная у нас из письма задача путем синхронизации через некоторое время появится и в Google Tasks. Для этого варианта нам понадобится настроить либо двустороннюю, либо синхронизацию по варианту «Из betasked в Google Tasks».
При отсылке письма на адрес указанный в поле «Адрес для подзадач» через некоторое время создастся подзадача из этого письма. Чтобы все это транслировать в Google Tasks — настройте простую (можно одностороннюю) синхронизацию.
Уведомление по почте о новых задачах в определенном тасклисте Google Tasks
Для решения этой задачи воспользуемся возможностью установки триггера на весь список задач (триггеры могут быть установлены на определенную задачу, цепочку повторяющихся задач, задачи с определенной меткой, определенный список или вообще на все задачи пользователя). При создании задачи (неважно как — при создании у нас в веб-интерфейсе или в Google Tasks) он будет срабатывать и выполнять действие «Уведомить меня по e-mail», т.е. к примеру отсылать на почту пользователя письмо с названием созданной задачи в теме письма и заметками задачи в теле.
Тема — «Создана задача %%this.name%%»
Текст — "%%this.notes%%".
В итоге на почту пользователя придет письмо с названием созданной задачи в теме письма и заметками задачи в теле.
Нюансы односторонней синхронизации из betasked в Google Tasks
Отдельно опишу нюансы синхронизации из betasked в Google Tasks, т.к. это более востребовано. Установка данной синхронизации в уже имеющийся тасклист Google Tasks не приведет к удалению уже имеющихся там задач. Если какие-то задачи и могут быть в дальнейшем удалены, то только те, которые были скопированы в процессе синхронизации. В том же списке на стороне Google Tasks можно также создавать задачи, они затираться не будут. Т.е. можно в одном списке задач держать и синхронизируемые с нами задачи и не синхронизируемые.
Доступны следующие варианты установки возможных действий на стороне Google Tasks:
- Только создание задач
- Только создание и изменение задач
- Только создание и удаление задач
- Только создание задач (удаленные не пересоздаются)
- Только создание (удаленные не пересоздаются) и изменение задач
- Только создание (удаленные не пересоздаются), изменение и удаление задач
- Только создание (удаленные не пересоздаются) и удаление задач
В большинстве случаев можно в эти варианты не углубляться и оставить дефолтный вариант.
Спросите «а зачем такие сложности»? Поясню на примерах.
Допустим, установили вы еженедельное повторение задачи (пускай через триггер, который делает задачу невыполненной каждые 7 дней).
Допустим, ввели вы задачу с датой 1 января 2015 года «Бросить пить». При наступлении 1 января она синхронизируется в Google Tasks, но впоследствии, бросив пить, вы захотите отметить эту задачу как выполненную в Google Tasks (я предполагаю, что для текущей работы с текущими задачами быстрее и удобнее все-таки править задачи там). Да, вы ее отметите либо удалите, но при следующей синхронизации она снова изменится к первоначальному виду, т.к. мы говорим об односторонней синхронизации, а она предполагает поддержание копий задач из источника. Поэтому решением здесь будет выбор варианта «Только создание задач (удаленные не пересоздаются)» в поле «Разрешения». Это позволит любым образом править или удалять уже синхронизировавшиеся задачи, повторно они создаваться не будут.
Поэтому, если вкратце, установка разрешений при данном виде синхронизации служит для обеспечения комфортной последующей работы в Google Tasks. Можно избежать таких сложностей, настроив двустороннюю синхронизацию, но в целях безопасности рекомендуется односторонняя, если ее достаточно. Несмотря на то, что синхронизацию мы запустили уже пять месяцев назад и особых фейлов не было, все равно остается какой-то подсознательный страх, что где-то в алгоритме есть потенциальный баг, который по закону подлости потрет все задачи. Если кто-то писал алгоритм двусторонней синхронизации иерархических структур (это основная сложность), тот, наверное, поймет. Поэтому, чтобы уж наверняка при каких-либо сбоях не задеть пользовательских данных, можно использовать односторонюю.
Заключение
Напоследок оговорю некоторые важные моменты для интересующихся в деталях:
- Постарайтесь выделить для синхронизации отдельные тасклисты Google Tasks. Действующие алгоритмы синхронизации не должны нанести вред уже имеющимся данным в Google Tasks, но все равно, во избежание неожиданных результатов, на первых порах лучше выделите для синхронизируемых данных отдельный тасклист.
- Сразу не используйте двустороннюю синхронизацию. Двусторонняя синхронизация не должна удалить ничего лишнего в вашем списке в Google Tasks, но все равно, начните с односторонней, если получили то что ожидали — тогда можно переключиться на двусторонний механизм.
- Не используйте фильтры при двусторонней синхронизации или в качестве принимающей стороны.Точнее, используйте, только если четко понимаете, чего хотите этим добиться.Дело в том, что при неправильной настройке фильтра на принимающей стороне (при синхронизации с Google Tasks в Betasked либо при двусторонней синхронизации) новые задачи могут не попасть в этот фильтр по критериям.
- При настройке односторонней синхронизации при первом сеансе синхронизации уже имеющиеся задачи на принимающей стороне не удаляются. Т.е. после первоначального запуска односторонней синхронизации все задачи с передающей стороны будут скопированы на принимающую сторону, при этом уже имеющиеся там задачи удалены не будут. В дальнейшем с принимающей стороны при сеансах синхронизации будут удаляться только те задачи, которые были созданы на передающей стороне и впоследствии удалены.
- При удалении синхронизационной пары задачи на обоих сторонах не удаляются, однако надо помнить, что повторная установка аналогичной синхронизации приведет к тому, что задачи на принимающих сторонах создадутся заново еще раз, что будет выглядеть как «задвоение» всех задач. Поэтому если нужно отключить синхронизацию на время – пользуйтесь флажком «Включена».
- При установке задержки в триггерах имейте в виду, что даже если вы поставите задержку в 1 минуту, действие произойдет через 5 минут, т.к. все отложенные действия обрабатываются раз в 5 минут (пока)
Ну и ссылка на сервис. Зарегистрироваться можно с помощью Google OAuth, либо можно попробовать демо без регистрации. В демо режиме лучше не подключать свой Google аккаунт, а то данные будут доступны всем.
На мобильных устройствах (Android, iOS) сервис работает неудобно (точнее криво, жесты не поддерживаются), мобильная версия в разработке.
Автор: betasked