[英]How to retrieve all events from Google Calendar API, using JavaScript
阅读Google API文档,可以很轻松地检索日历中的事件,但是我意识到有一些例外:
1-重复发生的事件:在其他帖子中,有关检索这些事件的问题很多。 我在其他文章中找到的解决方案是将singleEvents设置为true,但是不幸的是,在这种情况下,全天事件都会出现问题。
2-通常每个事件应有一个ID,这是一个唯一的代码。 当您检索事件的重复发生时,该ID将具有类似“ mainEventID_recurrenceTimestamp”的模式,但是当您检索日历中的事件列表时,该事件ID中不应包含下划线。 但是,有时当某人更新您日历上的事件(例如更新事件的位置)时,会有两个事件的所有属性具有相同的值,唯一的区别是更新的属性(位置)和ID。 更新后的事件的ID将类似于“ mainEventID_recurrenceTimestamp”。 在这种情况下,可能会发生两种类型的问题:
a)您将检索并处理同一事件的两个实例。 b)当您想在第一个请求中找到所有重复发生的事件,并在以下请求中检索所有重复发生,并且使用诸如“ mainEventID_recurrenceTimestamp”之类的模式传递ID时,将没有响应。
我花了一些时间来找出这些异常,并且编写了几行JavaScript代码,可以解决这些异常并从日历中检索所有事件,包括重复事件和全天事件。
我将代码放在这里,因此,如果其他任何人遇到类似的异常,他们也可以使用此代码。 如果您改进此代码,我也将不胜感激,以便其他人可以从中受益:
function retrieveAllEvents(yourcalendarId, yourKey) {
var events;
var waitForResponses = [];
var recievingData = false;
$.get( "https://www.googleapis.com/calendar/v3/calendars/" + yourcalendarId + "/events/?",
{ (Optional parameters like maxResults), key: yourKey } )
.done(function( data ) {
events = data["items"];
for (i = 0; i < events.length; i++) {
if (events[i]['status'] != "confirmed") {
events.splice(i, 1);
i--;
}
for (j = 0; j < events.length; j++) {
if (i != j && events[i]['id'].indexOf(events[j]['id']) > -1) {
events.splice(i, 1);
i--;
break;
}
}
}
var thereisRecurrentEvent = false;
for (i = 0; i < events.length; i++) {
if ("recurrence" in events[i]) {
waitForResponses.push(events[i]['id']);
thereisRecurrentEvent = true;
events.splice(i, 1);
i--;
recieveRecurrentEvent();
}
}
if (!thereisRecurrentEvent) {
AllEventsReceived(events);
}
});
function retrieveRecurrentEvent() {
if (!recievingData) {
recievingData = true;
$.get( "https://www.googleapis.com/calendar/v3/calendars/" + yourcalendarId + "/events/" + waitForResponses[0] + "/instances?",
{ (Optional parameters like maxResults), key: yourKey } )
.done(function( data ) {
events = events.concat(data["items"]);
for (j = 0; j < events.length; j++) {
if (events[j]['status'] != "confirmed") {
events.splice(j, 1);
j--;
}
}
waitForResponses.splice(0, 1);
if (waitForResponses.length == 0) {
AllEventsReceived(events);
}
else {
recievingData = false;
retrieveRecurrentEvent();
}
});
}
}
return events;
}
我尝试在API资源管理器( https://developers.google.com/apis-explorer/#p/calendar/v3/calendar.events.list )中使用singleEvents = true检索全天事件:
并正确地获得了全天活动:
"start": {
"date": "2014-08-08"
},
"end": {
"date": "2014-08-11"
},
我的建议是代替您的代码来做:
var pageToken;
var events = [];
var query = "https://www.googleapis.com/calendar/v3/calendars/" + yourcalendarId + "/events/?";
do {
$.get( query, { pageToken: pageToken, singleEvents:true, key: yourKey } )
.done(function( data ) {
events = events.concat(data["items"]);
pageToken = data["nextPageToken"];
});
}
while (pageToken);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.