Ответ 1
Это очень похоже на вопрос, заданный всего два дня назад, а именно синхронизацию электронной таблицы событий с календарем. Похоже, вы хотите, чтобы электронная таблица была хозяином происходящих событий, что значительно упростило бы проблему. Основы того, что вам нужно сделать, описаны в этом ответе. Если вы хотите просто изменить существующий код, у меня есть реализация ниже.
У меня есть модифицированная версия кода из этого блога, который изменит ранее существовавшие записи календаря в соответствии с информацией в электронной таблице, Я разместил свою таблицу по-разному, и это отражено в коде.
Дата | Название | Время начала | Время окончания | Расположение | Описание | EventID
Столбец идентификатора события заполняется script при создании новых событий и затем используется в последующих вызовах для извлечения событий из календаря, тем самым избегая дублирования.
Script
/**
* Adds a custom menu to the active spreadsheet, containing a single menu item
* for invoking the exportEvents() function.
* The onOpen() function, when defined, is automatically invoked whenever the
* spreadsheet is opened.
* For more information on using the Spreadsheet API, see
* https://developers.google.com/apps-script/service_spreadsheet
*/
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Export Events",
functionName : "exportEvents"
}];
sheet.addMenu("Calendar Actions", entries);
};
/**
* Export events from spreadsheet to calendar
*/
function exportEvents() {
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 1; // Number of rows of header info (to skip)
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "YOUR_CALENDAR_ID";
var cal = CalendarApp.getCalendarById(calId);
for (i=0; i<data.length; i++) {
if (i < headerRows) continue; // Skip header row(s)
var row = data[i];
var date = new Date(row[0]); // First column
var title = row[1]; // Second column
var tstart = new Date(row[2]);
tstart.setDate(date.getDate());
tstart.setMonth(date.getMonth());
tstart.setYear(date.getYear());
var tstop = new Date(row[3]);
tstop.setDate(date.getDate());
tstop.setMonth(date.getMonth());
tstop.setYear(date.getYear());
var loc = row[4];
var desc = row[5];
var id = row[6]; // Sixth column == eventId
// Check if event already exists, update it if it does
try {
var event = cal.getEventSeriesById(id);
}
catch (e) {
// do nothing - we just want to avoid the exception when event doesn't exist
}
if (!event) {
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();
row[6] = newEvent; // Update the data array with event ID
}
else {
event.setTitle(title);
event.setDescription(desc);
event.setLocation(loc);
// event.setTime(tstart, tstop); // cannot setTime on eventSeries.
// ... but we CAN set recurrence!
var recurrence = CalendarApp.newRecurrence().addDailyRule().times(1);
event.setRecurrence(recurrence, tstart, tstop);
}
debugger;
}
// Record all event IDs to spreadsheet
range.setValues(data);
}
Удалить/Восстановить
В этой альтернативе eventID используется для поиска и удаления ранее существовавшего события. После этого создается новое событие с данными в электронной таблице. Это имеет то преимущество, что все значения события могут быть обновлены, включая время начала и остановки (см. Примечания ниже). С другой стороны, любые изменения, внесенные в исходное событие, будут потеряны - например, если другие люди были приглашены на мероприятие или добавлены пользовательские напоминания.
Чтобы использовать эту альтернативу, просто замените соответствующий код следующим образом:
// Check if event already exists, delete it if it does
try {
var event = cal.getEventSeriesById(id);
event.deleteEventSeries();
row[6] = ''; // Remove event ID
}
catch (e) {
// do nothing - we just want to avoid the exception when event doesn't exist
}
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();
row[6] = newEvent; // Update the data array with event ID
debugger;
Примечания
- Документация для
getEventSeriesById
ошибочно заявляет, что возвращаетnull
, когда не найдено подходящего события, а вместо этого выдает исключение. (противно!) Итак, я включил его в блок try/catch, чтобы продолжать плавать. - К сожалению, пока
getEventSeriesById
работает для извлечения события, объектreturns
aEventSeries
, который не поддерживает методsetTime()
. Если вы не ожидаете изменить время событий, это нормально. В противном случае вы можете изменитьEvent
наEventSeries
, установив правила повторения и время, или удалите старое событие и создайте новый, как показано в Удалить/Восстановить. Проблема 1154. - Таблица всегда выигрывает. Любые изменения событий (в соответствующих полях), записанные через Календарь Google, будут перезаписаны script.