イベントの公開 - Google スプレッドシート、カレンダー、ベースの組み合わせ

Google Data APIs チーム、Ryan Boyd
2007 年 6 月
  1. はじめに
  2. 設計と実装
  3. イベント パブリッシャーの取得とデプロイ
  4. アプリケーションを実行する
  5. 次のステップと改善の可能性
  6. 付録

はじめに

会議、イベント、カンファレンスに関する多くの情報を Google スプレッドシートで管理し、その情報を簡単に共有して検索したいと思ったことはありませんか?Google では、デベロッパー イベント カレンダーでまさにそれを実現しています。カレンダーにフィードされるデータは、会社全体のさまざまな Google 社員から提供されます。その多くは、データが保存されている Google スプレッドシートへの編集アクセス権を持っています。スプレッドシートには、未確認のイベントと広く知られているエンゲージメントが混在しています。提案が提出される前や、スポンサー候補の調査が行われる前であっても、イベント候補が入力されることもあります。「編集者」は、イベントの公開と、公開されたイベントのスプレッドシートの列への記録を行います。

これらのイベントを Google カレンダーで直接管理しないのはなぜですか?カレンダーはイベントの開催日時と場所を特定するのに適していますが、スピーカー リストや提出期限などの構造化された情報を大量に管理する場合は、スプレッドシートの方が適しています。

イベントを含む Google スプレッドシートのスクリーン キャプチャ
イベントのリストを含むソース Google スプレッドシート

同僚の Google 社員から、スプレッドシートでイベントの管理を継続しつつ、外部の公開カレンダーへの公開を手動で行うプロセスを削除することを提案されました。また、Mashup Camp でデモを行うために、複数の Google Data API(略称「GData」)に基づく興味深いプロジェクトも必要でした。こうして、Event Publisher が誕生しました。

Event Publisher は、スプレッドシートでイベントのリストを管理し、カレンダーと Google Base の両方に公開する、迅速に開発されたコンセプト実証アプリケーションです。Google カレンダーでは、予定を共有して、他のユーザーが自分のカレンダー ビューに簡単に予定を追加できるようにすることができます。カレンダーにはイベントを検索する機能がありますが、Google Base はイベントを公開するもう 1 つの場を提供し、検索しやすい方法で構造化データを保存するのに優れています。

スプレッドシート、カレンダー、Base には、読み取り/書き込みオペレーションを完全にサポートする API が用意されています。さらに、これらの各サービスは、Google Data API プロトコルを使用してデータへのアクセスを公開しています。

設計と実装

このプロジェクトの設計フェーズは非常にシンプルでした。スプレッドシートのデータをカレンダーに公開するウェブ アプリケーションを作成したいと考えていました。長期的な目標は、デベロッパー イベント カレンダーで使用できるアプリケーションを構築することでしたが、短期的な目標は、Mashup Camp でデモできる機能するマッシュアップの概念実証を作成することでした。これらの目標を念頭に置いて、GData Java クライアント ライブラリを選択しました。これは、より成熟したクライアント ライブラリの 1 つであり、Java ウェブアプリの作成に慣れているためです。提供されているクライアント ライブラリのいずれかを使用することで、生の GData プロトコルや XML データモデルを気にすることなく、イベントの公開に必要な比較的シンプルなアプリケーション ロジックの実装に集中できました。

Java クライアント ライブラリをダウンロードし、イベント パブリッシャーのクラスモデルの設計を開始しました。ウェブ アプリケーションに届くすべてのリクエストのコントローラとして機能する EventPublisherServlet という名前のサーブレットを作成しました。また、Calendar、Base、Spreadsheets とのやり取りのビジネス ロジックを処理する EventPublisher というクラスも作成しました。最後に、イベントデータを保存するための Bean クラスを作成しました。アプリケーションのユーザー インターフェースは、少数の JSP を使用して開発されました。

複数の GData サービスを使用するメリットは、インターフェース全体で一貫性があることと、多くのクライアント ライブラリに、お気に入りの Google サービス用のサービス固有のヘルパークラスが含まれていることです。クライアント ライブラリには、使用していた 3 つのサービスに対して同じ Service、Entry、Feed クラスがあったため、スプレッドシートからイベントを取得して Base とカレンダーに公開するのに、非常に類似したコードを使用できました。これにより、3 つの異なる API を使用する場合に比べて、開発時間を大幅に短縮できました。EventPublisher の publishEventToCalendar() メソッドと publishEventToBase() メソッドを調べて、さまざまなメソッド間の類似性を確認することをおすすめします。

イベント パブリッシャーの取得とデプロイ

Event Publisher アプリケーションは、Google Data Java クライアント ライブラリのダウンロードの一部として配布されます。Java クライアント ライブラリをダウンロードしたら、java/mashups/eventpub ディレクトリを確認します。例の各ファイルの意味について詳しくは、付録のプロジェクト構造のセクションをご覧ください。

このアプリケーションには、イベント パブリッシャーをビルドする前にダウンロードする必要がある依存ライブラリが多数あります。適切なビルド オプションとランタイム オプションを構成したら(README.TXT ファイルを参照)、Ant を使用して Java クラスをコンパイルし、WAR ファイルを生成できます。この WAR ファイルは、このアプリケーションのテストで使用した Tomcat 5.5 など、お好みのサーブレット エンジンにデプロイできます。デフォルトの構成で実行されている Tomcat では、生成された deploy/EventPublisher.war ファイルを webapps ディレクトリにコピーするだけで済みます。自動的にデプロイされ、http://hostname:8080/EventPublisher からアクセスできるようになります。

アプリケーションの実行 - プロセス

AuthSub 認証プロセスのスクリーンショット
AuthSub を使用して Google スプレッドシート アカウントに認証します。
  • アプリケーションを実行しているホストの /EventPublisher にアクセスすると、アプリケーションが読み込まれます。この例では、http://localhost:8080/EventPublisher でアプリケーションを実行しています。
  • Google スプレッドシートの認証
    • ユーザーが、静的関数 AuthSubUtil.getRequestUrl() によって生成された「認証」リンクをクリックします。
    • ユーザーは Google アカウント サービスにリダイレクトされ、Google にログインしていない場合は認証情報の入力を求められます。
    • ユーザーは、スプレッドシートのデータにアクセスする権限をイベント パブリッシャーに付与します。
    • ユーザーは、URL に 1 回限りの AuthSub トークンが含まれた状態で、イベント パブリッシャーにリダイレクトされます。イベント パブリッシャーは、AuthSubSessionToken サービスを使用して、1 回限りのトークンを AuthSub セッション トークンと交換します。
    • コード: EventPublisherServlet.processAcceptAuthSubToken() を参照してください
    • ドキュメント: AuthSub ドキュメントをご覧ください。
  • スプレッドシート/ワークシートを選択
    • ユーザーは、イベント パブリッシャーによって、承認済みユーザーがアクセスできるスプレッドシートのリストにリダイレクトされます。
    • イベントデータの取得元となるスプレッドシートを選択すると、選択したスプレッドシート内の適切なワークシートを選択するよう求めるメッセージが表示されます。
    • コード: EventPublisher.getSsList()EventPublisher.getWsList() を参照してください。
  • マッピング フィールドのスクリーン キャプチャ マッピング フィールドのスクリーン キャプチャ
    必要なデータをスプレッドシートの列にマッピングし、公開するイベントをプレビューします。
  • 列ヘッダーを取得してマッピングする
    • 次に、アプリケーションはスプレッドシート セル フィードを使用して、スプレッドシートからデータの最初の行を取得します。この最初の行は列ヘッダーを表します。必要なデータがユーザーに一覧表示され、そのデータに最も適した列見出しを選択するよう求められます。右のスクリーンショットでは、必要な各データタイプの横に選択ボックスがあり、対応する列ヘッダーを選択できます。このマッピングは、サーブレット コンテナのセッション処理メカニズムを使用して、ユーザーのセッションに保存されます。
    • コード: EventPublisherServlet.processListEvents() を参照してください
  • エントリを取得して Beans に保存する
    • 列がマッピングされると、イベント パブリッシャーは、ワークシートの各行のエントリを 1 つ含むスプレッドシート リスト フィードを取得します。各行は 1 つのイベントを表し、行のデータは Event Bean のインスタンスに設定されます。Bean のコレクションはセッションに保存され、outputEventList.jsp ページを使用して画面にも出力され、確認できます。
  • カレンダーまたはベースにエントリを公開する
    • ユーザーは適切な公開先(カレンダー、ベース、または両方)を選択し、[公開] ボタンをクリックします。イベントは、ユーザーのセッションに保存されている Event オブジェクトのコレクションから、EventPublisherpublishEventsToBase() メソッドと publishEventsToCalendar メソッドを使用して、適切なサービスにプッシュされます。これらのメソッドは、サービス(CalendarEventEntryGoogleBaseEntry)に適したタイプのエントリ オブジェクトを作成します。これらのエントリは、サービス クラス CalendarServiceGoogleBaseService によって実行される HTTP POST を介して投稿されます。
    • イベントが公開されると、各ターゲット サービスから返された編集 URL が EventPublisher.updateSsEventEditUrl() メソッドを使用して Google スプレッドシートに保存されます。今後の公開プロセスの繰り返しでは、スプレッドシート内の各サービスに対応する編集 URL を含むイベントが作成されるのではなく、編集されます。これにより、イベントデータの重複を防ぐことができます。

次のステップと改善案

この記事で前述したように、このアプリケーションは現在プロトタイプのみです。本番環境に対応したコードではありません。イベント パブリッシャーをリリース可能な状態にするには、エラー処理を含める必要があります。現在、エラーは stderr にのみ送信されます。代わりに、取得、公開、その他のアクション中に発生したエラーは、ユーザーのブラウザに表示する必要があります。

また、Google Base では、データセットの完全性を維持するため、一定期間更新されないアイテムは期限切れになります。イベントがすでに Google Base に追加されている場合、イベント パブリッシャーは Google スプレッドシートに保存されている編集 URL を使用してイベントの更新を試みます。Base のイベント アイテムの有効期限が切れている場合、編集 URL は無効になり、公開時に 404 エラーが返されます。回避策としては、404 レスポンスを受け取ったときにイベントの挿入を試みます。

イベント パブリッシャー アプリに追加できるもう 1 つの機能は、日付だけでなくイベントの正確な時刻を保存して公開する機能です。Google Base ではイベントに時間を関連付ける必要があるため、各イベントの時間を保存することで、Base エントリのイベントに任意の時間が関連付けられるのを防ぐことができます。カレンダーでは、適切なタイミングで予定を表示することもできます。

また、列のマッピングなど、特定のスプレッドシートの構成を保存するための永続的なデータ ストレージ メカニズムが必要になる場合もあります。これは、別の Google スプレッドシート、データベース、ローカル ディスク ストレージの形式で保存できます。

この記事が、Google Data API を活用した新しいアプリケーションのアイデアを思いつくきっかけになれば幸いです。このアプリケーションのソースを確認したり、ニーズに合わせて構築して変更したりする場合は、Google Data APIs Java クライアント ライブラリmashups/eventpub ディレクトリにあります。また、この記事に関するフィードバックは、Google Data APIs デベロッパー フォーラムでお待ちしております。特定のサービスに関する質問は、サービス固有のディスカッション グループに投稿してください。

付録

参考情報