Kobarin's Development Blog

C#やASP.NETなどについての記録です。

ASP.NETで、Google Calendarの情報を表示

ASP.NET上でGoogle Calendarのデータを呼び出し、GridViewに表示するまでの処理を示します。

1.Google Data APIの.NET libraryをダウンロードしてインストール

以下サイトから最新の「Google_Data_API_Setup_xxx.msi」をダウンロードします(当方の時点では2.1.0でした)。
.NET library for the Google Data API

2.Visual StudioでWebサイトを開き「参照設定」の「.NET」タブ内より、以下コンポーネントを選択。
3.ASPXファイルを開き、GridViewを記述。

4.aspx.csファイルを開き、以下の記述をする。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using Google.GData.Calendar;
using Google.GData.Client;
using Google.GData.Extensions;
using Google.GData.AccessControl;

public partial class mypage : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    CalendarService cservice = new CalendarService("companyName-applicationName-1");

    //認証。xxxxxにはGmailアカウント、XXXXXXXXにはGmailパスワード
    cservice.setUserCredentials("xxxxx@gmail.com", "XXXXXXXX");

    //CalenderのソースURL。GoogleCalendarの設定内でURL取得可能。※1
    const string gcalUrlFormat = "https://www.google.com/calendar/feeds/{0}/public/full";
    const string guserMy = "xxxxx@gmail.com";
    string gcalUrl = String.Format(gcalUrlFormat, guserMy);

    // 取得条件設定(開始時間が2011年3月19日の予定を降順で取得)
    EventQuery query = new EventQuery();
    query.Uri = new Uri(gcalUrl);
    query.StartTime = new DateTime(2012, 10, 23); //抽出条件:開始日
    query.EndTime = new DateTime(2012, 10, 24);   //抽出条件:最終日
    query.SortOrder = CalendarSortOrder.descending;

    //データを取得
    EventFeed feeds = cservice.Query(query);
    //※2
    IEnumerable entries
     = feeds.Entries.Cast();

    //GridViewのデータソースとなるDataTableの定義。ここでは開始日・最終日・タイトル・場所のみ抽出。
    DataTable dt = new DataTable();
    dt.Columns.Add("StartTime", Type.GetType("System.DateTime"));
    dt.Columns.Add("EndTime", Type.GetType("System.DateTime"));
    dt.Columns.Add("Title", Type.GetType("System.String"));
    dt.Columns.Add("Location", Type.GetType("System.String"));
    foreach (Google.GData.Calendar.EventEntry entry in entries)
    {
      DateTime startTime = entry.Times[0].StartTime;
      DateTime endTime = entry.Times[0].EndTime;
      string title = entry.Title.Text;
      string location = entry.Locations[0].ValueString;
      dt.Rows.Add(startTime, endTime, title, location);
    }
    GridView1.DataSource = dt;
    GridVeiw1.DataBind();
  }

注釈
  • ※1 URLのメルアド部分を書き換えれば、他ユーザや他グループの公開カレンダーも参照できる。publicをprivateに変更すると非公開カレンダーも参照可能だが、当然自アカのカレンダー限定。末尾のfullをbasicにすると情報量が限定されるため速度改善につながるかも。ただし他カレンダーの場合日付を取得できなかった。
  • ※2 EventEntryはSystem.Web.UIとカブってしまうため、フル宣言しています(他に方法あるのかな?)