2

Я использую Google Calendar API и я скопировать события из одного календаря в другой, как это:Принуждение новый идентификатор на событие вставки

CalendarService service = new CalendarService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = this.ApplicationName 
      }); 
CalendarListResource.ListRequest calRequest = service.CalendarList.List(); 
calRequest.MinAccessRole = CalendarListResource.ListRequest.MinAccessRoleEnum.Owner; 
CalendarList calendars = calRequest.Execute(); 
CalendarListEntry selectedCalendar = calendar.Items[0]; 

EventsResource.ListRequest eventRequest = service.Events.List(selectedCalendar.Id); 
eventRequest.TimeMin = DateTime.Now; 
eventRequest.ShowDeleted = false; 
eventRequest.SingleEvents = true; 
eventRequest.MaxResults = 50; 
eventRequest.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime; 
Events events = eventRequest.Execute(); 

Event currentEvent = events.Items[0]; 
EventsResource.InsertRequest copyRequest = service.Events.Insert(currentEvent, calendarToCopyTo.Id); 
copyRequest.Execute(); 

Он отлично работает .... первая время. Во второй раз он выдает ошибку, потому что идентификатор события больше не уникален на calendarToCopyTo (даже если я удалю только что созданное событие и повторю попытку). Мой вопрос: как я могу заставить новый идентификатор быть сгенерированным в событии, которое я «вставляю»? Я пробовал currentEvent.Id = ""; перед этими строками, но это, похоже, не сработало.

Google.Apis.Requests.RequestError Запрошен идентификатор уже существует. [409] Ошибки [Сообщение [Запрашиваемый идентификатор уже существует] Местоположение [-.] Причина [дубликат] Домен [глобальный]]

Согласно этому example (в .NET один), я, вероятно, следует просто создать новый объект Event (основанный на currentEvent), затем отправьте его как параметр в запрос Insert. Итак, еще один вопрос: какой самый простой способ скопировать все свойства из одной переменной Event (здесь currentEvent) в другую?

+0

Вы можете удалить идентификатор из объекта currentEvent? или, возможно, клонировать объект в новый объект, чтобы удалить его? это звучит как странная ошибка для меня. Google должен создавать идентификатор, когда после вставки я бы подумал и проигнорировал любой отправленный вами идентификатор.Какая именно ошибка вы получаете, пожалуйста? – DaImTo

+0

Да, я надеялся, что Google создаст новый идентификатор нового события в 'calendarToCopyTo' каждый раз (независимо от Идентификатора события, которое вы отправляете). Точное сообщение об исключении: «Google.Apis.Requests.RequestError. Запрошенный идентификатор уже существует. [409] Ошибки [Сообщение [запрошенный идентификатор уже существует.] Местоположение [-] Причина [дубликат] Домен [глобальный]] '. https://developers.google.com/google-apps/calendar/v3/errors сообщает мне, что мне нужно создать новый идентификатор, и я не уверен, как это сделать (кроме создания нового объекта Event) – derekantrican

+0

Можете ли вы опубликовать остальную часть своего кода, как вы действуете? – DaImTo

ответ

0

Хорошо, вот что я узнал (и решение, которое я придумал):

Во-первых, если вы хотите использовать мой код, который я имел выше, вы должны вызвать оба эти строки перед copyRequest инициализируется:

currentEvent.Id = ""; 
currentEvent.ICalUID = ""; 

(потому что Id и ICalUID оба используют в качестве идентификаторов, поэтому оба должны быть сброшены). Важное примечание:, если вы позже назовете что-то вроде UpdateRequest с currentEvent, возникнут проблемы, потому что вы очистили Id этого объекта (поскольку UpdateRequest требует eventId в качестве параметра - так что даже если вы сохранили его из перед этим вам придется «повторно установить» идентификатор и ICalUID еще до инициализации этого запроса). [ICalUID по существу равна Id + "@google.com"]

Мое решение:

Вместо того, чтобы сохранить Id и ICalUID, очистить его, скопировать событие, а затем установить их обратно до моего UpdateRequest, я создал метод клонирования для клонирования событие:

private Event clone(Event eventToClone) 
{ 
    Event result = new Event(); 

    foreach (PropertyInfo property in typeof(Event).GetProperties()) 
    { 
     if (property.CanRead) 
      property.SetValue(result, property.GetValue(eventToClone, null)); 
    } 

    return result; 
} 

Так что теперь мой код для копирования события в другой календарь только становится этим:

Event newEvent = clone(currentEvent); 
newEvent.Id = ""; 
newEvent.ICalUID = ""; 
EventsResource.InsertRequest copyRequest = service.Events.Insert(newEvent, calendarToCopyTo.Id); 
copyRequest.Execute(); 

Надеюсь, это поможет кому-то в будущем!

0

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

try 
{ 
    service.Events.Insert(newEvent, calendarId).Execute(); 
} 
catch (Exception) 
{ 
    service.Events.Update(newEvent, calendarId, newEvent.Id).Execute(); 
} 

В решении это прекрасно работает.

Смежные вопросы