如何从Google calendar API .NET中删除特定日历中的所有事件条目

时间:2011-05-20 17:22:22

标签: c# .net google-api google-calendar-api

我正在尝试编辑工具以允许用户从其日历列表中进行选择,然后根据Microsoft项目任务清除所有事件条目/添加新条目。 下面是原始工具:http://daball.github.com/Microsoft-Project-to-Google-Calendar/

我对Google API /日历API完全缺乏经验,但我遇到了一些麻烦。我正在编辑的程序会跟踪用户从其日历列表中选择的CalendarEntry。我目前要做的是创建一个EventFeed,它给我所选日历的EventEntries,这样我就可以删除所有这些日历。这样做的目的是允许某人使用此工具在更改时也从项目文件更新日历。这是我尝试删除的功能。

 private void clearPreviousCalendarEntries(CalendarEntry calendarEntry)
    {      
        EventQuery query = new EventQuery();
        query.Uri = new Uri(calendarEntry.Links[0].AbsoluteUri);

        EventFeed feed = (EventFeed)calendarService.Query(query);

        AtomFeed batchFeed = new AtomFeed(feed);

        foreach (EventEntry entry in feed.Entries)
        {
            entry.Id = new AtomId(entry.EditUri.ToString());
            entry.BatchData = new GDataBatchEntryData(GDataBatchOperationType.delete);
            batchFeed.Entries.Add(entry);
        }

        EventFeed batchResultFeed = (EventFeed)calendarService.Batch(batchFeed, new Uri(feed.Batch));

        foreach (EventEntry entry in batchResultFeed.Entries)
        {
            if (entry.BatchData.Status.Code != 200 && entry.BatchData.Status.Code != 201)
                this.listBoxResults.SelectedIndex = this.listBoxResults.Items.Add("Problem deleteing " + entry.Title.Text + " error code: " + entry.BatchData.Status.Code);
            else
                this.listBoxResults.SelectedIndex = this.listBoxResults.Items.Add("Deleted " + entry.Title.Text);
        }

    }

我的Feed不会返回我希望的结果,但说实话我不确定如何正确地请求事件。

query.Uri = new Uri(calendarEntry.Links[0].AbsoluteUri);是我从程序的一部分中抓取的,它将事件添加到特定日历

AtomEntry insertedEntry = calendarService.Insert(new Uri(calendarEntry.Links[0].AbsoluteUri), eventEntry);

这些帖子肯定与我正在寻找的内容有关,但我还没有找到解决方案

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

            CalendarService myService = new CalendarService("your calendar name");
            myService.setUserCredentials(username, password);

            CalendarEntry calendar;

            try
            {
                calendar = (CalendarEntry)myService.Get(http://www.google.com/calendar/feeds/default/owncalendars/full/45kk8jl9nodfri1qgepsb65fnc%40group.calendar.google.com);
                foreach (AtomEntry item in calendar.Feed.Entries)
                {
                    item.Delete();
                }
            }
            catch (GDataRequestException)
            {
            }

您可以在Google日历中的日历详细信息页面中找到“日历ID”(类似于:45kk8jl9nodfri1qgepsb65fnc%40group.calendar.google.com)。

这是一篇相关文章:

google calendar api asp.net c# delete event

这是一个有用的文档:

http://code.google.com/intl/it-IT/apis/calendar/data/2.0/developers_guide_dotnet.html

答案 1 :(得分:0)

我最终得到的一种方法是从日历的URI中收集calendarID,然后使用该id创建一个新的EventQuery。这是上面代码的新版本

private void clearPreviousCalendarEntries(CalendarEntry calendarEntry)
    {
        this.listBoxResults.SelectedIndex = this.listBoxResults.Items.Add("Clearing previous calender entries");

        String calendarURI = calendarEntry.Id.Uri.ToString();
        //The last part of the calendarURI contains the calendarID we're looking for
        String calendarID = calendarURI.Substring(calendarURI.LastIndexOf("/")+1);

        EventQuery query = new EventQuery();
        query.Uri = new Uri("http://www.google.com/calendar/feeds/" + calendarID + "/private/full");

        EventFeed eventEntries = calendarService.Query(query);

        AtomFeed batchFeed = new AtomFeed(eventEntries);

        foreach (AtomEntry entry in eventEntries.Entries)
        {
            entry.Id = new AtomId(entry.EditUri.ToString());
            entry.BatchData = new GDataBatchEntryData(GDataBatchOperationType.delete);

            batchFeed.Entries.Add(entry);
        }

        EventFeed batchResultFeed = (EventFeed)calendarService.Batch(batchFeed, new Uri(eventEntries.Batch));

        //check the return values of the batch operations to make sure they all worked.
        //the insert operation should return a 201 and the rest should return 200
        bool success = true;
        foreach (EventEntry entry in batchResultFeed.Entries)
        {
            if (entry.BatchData.Status.Code != 200 && entry.BatchData.Status.Code != 201)
            {
                success = false;
                listBoxResults.SelectedIndex = listBoxResults.Items.Add("The batch operation for " +
                    entry.Title.Text + " failed.");
            }
        }

        if (success)
        {
            listBoxResults.SelectedIndex = listBoxResults.Items.Add("Calendar event clearing successful!");
        }

    }

我对此并不特别满意,使用字符串操作来收集信息并将我自己的查询拼凑起来似乎很奇怪。但它确实有效,我一直在努力寻找完成这项工作的方法。