【问题标题】:How to retrieve all events from Google Calendar API, using JavaScript如何使用 JavaScript 从 Google Calendar API 检索所有事件
【发布时间】:2014-10-03 15:54:38
【问题描述】:

阅读 Google API 文档,很容易在日历中检索事件,但我意识到有一些例外:

1- 经常性事件:在其他帖子中检索这些事件有很多问题。我在其他帖子中找到的解决方案是将 singleEvents 设置为 true,但不幸的是,在这种情况下,全天事件会出现问题。

2- 通常每个事件都应该有一个 id,这是一个唯一的代码。当您检索事件的重复时,ID 将具有类似“mainEventID_recurrenceTimestamp”的模式,但是当您检索日历中的事件列表时,事件 ID 中不应有下划线。但是,有时当有人更新您日历上的事件时,例如更新事件的位置,将会有两个事件对于所有属性具有相同的值,唯一的区别是更新的属性(位置)和 ID。更新的事件将具有类似“mainEventID_recurrenceTimestamp”的 ID。在这种情况下可能会出现两种类型的问题:

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;
}

【问题讨论】:

  • 您能否提及 singleEvents=true 和全天事件有什么问题?这段代码做了很多调用和工作,会吃掉配额,甚至不能正确处理分页。
  • 这就是发生的事情:我使用了 singleEvents=true 并且全天的事件都没有出现。请您自己试一试并告诉我们结果好吗?如果您修改我的代码并使其更高效,我将非常感激,这样每个人都可以从中受益。谢谢。
  • 是的,如果我有点苛刻,我很抱歉。感谢您分享您的代码,请检查我的答案。

标签: javascript jquery api google-calendar-api recurring-events


【解决方案1】:

我尝试在 API Explorer (https://developers.google.com/apis-explorer/#p/calendar/v3/calendar.events.list) 中使用 singleEvents = true 检索全天事件:

获取https://www.googleapis.com/calendar/v3/calendars/primary/events?singleEvents=true&timeMax=2014-08-15T00%3A00%3A00Z&timeMin=2014-08-10T00%3A00%3A00Z

并通过以下方式正确返回全天活动:

   "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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多