Как синхронизировать календарь и таблицу Google со скриптом
Я пытаюсь создать сценарий Служб Google, который поддерживает синхронизацию Календаря Google и "основной таблицы" на диске. Возможно ли это? Я нашел эти два сообщения:
http://blog.ouseful.info/2010/03/04/maintaining-google-calendars-from-a-google-spreadsheet/
http://blog.ouseful.info/2010/03/05/grabbing-google-calendar-event-details-into-a-spreadsheet/
Я вполне уверен, что это можно сделать, используя множество операторов if и логику, но, может быть, есть более простой способ?
Я просто предоставил следующий простой скрипт. Все, что было действительно необходимо, это добавлять события, основанные на двух столбцах, и это заняло бы слишком много времени для разработки.
function onOpen() {
//spawns a menu with a button that triggers AddToCal
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Add event to calendar",
functionName : "AddToCal"
}];
sheet.addMenu("Data To Calendar Plugin", entries);
};
function AddToCal(){
//get the current row
var ss = SpreadsheetApp.getActiveSpreadsheet();
var cell = ss.getActiveCell();
var R = cell.getRow();
//grab values for current row to pass to calendar event
var date_of_event = ss.getRange('G'+R).getValue();
var date = new Date(date_of_event);
var event_title = ss.getRange('A'+R).getValue();
//access the calendar
var cal = CalendarApp.getCalendarById('[IDREMOVED]');
cal.createAllDayEvent(event_title,date);
ss.toast("Event added to " + cal.getName());
}
3 ответа
Да, можно написать сценарий двусторонней синхронизации событий, но он не будет простым. Эти два поста, на которые вы ссылаетесь, содержат части, которые можно использовать повторно, но они довольно элементарны по сравнению с проблемами, с которыми вы столкнетесь при реальной синхронизации. Возможно, вы захотите ознакомиться с использованием скрипта Google Apps для системы бронирования событий, которая создает записи календаря на основе электронной таблицы (но не выполняет текущую синхронизацию). Я делал некоторые отладки этого скрипта в прошлом.
Синхронизация должна будет поддерживать:
- Создание событий в любом месте
- Изменение сведений о событии в любом месте (хотя для упрощения вы можете рассмотреть только подмножество сведений о событии)
- Удаление событий в любом месте
- Повторение, например
CalendarEvent.getEventSeries()
обработка (или выбрать, чтобы избежать)
Это псевдокод, с которого вы могли бы начать:
Open Calendar, Read Calendar events into calArray (will all attributes you care for)
Open Spreadsheet, Read Spreadsheet events into sheetArray
For each event in calArray:
Search for calEvent in sheetArray.
If found, compare lastUpdated values.
If equal, do nothing
Otherwise copy most recently updated to least recently updated
Continue with next event
If not found then copy calEvent to new sheetEvent, including lastUpdated value.
Continue with next event
For each event in the sheetArray (...that hasn't been handled yet)
Similar logic above.
Write updated sheetArray to spreadsheet.
Write updated calEvents to calendar API (see note 1 below)
Заметки:
Все обновления calEvents могут быть сделаны в виде массива и записаны в календарь API немедленно, как альтернатива массовому обновлению. Это избавит от необходимости отслеживать изменения локально, хотя было бы неплохо коснуться значения lastUpdated.
Вы хотите использовать
CalendarEvent.getLastUpdated()
при чтении calEvents и сохраните аналогичное значение в электронной таблице (привязанной кonEdit
триггер) для облегчения сравнения.Это упростит сравнение с записью
CalendarEvent.getId()
против событий в электронной таблице. У вас также естьCalendarEvent.setTag(key,value)
это может быть использовано для записи пользовательских метаданных в календарь, например, для указания событий, которые произошли или были синхронизированы с вашей электронной таблицей. (Эти теги не доступны через интерфейс GCal, поэтому будут доступны только через скрипт.)Вам следует подумать о диапазоне дат или количестве событий, с которыми вы хотите иметь дело, и ограничить область действия сценария. Если вы этого не сделаете, вы обязательно столкнетесь с ограничениями по времени выполнения в реальной работе.
Некоторые характеристики календарных событий не поддаются простому выражению в электронной таблице, например:
- Список гостей
- Список напоминаний
Как уже упоминалось (спасибо Энрике) в другом посте, я потратил некоторое время - именно это и привело меня в GAS - на обмен данными между электронными таблицами и календарями, главным образом потому, что люди, с которыми я работал, использовали для организации своего расписания (для старшие классы) в электронных таблицах и мне пришлось позаботиться о переходе на Google Calendars.
Однако через некоторое время оказалось, что интерфейс онлайн-календаря гораздо эффективнее для создания событий, поэтому они больше не используют лист для сценариев календаря!!
С другой стороны, параметры печати и презентации в GCal очень ограничены, поэтому другое направление все еще очень полезно, и мы используем его постоянно!
Я знаю, что это может показаться не по теме исходного вопроса и, возможно, слишком анекдотичным, но я просто хотел отметить, что вы должны тщательно подумать о том, что вам действительно нужно, прежде чем изобретать колесо... Как упоминал Могсдад, некоторые параметры событий нелегко описать в логике электронных таблиц, и, наконец, он может стать намного более сложным в использовании, чем оригинальный инструмент.
Единственный действительно полезный инструмент, который я разработал с использованием двунаправленной передачи данных, - это "инструмент пакетной модификации", когда мне нужно удалить или отредактировать большое количество похожих событий.
Например, если нам нужно по какой-то причине менять имя учителя в течение всего года, я импортирую все события для ряда классов, заменяю имя в электронной таблице и обновляю календарь занятий... это занимает у меня 5 минут и это очень просто, но это очень специфические случаи использования, и я не уверен, что это очень распространено.
Во всяком случае, я бы не назвал эту "синхронизацию", поскольку она занимает некоторое время и изменяет их... Я никогда не пытался поддерживать электронную таблицу в актуальном состоянии с календарем, поскольку мои календари опыта достаточно надежны, и я считаю, их в качестве исходного источника данных. Как я уже сказал, мы импортируем данные в электронные таблицы каждую неделю только для печати и локального архивирования.
Извините за этот длинный и немного расплывчатый комментарий (это было слишком долго, чтобы вписаться в обычный комментарий 500 chrs;-)
Я написал сценарий, который синхронизирует GCalendar и GSheet. Вы можете использовать его как есть или, конечно, можете заимствовать из него идеи. Существуют отдельные команды для копирования событий в каждую сторону: https://github.com/Davepar/gcalendarsync
Нет, нет И хотя многие вопросы, касающиеся Службы календаря скриптов приложений, были решены (часовые пояса, события на весь день, запросы и т. Д.), Это все еще довольно сложная задача.
Я знаю, что Серж, Serge insas в теге #google-apps-script, разработал довольно много сценариев, включающих службу календаря.
Но я в любом случае не знаю, что произвело двустороннее обновление между календарем и таблицей. Это должно быть трудно. Если вы когда-либо, пожалуйста, поделитесь:)