如何在 C# 中读取 Google 日历






4.82/5 (37投票s)
本文将介绍如何在 C# 中使用 Google 日历。
引言
本文介绍了如何使用 Google 数据 API 通过 C# 读取您的 Google 日历。它将允许开发人员编写与 Google 服务交互的应用程序,这些服务将具有日历、Google 文档和联系人等多种服务。
通过使用 API 可以进行日历的同步、导入和导出。通过使用 Google 日历服务,您可以创建新事件、编辑或删除现有事件以及查询符合特定条件的事件。
注意:本文仅描述了 Google 日历服务。但以同样的方式,您将能够使用 Google 提供的其他服务。请获取源代码以获取更多信息。

如何使用 Google 数据 API
您必须从以下链接下载 Google 数据 API,并安装在您的机器上
Google 数据 API 链接:http://code.google.com/p/google-gdata/downloads/detail?name=Google%20Data%20API%20Setup%281.4.0.2%29.msi&can=2&q=
以下是使用 Google 日历服务的参考
Google.GData.AccessControl
Google.GData.Client
Google.GData.Extensions
需要以下三个命名空间。
Google.GData.Calendar
命名空间具有查看和更新日历事件的功能。Google.GData.Extensions
命名空间包含常见的扩展元素。Google.GData.Client
命名空间包含服务实现。
using Google.GData.Calendar;
using Google.GData.Extensions;
using Google.GData.Client;
背景
由于 Google 应用程序越来越受欢迎,我决定写一篇关于 Google 应用程序的文章,这对许多人来说会很有用。
示例应用程序包含六个项目

Google 帮助程序项目
此项目有一个 Google 日历的帮助程序类,它具有 GetService
、GetAllEvents
和 AddEvents
方法。
CalendarHelper
类有三个用于从 Google 应用程序获取服务的属性。ApplicationName
可以是任何东西,比如 "AAA
"。UserName
是您的 GMail 用户 ID,Password
是您的 GMail 密码。
public class CalendarHelper
{
public string ApplicationName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
GetService
方法将由 Google 日历数据 API 访问,并返回服务对象public class CalendarHelper { public static CalendarService GetService(string applicationName, string userName, string password) { CalendarService service = new CalendarService(applicationName); service.setUserCredentials(userName, password); return service; } }
GetAllEvents
方法使用查询对象从 Google 日历读取日历数据。这将需要两个参数。CalendarService
是您在上一步中创建的服务对象。startDate
是您需要从 Google 日历查询的实际查询。EventQuery
对象保存查询。public static IEnumerable<EventEntry> GetAllEvents (CalendarService service, DateTime? startData) { // Create the query object: EventQuery query = new EventQuery(); query.Uri = new Uri("http://www.google.com/calendar/feeds/" + service.Credentials.Username + "/private/full"); if (startData != null) query.StartTime = startData.Value; // Tell the service to query: EventFeed calFeed = service.Query(query); return calFeed.Entries.Cast<EventEntry>(); }
AddEvent
方法将新日历数据添加到 Google 日历中。必须提供事件标题、内容、位置、开始时间和结束时间。- 事件标题是您的新日历标题
- 内容是描述
- 位置是事件位置
- 开始时间是您计划开始事件的时间
- 结束时间是您计划结束事件的时间
public static void AddEvent(CalendarService service, string title,
string contents, string location, DateTime startTime, DateTime endTime)
{
EventEntry entry = new EventEntry();
// Set the title and content of the entry.
entry.Title.Text = title;
entry.Content.Content = contents;
// Set a location for the event.
Where eventLocation = new Where();
eventLocation.ValueString = location;
entry.Locations.Add(eventLocation);
When eventTime = new When(startTime, endTime);
entry.Times.Add(eventTime);
Uri postUri = new Uri
("http://www.google.com/calendar/feeds/default/private/full");
// Send the request and receive the response:
AtomEntry insertedEntry = service.Insert(postUri, entry);
}
Google 适配器项目
此项目具有 GoogleEventsSyncDataSource
类,该类将处理我们上面描述的 Helper
类的所有操作。ISyncDataSource
接口被继承到 GoogleEventsSyncDataSource
类中,并且这些接口签名(例如 GetItemHeaders
)的类型为 IEnumerable<T>
,并且具有一个参数,即 lastSyncTime
,您需要提供日期和时间。LoadItemContents
在此示例中未使用,但如果需要,您可以实现它。WriteItems
有一个 IEnumerable<T>
类型的参数,当您将事件写入 Google 时需要提供它。

GoogleEventsSyncDataSource
承包商将创建一个您稍后需要的服务对象。
注意:您必须根据需要更改用户名和密码。
namespace GoogleAdapter
{
public class GoogleEventsSyncDataSource : ISyncDataSource<GenericEvent>
{
CalendarService service;
public GoogleEventsSyncDataSource()
{
service = CalendarHelper.GetService("AAA", "mygmail@gmail.com", "mypassword");
}
#region ISyncDataSource<GenericEvent> Members
public string Id
{
get { return "Google Calander Sync Data Source"; }
}
public IEnumerable<GenericEvent> GetItemHeaders(DateTime? lastSyncTime)
{
var googleEvents = CalendarHelper.GetAllEvents(service, lastSyncTime);
List<GenericEvent> genericEvents = new List<GenericEvent>();
foreach (var googleEvent in googleEvents)
{
GenericEvent genericEvent = new GenericEvent();
genericEvent.Title = googleEvent.Title.Text;
genericEvent.Contents = googleEvent.Content.Content;
genericEvent.Location = googleEvent.Locations.First().ValueString;
genericEvent.StartTime = googleEvent.Times.First().StartTime;
genericEvent.EndTime = googleEvent.Times.First().EndTime;
genericEvents.Add(genericEvent);
}
return genericEvents;
}
public void LoadItemContents(IEnumerable<GenericEvent> items)
{
//Nothing to load here
}
public void WriteItems(IEnumerable<GenericEvent> items)
{
foreach (var item in items)
{
CalendarHelper.AddEvent(service, item.Title,
item.Contents, item.Location, item.StartTime, item.EndTime);
}
}
#endregion
}
}
通用实体项目
此项目具有用于创建事件集合的通用事件(日历)。

如果需要,已实现 IEquatable
接口用于事件数据的比较。
namespace GenericEntities
{
public class GenericEvent : IEquatable<GenericEvent>
{
public string Title { get; set; }
public string Contents { get; set; }
public string Location { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
#region IEquatable<GenericEvent> Members
public bool Equals(GenericEvent other)
{
//Compare all fields to check equality
if (this.Title == other.Title &&
this.Contents == other.Contents &&
this.Location == other.Location &&
this.StartTime == other.StartTime &&
this.EndTime == other.EndTime)
{
return true;
}
else
{
return false;
}
}
#endregion
}
}
DataSynchronizer 项目
SyncManager.cs 将从 Google 返回日历列表。
namespace DataSynchronizer
{
public class SyncManager<T> where T:IEquatable<T>
{
public string Name { get; set; }
public ISyncDataSource<T> Source1 { get; set; }
public IEnumerable<T> Synchronize(DateTime? lastSyncTime)
{
try
{
IEnumerable<T> list = Source1.GetItemHeaders(lastSyncTime).ToList();
return list;
}
catch (Exception ex)
{
throw ex;
}
}
}
}
ISyncDataSource.cs 接口
namespace DataSynchronizer
{
public interface ISyncDataSource<T> where T : IEquatable<T>
{
string Id { get; }
IEnumerable<T> GetItemHeaders(DateTime? lastSyncTime);
void LoadItemContents(IEnumerable<T> items);
void WriteItems(IEnumerable<T> items);
}
}
DataSynchronizationService 项目
这是一个高级服务,将由您的应用程序调用。这里 eventManager
是 GenericEvent
的通用类型。您可以通过创建帮助程序和通用类型来添加其他 Google 服务。
namespace DataSynchronizer
{
public class SyncService
{
SyncManager<GenericEvent> eventManager = new SyncManager<GenericEvent>();
public string LastUpdateDate;
public SyncService()
{
//Initialize Event Manager
eventManager.Name = "..Event Synchronizer";
eventManager.Source1 = new GoogleEventsSyncDataSource();
}
public IList SynchronizeEvents()
{
IList list = eventManager.Synchronize(DateTime.Now).ToList();
return list;
}
}
}
如何测试此应用程序:TestApplication 项目
服务实例是 DataSynchronizationService
下 SyncService
的一个类型
namespace TestApplication
{
public partial class Form1 : Form
{
SyncService service = new SyncService();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
IList list = service.SynchronizeEvents();
dataGridView1.DataSource = list;
}
}
}