我正在使用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();
它第一次很棒....第二次,它会抛出一个错误,因为事件Id在calendarToCopyTo
上不再是唯一的(即使我删除刚创建的事件并再次尝试)。我的问题是:如何在我“插入”的事件上强制生成新的Id?我在这些行之前尝试了currentEvent.Id = "";
,但这似乎不起作用。
Google.Apis.Requests.RequestError已请求的标识符 存在。 [409]错误[消息[已请求的标识符 存在。]位置[ - ]原因[重复]域[全局]]
根据这个example(.NET版),我应该只创建一个新的Event
对象(基于currentEvent
),然后将其作为参数发送到Insert请求。这里的另一个问题是:将所有属性从一个Event
变量(此处为currentEvent
)复制到另一个变量的最简单方法是什么?
答案 0 :(得分:0)
好的,这是我学到的东西(以及我提出的解决方案):
首先,如果你想使用我上面的代码,你必须在copyRequest初始化之前调用这两行:
currentEvent.Id = "";
currentEvent.ICalUID = "";
(因为Id
和ICalUID
都用作ID,因此两者都必须重置。 重要说明:如果您稍后要使用currentEvent调用类似UpdateRequest的内容,则会出现问题,因为您清除了该对象的ID(因为UpdateRequest需要eventId作为参数 - 所以甚至如果你以前保存它,你必须在初始化该请求之前再次“重新设置”Id和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();
希望这可以帮助将来的某个人!
答案 1 :(得分:0)
你可以使用try catch,所以如果不存在那么它会创建,否则它会更新,如下所示:
try
{
service.Events.Insert(newEvent, calendarId).Execute();
}
catch (Exception)
{
service.Events.Update(newEvent, calendarId, newEvent.Id).Execute();
}
在我的解决方案中它完美无缺。