Google スプレッドシートのデータを PHP で統合する: 第 1 回

PHP を使用して Google スプレッドシートのデータ・フィードを処理し、Web アプリケーションに統合する

Google スプレッドシートは、よく知られているクラウド・ベースのスプレッドシート・アプリケーションです。Web アプリケーション開発者は、Google Spreadsheets Data API を使用してオンライン・スプレッドシートにアクセスし、データを検索できるようになっています。この記事では Google Spreadsheets Data API を取り上げ、この API を PHP アプリケーションのコンテキストで使用する例として、スプレッドシートに含まれるさまざまな要素を検索し、取得する方法を説明します。

2010年 12月 14日 ― 「はじめに」および「まとめ」のセクションに第 2 回へのリンクを記載した囲み記事を追加しました。また、「参考文献」セクションに第 2 回の記事の項目を追加しました。

はじめに

よく使われる頭文字語

  • API: Application Program Interface
  • HTML: HyperText Markup Language
  • HTTP: HyperText Transfer Protocol
  • URL: Uniform Resource Locator
  • XML: Extensible Markup Language

多くの人々と同様、私もスプレッドシートをよく使用しています。口座の収支を合わせたり、毎月の予算を組んだり、プロジェクトのスケジュールを見積もって管理したりするには、スプレッドシートが重宝します。けれども 1 年ほど前に、私はデスクトップ・アプリケーションのスプレッドシートから Google スプレッドシートに乗り換えました。Google スプレッドシートはクラウド・ベースのサービスで、私が普段使用しているスプレッドシートの機能をすべてサポートしています。Google スプレッドシートを使うようになって、非常に便利になった点には次の 2 つがあります。

  • 移動中にでもスプレッドシートのデータにアクセスできること。
  • デスクトップ・アプリケーションを使用していたときよりも、スプレッドシートの共有や共同編集が遥かに容易になったこと。

開発者の視点から見て、Google スプレッドシートを特に興味深いものにしているのは、ユーザーが所有しているスプレッドシート・データを使って、開発者が新しいアプリケーションを簡単に構築できるように、Data API が提供されていることです。この Data API には、XML に対応した任意の開発ツールキットを介してアクセスすることができます。また、Google では PHP と Java™ 両方の技術に対応したクライアント・ライブラリーも提供しています。

この 2 回の連載では、Google Spreadsheets Data API を取り上げ、クラウドのスプレッドシート・データを PHP アプリケーションに取り込んで使用する方法を説明します。連載第 1 回となる今回の記事では、この Data API でサポートされる各種のフィードを紹介し、これらのフィードから PHP クライアント・ライブラリーを使用してデータを読み込む方法を説明します。


Google スプレッドシートのフィードについて

PHP コードの詳細を探る前に、Google Spreadsheets Data API がどのように機能するのかを理解しておく必要があります。この API は 1 つ以上の入力引数が含まれる HTTP リクエストを受け入れ、要求された情報が含まれた Atom フィードを返します。

Google Spreadsheets Data API で使用できるフィードには、以下の種類があります。これらのフィードのうちの一部は、スプレッドシート ID (ssid) またはワークシート ID (wsid) のいずれかがないとフィード URL を構成できないことに注意してください。

  • スプレッドシート・フィード: ユーザーが使用できるスプレッドシートの一覧が含まれます。このフィードにアクセスするための URL は、https://spreadsheets.google.com/feeds/spreadsheets/private/full です。
  • ワークシート・フィード: 特定のスプレッドシートに関連付けられたフィードで、そのスプレッドシートを構成するワークシートの一覧が含まれます。このフィードにアクセスするための URL は、例えば https://spreadsheets.google.com/feeds/worksheets/<ssid>/private/full のようになります。
  • リスト・フィードおよびセル・フィード。いずれも特定のワークシートに関連付けられていて、それぞれそのワークシートを構成する行、セルが含まれます。これらのフィードにアクセスするための URL は、例えば https://spreadsheets.google.com/feeds/list/<ssid>/<wsid>/private/full のようになります。

スプレッドシート・フィードを使用できるのは、認証されたユーザーのみです。ワークシート・フィード、リスト・フィード、およびセル・フィードについては、対応するスプレッドシートのセキュリティー設定によっては認証なしでアクセスすることができます。例えば、一般公開されているスプレッドシートであれば、そのリスト・フィードまたはセル・フィードを取得するのに認証は必要ありません。

リスト 1 に一例として、典型的なスプレッドシート・フィードを記載します。

リスト 1. スプレッドシート・フィードの例
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' 
  xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'>
  <id>https://spreadsheets.google.com/feeds/spreadsheets/private/full</id>
  <updated>2010-11-05T17:11:33.703Z</updated>
  <category scheme='http://schemas.google.com/spreadsheets/2006'
    term='http://schemas.google.com/spreadsheets/2006#spreadsheet'/>
  <title type='text'>Available Spreadsheets - someuser@gmail.com
  </title>
  <link rel='alternate' type='text/html' href='http://docs.google.com'/>
  <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/spreadsheets/private/full'/>
  <link rel='self' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/spreadsheets/private/full'/>
  <openSearch:totalResults>3</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <entry>
    <id>https://spreadsheets.google.com/feeds/spreadsheets/private/full/ssid</id>
    <updated>2010-11-04T07:24:42.388Z</updated>
    <category scheme='http://schemas.google.com/spreadsheets/2006'
      term='http://schemas.google.com/spreadsheets/2006#spreadsheet'/>
    <title type='text'>Overtime Hours</title>
    <content type='text'>Overtime Hours</content>
    <link rel='http://schemas.google.com/spreadsheets/2006#worksheetsfeed' 
      type='application/atom+xml' 
      href='https://spreadsheets.google.com/feeds/worksheets/ssid/private/full'/>
    <link rel='alternate' type='text/html' 
      href='https://spreadsheets.google.com/ccc?key'/>
    <link rel='self' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/spreadsheets/private/full/ssid'/>
    <author>
      <name>someuser</name>
      <email>someuser@gmail.com</email>
    </author>
  </entry>
  <entry>
  ...
  </entry>
</feed>

スプレッドシート・フィードはすべて、ルート要素である <feed> 要素から始まります。<feed> 要素のなかには、個別のスプレッドシートを表す <entry> 要素が 1 つ以上あります。各 <entry> にはスプレッドシートの詳細として、タイトル、最終更新日、作成者などの情報が含まれます。

それぞれの <entry> に、<link rel='http://schemas.google.com/spreadsheets/2006#worksheetsfeed' ...> 要素が含まれていることに注目してください。この要素では、そのスプレッドシートに関連するワークシート・フィードへの URL を指定し、次のレベルの詳細までドリルダウンする手段を提供します。指定された URL を要求すると、選択したスプレッドシート内のワークシートに関する情報が含まれるワークシート・フィードが生成されます。リスト 2 に、ワークシート・フィードの一例を記載します。

リスト 2. ワークシート・フィードの例
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' 
  xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' 
  xmlns:gs='http://schemas.google.com/spreadsheets/2006'>
  <id>https://spreadsheets.google.com/feeds/worksheets/ssid/private/full</id>
  <updated>2010-11-04T07:23:37.513Z</updated>
  <category scheme='http://schemas.google.com/spreadsheets/2006'
    term='http://schemas.google.com/spreadsheets/2006#worksheet'/>
  <title type='text'>Estimate: Home Renovation</title>
  <link rel='alternate' type='text/html' href='https://spreadsheets.google.com/ccc
    ?key=ssid'/>
  <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/worksheets/ssid/private/full'/>
  <link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/worksheets/ssid/private/full'/>
  <link rel='self' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/worksheets/ssid/private/full'/>
  <author>
    <name>vikram.melonfire</name>
    <email>someuser@gmail.com</email>
  </author>
  <openSearch:totalResults>7</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <entry>
    <id>https://spreadsheets.google.com/feeds/worksheets/ssid/private/full/wsid
    </id>
    <updated>2010-11-04T07:22:22.440Z</updated>
    <category scheme='http://schemas.google.com/spreadsheets/2006'
      term='http://schemas.google.com/spreadsheets/2006#worksheet'/>
    <title type='text'>Living Room</title>
    <content type='text'>Living Room</content>
    <link rel='http://schemas.google.com/spreadsheets/2006#listfeed' 
      type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/ssid/
      wsid/private/full'/>
    <link rel='http://schemas.google.com/spreadsheets/2006#cellsfeed' 
      type='application/atom+xml' href='https://spreadsheets.google.com/feeds/cells/ssid/
      wsid/private/full'/>
    <link rel='http://schemas.google.com/visualization/2008#visualizationApi' 
      type='application/atom+xml' href='https://spreadsheets.google.com/tq?
      key=ssid&sheet=wsid'/>
    <link rel='self' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/worksheets/ssid/private/full/wsid'/>
    <link rel='edit' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/worksheets/ssid/private/full/wsid/key'
    />
    <gs:rowCount>100</gs:rowCount>
    <gs:colCount>20</gs:colCount>
  </entry>
  <entry>
  </entry>
</feed>

ワークシート・フィードに含まれる各 <entry> には、一連の <link> 要素が含まれます。これらの要素が指定するのは、ワークシートのリスト・フィード、セル・フィード、視覚化エンドポイント、および編集エンドポイントへの各 URL です。ワークシート内の情報を表示または編集する場合には、これらの URL が役立ちます。リスト・フィードとセル・フィードの例は、後で記載します。


スプレッドシートを取得する

Google スプレッドシートのフィードは XML にエンコードされるので、難なく PHP Web アプリケーションに取り込めます。その方法としては、API から返された Atom フィードを PHP の SimpleXML 拡張機能を使用して構文解析し、そこから必要な情報を抽出するのも 1 つですが、Zend Framework には Zend_Gdata が組み込まれているので、これを使わない手はありません。Zend_Gdata は、PHP アプリケーションを Google Data API を使って統合しようとする開発者のために、専用に設計された PHP クライアント・ライブラリーです。別途ダウンロードできるこのライブラリー (「参考文献」にダウンロード・リンクを記載) は、認証をはじめとする最も一般的なタスクの数々をカプセル化した、Google Data API への便利なオブジェクト指向インターフェースとなります。この Zend_Gdata ライブラリーを使用すれば、開発者はアプリケーションのコアの機能に専念することができます。

Zend の GData ライブラリーをインストールしたら、PHP を使って Google Spreadsheets Data API フィードを処理する例に取り掛かる準備は万端です。リスト 3 では、リスト 1 のフィードを取得し、Zend_Gdata を使ってフィードから関連するデータ・フラグメントを抽出し、Web ページ用にフォーマット設定を行っています。注意する点として、このスクリプトを実行する前に、スクリプト内のユーザー・クレデンシャルを有効な値に変更してください。

リスト 3. スプレッドシートのリスト
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing spreadsheets</title>
    <style>
    body {
      font-family: Verdana;      
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {  
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // get list of available spreadsheets
      $feed = $service->getSpreadsheetFeed();
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>
  
    <h2><?php echo $feed->title; ?></h2>
    <div>
    <?php echo $feed->totalResults; ?> spreadsheet(s) found.
    </div>  

    <ul>
    <?php foreach($feed as $entry): ?>
      <li class="name"><?php echo $entry->getTitle(); ?></li>
    <?php endforeach; ?>
    </ul>

  </body>
<html>

リスト 3 は、最初に Zend のクラス・ライブラリーをロードし、次に Zend_Gdata サービス・クラスのインスタンスを初期化します。このクラスが利用するのは、Zend_Http_Client オブジェクトです。必要なユーザー認証情報が提供されているこのオブジェクトを使用して、Google スプレッドシートのサービスとの認証済み接続をオープンするというわけです。そして認証済み接続がオープンされた後、getSpreadsheetFeed() メソッドがスプレッドシート・フィードを取得します。

getSpreadsheetFeed() API 呼び出しへのレスポンスは、リスト 1 に記載されているような Atom フィードです。このフィードが構文解析されて、Zend_Gdata_Spreadsheets_SpreadsheetEntry オブジェクトの配列に変換されます。この配列の各要素はフィード内の 1 つの <entry> を表しています。これで、配列を繰り返し処理して各エントリー・オブジェクトの getTitle() メソッドを呼び出せば、対応するスプレッドシートのタイトルを出力することができます。

図 1 は、上記のコードによる出力の一例です。ここには 3 つの使用可能なスプレッドシート (Overtime Hours、Estimate: Home Renovation、Sales by Region) が記載されています。

図 1. ユーザー・スプレッドシートの一覧
ユーザー・スプレッドシート (Overtime Hours、Estimate: Home Renovation、Sales by Region) が記載された画面のスクリーン・キャプチャー

ワークシートを取得する

各 Zend_Gdata_Spreadsheets_SpreadsheetEntry オブジェクトは、getWorksheets() メソッドも公開しています。このメソッドは、スプレッドシートのワークシート・フィードにアクセスし、Zend_Gdata_Spreadsheets_WorksheetEntry オブジェクトによって表されたワークシートのリストを返します。リスト 4 は、リスト 3 を更新して、スプレッドシート内のワークシートも記載するようにしています。

リスト 4. スプレッドシートおよびワークシートのリスト
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing spreadsheets and worksheets</title>
    <style>
    body {
      font-family: Verdana;      
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {  
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // get list of available spreadsheets
      $feed = $service->getSpreadsheetFeed();
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>

    <h2><?php echo $feed->title; ?></h2>
    <div>
    <?php echo $feed->totalResults; ?> spreadsheet(s) found.
    </div>  

    <ul>
    <?php foreach($feed as $entry): ?>
      <li class="name"><?php echo $entry->getTitle();  ?></li>
      <ul>
      <?php foreach($entry->getWorksheets() as $ws): ?>
        <li class="name"><?php echo $ws->getTitle(); ?></li>      
      <?php endforeach; ?>
      </ul>
    <?php endforeach; ?>
    </ul>

  </body>
<html>

各エントリー・オブジェクトの getWorksheets() メソッドを呼び出しているところに注目してください。このメソッドはスプレッドシートごとのワークシート・フィードを要求し、その結果を Zend_Gdata_Spreadsheets_WorksheetEntry オブジェクトのコレクションに変換します。前と同じく、このコレクションを繰り返し処理し、各オブジェクトの getTitle() メソッドを使用すれば、対応するワークシート・エントリーのタイトルを簡単に表示することができます。

図 2 に更新後のコードによる出力を示します。

図 2. ユーザー・スプレッドシートおよびワークシートの一覧
ユーザー・スプレッドシートおよびワークシートの一覧を示す画面のスクリーン・キャプチャー
ユーザー・スプレッドシートおよびワークシートの一覧のテキストのみを表示したもの (図 2)
Available Spreadsheets

3 spreadsheet(s) found.

  * Overtime Hours
      * Oct 2010
      * Nov 2010
      * Dec 2010
  * Estimate: Home Renovation
      * Living Room
      * Dining Room
      * Bedroom 1
      * Bedroom 2
      * Kitchen
      * Patio
      * Other
  * Sales by Region
      * North
      * South
      * East
      * West

ワークシートの行を取得する

スプレッドシートとワークシートを取得する方法がわかったところで、次はワークシートに含まれる実際のデータを取得する方法を検討します。Google Spreadsheets Data API では、次の 2 つの方法でデータを取得することができます。

  • リスト・フィード: ワークシートの行が含まれるフィードを返します。
  • セル・フィード: ワークシートの個々のセルが含まれるフィードを返します。

図 3 に、上記の方法を説明するために使用する、Sales by Region スプレッドシートのサンプル・ワークシートを示します (このスプレッドシートには、セクターごとの売上個数と売上高 (ドル) が含まれています)。

図 3. この記事で使用するサンプル・ワークシート
この記事で使用するサンプル・ワークシートを示す画面のスクリーン・キャプチャー

リスト 5 に、このワークシートのリスト・フィードを記載します。

リスト 5. リスト・フィードの例
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' 
  xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'
  xmlns:gsx='http://schemas.google.com/spreadsheets/2006/extended'>
  <id>https://spreadsheets.google.com/feeds/list/ssid/wsid/private/full</id>
  <updated>2010-11-04T07:21:19.158Z</updated>
  <category scheme='http://schemas.google.com/spreadsheets/2006'
    term='http://schemas.google.com/spreadsheets/2006#list'/>
  <title type='text'>North</title>
  <link rel='alternate' type='text/html' 
    href='https://spreadsheets.google.com/ccc?key=ssid'/>
  <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/list/ssid/wsid/private/full'/>
  <link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/list/ssid/wsid/private/full'/>
  <link rel='self' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/list/ssid/wsid/private/full'/>
  <author>
    <name>someuser</name>
    <email>someuser@gmail.com</email>
  </author>
  <openSearch:totalResults>3</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <entry>
    <id>https://spreadsheets.google.com/feeds/list/ssid/wsid/private/full/cokwr
    </id>
    <updated>2010-11-04T07:21:19.158Z</updated>
    <category scheme='http://schemas.google.com/spreadsheets/2006'
      term='http://schemas.google.com/spreadsheets/2006#list'/>
    <title type='text'>Sector 1</title>
    <content type='text'>salesunits: 63274, sales: 2214590</content>
    <link rel='self' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/list/ssid/wsid/private/full/cokwr'/>
    <link rel='edit' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/list/ssid/wsid/private/full/cokwr/
      2ed6e01i15gc7'/>
    <gsx:name>Sector 1</gsx:name>
    <gsx:salesunits>63274</gsx:salesunits>
    <gsx:sales>2214590</gsx:sales>
  </entry>
  <entry>
    <id>https://spreadsheets.google.com/feeds/list/ssid/wsid/private/full/cpzh4
    </id>
    <updated>2010-11-04T07:21:19.158Z</updated>
    <category scheme='http://schemas.google.com/spreadsheets/2006'
      term='http://schemas.google.com/spreadsheets/2006#list'/>
    <title type='text'>Sector 2</title>
    <content type='text'>salesunits: 7263, sales: 254205</content>
    <link rel='self' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/list/ssid/wsid/private/full/cpzh4'/>
    <link rel='edit' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/list/ssid/wsid/private/full/
      cpzh4/2ed58j9il57e0'/>
    <gsx:name>Sector 2</gsx:name>
    <gsx:salesunits>7263</gsx:salesunits>
    <gsx:sales>254205</gsx:sales>
  </entry>
  <entry>
  ...
  </entry>
</feed>

リスト 6 には、このワークシートのセル・フィードを記載します。

リスト 6. セル・フィードの例
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' 
  xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' 
  xmlns:gs='http://schemas.google.com/spreadsheets/2006' 
  xmlns:batch='http://schemas.google.com/gdata/batch'>
  <id>https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full</id>
  <updated>2010-11-04T07:20:36.606Z</updated>
  <category scheme='http://schemas.google.com/spreadsheets/2006'
    term='http://schemas.google.com/spreadsheets/2006#cell'/>
  <title type='text'>North</title>
  <link rel='alternate' type='text/html' 
    href='https://spreadsheets.google.com/ccc?key=ssid'/>
  <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full'/>
  <link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full'/>
  <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full/batch'/>
  <link rel='self' type='application/atom+xml'
    href='https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full'/>
  <author>
    <name>vikram.melonfire</name>
    <email>someuser@gmail.com</email>
  </author>
  <openSearch:totalResults>12</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <gs:rowCount>100</gs:rowCount>
  <gs:colCount>20</gs:colCount>
  <entry>
    <id>https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full/R1C1
    </id>
    <updated>2010-11-04T07:20:36.606Z</updated>
    <category scheme='http://schemas.google.com/spreadsheets/2006'
      term='http://schemas.google.com/spreadsheets/2006#cell'/>
    <title type='text'>A1</title>
    <content type='text'>Name</content>
    <link rel='self' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full/R1C1'/>
    <link rel='edit' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full/R1C1/1fvl7'
    />
    <gs:cell row='1' col='1' inputValue='Name'>Name</gs:cell>
  </entry>
  <entry>
    <id>https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full/R1C2
    </id>
    <updated>2010-11-04T07:20:36.606Z</updated>
    <category scheme='http://schemas.google.com/spreadsheets/2006'
      term='http://schemas.google.com/spreadsheets/2006#cell'/>
    <title type='text'>B1</title>
    <content type='text'>Sales (Units)</content>
    <link rel='self' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full/R1C2'/>
    <link rel='edit' type='application/atom+xml'
      href='https://spreadsheets.google.com/feeds/cells/ssid/wsid/private/full/R1C2
      /rkxyni'/>
    <gs:cell row='1' col='2' inputValue='Sales (Units)'>Sales (Units)</gs:cell>
  </entry>
  <entry>
  ...
  </entry>
</feed>

リスト 5リスト 6 の違いは、極めて明白です。リスト 5 ではワークシートの各行がエントリーとして表されている一方、リスト 6 では、ワークシートの各セルがエントリーとして表されています。したがって、ワークシートのデータをどのように処理するかによって、その目的に合った適切なフィードを選択しなければなりません。

リスト 7 に、Zend_Gdata を使用してリスト・フィードを取得して処理する方法を説明します。このリストを含め、以降のリストでは、リスト・コード内の ssid 変数と wsid 変数を実際の値に置き換えることで、スクリプト内のスプレッドシート ID またはワークシート ID、あるいはその両方を適切な値に変更する必要があることに注意してください。

リスト 7. リスト・フィードの処理
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing worksheet contents</title>
    <style>
    body {
      font-family: Verdana;      
    }
    div.sheet {
      margin: 10px;
      padding: 10px;
      border: silver 2px dotted;
    }
    div.name {
      color: red; 
      text-decoration: none;
      font-weight: bolder;  
    }    
    table, td {
      border: 1px solid black;
      vertical-align: top;
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {  
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // get spreadsheet entry
      $ssEntry = $service->getSpreadsheetEntry(
        'https://spreadsheets.google.com/feeds/spreadsheets/ssid');
      
      // get worksheets in this spreadsheet
      $wsFeed = $ssEntry->getWorksheets();
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }    
    ?>

    <h2><?php echo $ssEntry->title; ?></h2>

    <?php foreach($wsFeed as $wsEntry): ?>
    <div class="sheet">
      <div class="name">Worksheet: 
        <?php echo $wsEntry->getTitle(); ?></div>
      <table>
      <?php 
      // get list feed for worksheet
      // get individual entries in list
      $listFeed = $service->getListFeed($wsEntry); 
      foreach ($listFeed as $listEntry) {
        echo '<tr>';
        $rowData = $listEntry->getCustom();
        foreach($rowData as $customEntry) {
          echo '<td>' .  $customEntry->getText() . '</td>';
        }
        echo '</tr>';
      }
      ?>
      </table>
    </div>
    <?php endforeach; ?>

  </body>
<html>

リスト 7 では、リスト 4 で説明した getWorksheets() メソッドを使用して、指定のスプレッドシートに含まれるすべてのワークシートを Zend_Gdata_Spreadsheets_WorksheetEntry オブジェクトのコレクションとして取得します。これらのエントリー・オブジェクトは、サービス・オブジェクトの getListFeed() メソッドに渡され、このメソッドによって、各ワークシートに対応するリスト・フィードが取得されます。

ワークシートの行は、Zend_Gdata_Spreadsheets_ListEntry オブジェクトとして表されます。これらのオブジェクトのそれぞれが公開する getCustom() メソッドは、各行の個々の要素 (セル) を配列として返します。この配列を取得した後は、配列を繰り返し処理するだけで至って簡単に、表内の各セルの内容を出力することができます。

図 4 に、セクターごとの売上個数と売上高を記載する個々のワークシート (North、South、East) の処理結果を示します。

図 4. リスト・フィードから取得したワークシートの内容
リスト・フィードから取得したワークシートの内容を示す画面のスクリーン・キャプチャー

ワークシートのセルを取得する

サービス・オブジェクトの getListFeed() メソッドを使用することでリスト・フィードを取得できるのと同様に、サービス・オブジェクトの getCellFeed() メソッドを使用すれば、セル・フィードを取得することもできます。リスト 8 にその方法を示します。

リスト 8. セル・フィードの処理
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing worksheet contents</title>
    <style>
    body {
      font-family: Verdana;      
    }
    div.sheet {
      margin: 10px;
      padding: 10px;
      border: silver 2px dotted;
    }
    div.name {
      color: red; 
      text-decoration: none;
      font-weight: bolder;  
    }    

    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {  
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // get spreadsheet entry
      $ssEntry = $service->getSpreadsheetEntry(
        'https://spreadsheets.google.com/feeds/spreadsheets/ssid');

      // get worksheets in this spreadsheet
      $wsFeed = $ssEntry->getWorksheets();
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }    
    ?>
  
    <h2><?php echo $ssEntry->title; ?></h2>

    <?php foreach($wsFeed as $wsEntry): ?>
    <div class="sheet">
      <div class="name">Worksheet: 
        <?php echo $wsEntry->getTitle(); ?></div>
      <table>
      <?php 
      // get cell feed for worksheet
      // display individual rows and columns from cell feed
      $cellFeed = $service->getCellFeed($wsEntry); 
      echo '<ul>';
      foreach ($cellFeed as $cellEntry) {
        $row = $cellEntry->getCell()->getRow();
        $column = $cellEntry->getCell()->getColumn();
        $value = $cellEntry->getCell()->getText();
        echo "<li>($row, $column) = $value</li>";
      }
      echo '</ul>';
      ?>
      </table>
    </div>
    <?php endforeach; ?>

  </body>
<html>

リスト 8 の操作対象はセル・フィードです。セルからデータを抽出するため、そのメソッドはリスト 7 とは少し異なります。リスト 8 では、ワークシートの個々のセルが Zend_Gdata_Spreadsheets_CellEntry オブジェクトとして表されていて、オブジェクトのそれぞれが getCell() メソッドを公開します。このメソッドが返すのは、Cell オブジェクトです。この Cell オブジェクトが、対応するセルの行番号、列番号、そして値のそれぞれを返すメソッドを公開します。これで、コレクションを繰り返し処理すれば、一覧に含まれる各セルの内容を至って簡単に出力できるというわけです。

図 5 に、このスクリプトの出力例を示します。

図 5. セル・フィードから取得したワークシートの内容
セル・フィードから取得したワークシートの内容を示す画面のスクリーン・キャプチャー

ワークシートのデータを配列として取得する

Zend_Gdata_Spreadsheets には、リスト・フィードとセル・フィードをさらに簡単に処理できるようにネイティブ PHP 配列に変換するショートカット・メソッドも用意されています。その一例は、ワークシートのリスト・フィードを取得し、ネストされた PHP 配列に変換する getContentsAsRows() メソッドです。リスト 9 に、その方法を説明します。

リスト 9. ワークシートの行からなる配列の処理
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing worksheet contents</title>
    <style>
    body {
      font-family: Verdana;      
    }
    div.sheet {
      margin: 10px;
      padding: 10px;
      border: silver 2px dotted;
    }
    div.name {
      color: red; 
      text-decoration: none;
      font-weight: bolder;  
    }    
    table, td {
      border: 1px solid black;
      vertical-align: top;
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {  
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // get spreadsheet entry
      $ssEntry = $service->getSpreadsheetEntry(
        'https://spreadsheets.google.com/feeds/spreadsheets/ssid');
      
      // get worksheets in this spreadsheet
      $wsFeed = $ssEntry->getWorksheets();
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>
  
    <h2><?php echo $ssEntry->title; ?></h2>

    <?php foreach($wsFeed as $wsEntry): ?>
    <div class="sheet">
      <div class="name">Worksheet: 
        <?php echo $wsEntry->getTitle(); ?></div>
      <?php $rows = $wsEntry->getContentsAsRows(); ?>
      <table>
      <?php foreach ($rows as $row): ?>
        <tr>
          <?php foreach($row as $key => $value): ?>
          <td><?php echo $value; ?></td>
          <?php endforeach; ?>
        </tr>
      <?php endforeach; ?>
      </table>
    </div>
    <?php endforeach; ?>

  </body>
<html>

リスト 9getWorksheets() メソッドから返された Zend_Gdata_Spreadsheets_WorksheetEntry オブジェクトのコレクションを繰り返し処理し、各エントリー・オブジェクトの getContentsAsRows() メソッドを呼び出して、各ワークシートの行の内容をネストされた配列として取得します。各行は、キーと値のペアからなる連想配列として表されます。

図 6 に、上記のコードによる出力を示します。

図 6. リスト・フィードの配列から取得したワークシートの内容
リスト・フィードの配列から取得したワークシートの内容を示す画面のスクリーン・キャプチャー

作業でセルのデータのほうがよく使われている場合には、リスト 10 のように、getContentsAsRows() の呼び出しを getContentsAsCells() の呼び出しに置き換えてください。このメソッドは、各セルに行と列の座標で索引を付け、セルのデータをネストした配列を返します。ネストされた配列には、各セルの数式と最終的な値も組み込まれます。

リスト 10. ワークシートのセルからなる配列の処理
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Listing spreadsheet contents</title>
    <style>
    body {
      font-family: Verdana;      
    }
    div.sheet {
      margin: 10px;
      padding: 10px;
      border: silver 2px dotted;
    }
    div.name {
      color: red; 
      text-decoration: none;
      font-weight: bolder;  
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {  
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // get spreadsheet entry
      $ssEntry = $service->getSpreadsheetEntry(
        'https://spreadsheets.google.com/feeds/spreadsheets/ssid');

      // get worksheets in this spreadsheet
      $wsFeed = $ssEntry->getWorksheets();
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>
  
    <h2><?php echo $ssEntry->title; ?></h2>

    <?php foreach($wsFeed as $wsEntry): ?>
    <div class="sheet">
      <div class="name">Worksheet: 
        <?php echo $wsEntry->getTitle(); ?></div>
      <?php $cells = $wsEntry->getContentsAsCells(); ?>
      <ul>
      <?php foreach ($cells as $location => $data): ?>
        <li>
          <?php echo $location; ?> = <?php echo $data['value']; ?>
          <?php echo ($data['formula'] != $data['value']) ? ' *' : ''; ?>
        </li>
      <?php endforeach; ?>
    </div>
    <?php endforeach; ?>

  </body>
<html>

図 7 では、リスト 10 によって返されたデータが表示されています。この画面では、数式によって生成されたセルの値がアスタリスクで強調表示されています。

図 7. セル・フィードの配列から取得したワークシートの内容
セル・フィードの配列から取得したワークシートの内容を示す画面のスクリーン・キャプチャー
セル・フィードの配列から取得したワークシートの内容のテキストのみを表示したもの (図 7)
Sales by Region

  Worksheet: North
      A1 = Name
      B1 = Sales (Units)
      C1 = Sales ($)
      A2 = Sector 1
      B2 = 63274
      C2 = 2214590 *
      A3 = Sector 2
      B3 = 7263
      C3 = 254205 *
      A4 = Sector 3
      B4 = 63427
      C4 = 2219945 *

  Worksheet: South

ワークシートのデータをフィルタリングする

リスト・フィードやセル・フィードの内容をフィルタリングして、特定の基準に一致する行またはセルだけがフィードから返されるようにすることもできます。この例を示すリスト 11 では、リスト・フィードをフィルタリングして、売上個数が 25,000 を超えるエントリーだけを返します。

リスト 11. ワークシートのリスト・フィードのフィルタリング
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Filtering worksheet contents</title>
    <style>
    body {
      font-family: Verdana;      
    }
    div.sheet {
      margin: 10px;
      padding: 10px;
      border: silver 2px dotted;
    }
    div.name {
      color: red; 
      text-decoration: none;
      font-weight: bolder;  
    }    
    table, td {
      border: 1px solid black;
      vertical-align: top;
    }
    </style>    
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {  
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // define worksheet query
      // get list feed for query
      $query = new Zend_Gdata_Spreadsheets_ListQuery();
      $query->setSpreadsheetKey('ssid');
      $query->setWorksheetId('wsid');
      $query->setSpreadsheetQuery('salesunits > 25000');
      $listFeed = $service->getListFeed($query);  
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    } 
    ?>
  
    <div class="sheet">
      <div class="name">Worksheet: 
        <?php echo $listFeed->getTitle(); ?></div>
      <table>
      <?php 
      foreach ($listFeed as $listEntry) {
        echo '<tr>';
        $rowData = $listEntry->getCustom();
        foreach($rowData as $customEntry) {
          echo '<td>' .  $customEntry->getText() . '</td>';
        }
        echo '</tr>';
      }
      ?>
      </table>
    </div>

  </body>
<html>

リスト 11 は、Zend_Gdata_Spreadsheets_ListQuery オブジェクトを初期化して、サービス・オブジェクトの getListFeed() メソッドに追加の引数として渡せるようにします。この引数により、リスト・フィードから返されるデータをフィルタリングします。このオブジェクトは、以下の 3 つの入力で初期化する必要があります。

  • スプレッドシート ID
  • ワークシート ID
  • フィルタリング基準

結果とした返されるリスト・フィードには、フィルタリング基準を満たすワークシートの行だけが含まれます。

フィルタリング基準は、列名の後に等号あるいは不等号、ブール演算子などが続き、その後にフィルタリング値が続く形で指定します。Zend_Gdata はクエリーを Data API サーバーに送信する際に、自動的にフィルタリング基準を URL エンコードします。

上記のリストによる結果は、図 8 のとおりです。

図 8. 売上個数でフィルタリングしたワークシートの内容
売上個数でフィルタリングしたワークシートの内容を示す画面のスクリーン・キャプチャー

同様に、セル・フィードに含めて返すデータを制限することもできます。それには Zend_Gdata_Spreadsheets_CellQuery オブジェクトを初期化して、getCellFeed() メソッドに渡します。リスト 12 は、指定したワークシートのヘッダー行だけを取得する例です。

リスト 12. ワークシートのセル・フィードのフィルタリング
<!DOCTYPE html 
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Filtering worksheet contents</title>
    <style>
    body {
      font-family: Verdana;
    }
    div.sheet {
      margin: 10px;
      padding: 10px;
      border: silver 2px dotted;
    }
    div.name {
      color: red; 
      text-decoration: none;
      font-weight: bolder;  
    }
    table, td {
      border: 1px solid black;
      vertical-align: top;
    }
    </style>
  </head>
  <body>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

    // set credentials for ClientLogin authentication
    $user = "someuser@gmail.com";
    $pass = "somepass";

    try {  
      // connect to API
      $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
      $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
      $service = new Zend_Gdata_Spreadsheets($client);

      // define worksheet query
      // get list feed for query
      $query = new Zend_Gdata_Spreadsheets_CellQuery();
      $query->setSpreadsheetKey('ssid');
      $query->setWorksheetId('wsid');
      $query->setMinRow(1);
      $query->setMaxRow(1);
      $cellFeed = $service->getCellFeed($query);
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }
    ?>

    <div class="sheet">
      <div class="name">Worksheet: <?php echo $cellFeed->getTitle(); ?>
      </div>
      <table>
      <?php 
      echo '<tr>';
      foreach ($cellFeed as $cellEntry) {
        echo '<td>' .  $cellEntry->getCell()->getText() . '</td>';
      }
      echo '</tr>';
      ?>
      </table>
    </div>

  </body>
<html>

リスト 12 は Zend_Gdata_Spreadsheets_CellQuery を初期化した後、クエリー・オブジェクトの setMinRow()setMaxRow()setMinColumn()、および setMaxColumn() メソッドを使用して、フィードに含めて返すセルの範囲を定義します。その結果、フィードには指定された範囲のセルだけが含まれることになります。図 9 にその結果を示します。

図 9. 行番号でフィルタリングしたワークシートの内容
行番号でフィルタリングしたワークシートの内容を示す画面のスクリーン・キャプチャー

サンプル・アプリケーション: ブラウザー・ベースのスプレッドシート・ビューアー

Google Spreadsheets Data API からデータを取得する基本的な方法を理解したところで、それらの方法を実際のコンテキストに適用した例を見てみましょう。次のアプリケーションでは、PHP と JavaScript を組み合わせて使用して、オンライン・ワークシートの内容を反映したデータ・グリッドを表示します。jQuery と jqGrid (ダウンロード・リンクについては「参考文献」を参照) を利用してデータ・グリッドを生成し、PHP を使って Google スプレッドシートに接続して、ワークシートの内容を取得した後、それを jqGrid で使用するのに適した XML 文書にフォーマット設定するという流れです。

リスト 13 に記載する PHP コードが、Google Spreadsheets Data API に接続し、クエリーを実行してワークシートのリスト・フィードを取得し、取得したデータを jqGrid の XML フォーマットに変換します。

リスト 13. ワークシートのリスト・フィードの取得および再フォーマット設定
<?php
// get page number from request
$page = $_GET['page']; 
if (empty($page)) {
  $page = 1;
}

// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

// set credentials for ClientLogin authentication
$user = "someuser@gmail.com";
$pass = "somepass";

// set records per page
$recordsPerPage = 5;
$startIndex = (($page-1) * $recordsPerPage)+1;

try {
  // connect to API
  $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
  $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
  $service = new Zend_Gdata_Spreadsheets($client);

  // get spreadsheet entry
  $query = new Zend_Gdata_Spreadsheets_ListQuery();
  $query->setSpreadsheetKey('ssid');
  $query->setWorksheetId('wsid');
  $query->setStartIndex($startIndex);
  $query->setMaxResults($recordsPerPage);
  $listFeed = $service->getListFeed($query); 
  $totalRecords = (string)$listFeed->getTotalResults()+0; // cast to integer

  // send XML headers
  header("Content-type: text/xml"); 
  echo "<?xml version='1.0'?" . ">\n";

  // send summary information
  echo '<rows>'; 
  echo '<page>' . $page . '</page>';
  echo '<total>' . ceil($totalRecords/$recordsPerPage) . '</total>';
  echo '<records>' . $totalRecords . '</records>';

  // send records
  foreach ($listFeed as $listEntry) {
    echo '<row>';
    $rowData = $listEntry->getCustom();
    foreach($rowData as $customEntry) {
      echo '<cell>' .  $customEntry->getText() . '</cell>';
    }
    echo '</row>';
  }
  echo '</rows>';
} catch (Exception $e) {
  die('ERROR: ' . $e->getMessage());
}    
?>

リスト 13 が実装する単純なページング・システムは、リクエスト URL にページ番号が含まれていることを想定しています。そして、このページ番号を使用して現在のページに返すレコードの断片が計算された後、setStartIndex() および setMaxResults() メソッドが計算結果に応じてリスト・フィードを構成します。

図 10 に、リスト 13 によって返された XML フォーマットのデータを示します。

図 10. リスト 13 による XML 出力
リスト 13 による XML 出力を示す画面のスクリーン・キャプチャー
リスト 13 による XML 出力のテキストのみを表示したもの (図 10)
This XML file does not appear to have any style information 
associated with it. The document tree is shown below.

- <rows>
  - <page>1</page>
  - <total>2</total>
  - <records>7</records>
  - <row>
        <cell>Sector 1</cell>
        <cell>6473</cell>
        <cell>226555</cell>
    </row>
  - <row>
        <cell>Sector 2</cell>
        <cell>16373</cell>
        <cell>573055</cell>
    </row>
  - <row>
        <cell>Sector 3</cell>
        <cell>43734</cell>
        <cell>1530690</cell>
    </row>
...

jqGrid はリスト 14 のコードを使用して、この XML フォーマットのデータを読み込み、データ・グリッドに変換します。

リスト 14. クライアント・サイドのデータ・グリッドとしてのスプレッドシートの表示
<html>
  <head>
    <link rel="stylesheet" type="text/css" media="screen"
      href="jquery-ui-1.8.6.custom.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="ui.jqgrid.css" />
    <script src="jquery-1.4.2.min.js" type="text/javascript"></script>
    <script src="jquery.jqGrid.min.js" type="text/javascript"></script>  
    <script src="grid.locale-en.js" type="text/javascript"></script>
  </head>
  <body>
    <table id="list1">
    </table> 
    <div id="pager1">
    </div> 
    <script type="text/javascript">
    // code based on XML example at: http://www.trirand.com/blog/jqgrid/jqgrid.html
    jQuery().ready(function (){
      jQuery("#list1").jqGrid({
        url:'generate.php',
        datatype: "xml",
        colNames:
          ['Sector','Sales (Units)', 'Sales ($)'],
        colModel:
          [
            {name:'sector'},
            {name:'salesunits'},
            {name:'sales'},
          ],
        pager: jQuery('#pager1'),
        rowNum:5,
        autowidth: true,
        viewrecords: true,
      }).navGrid('#pager1',{edit:false,add:false,del:false})
      });
    </script>
  </body>
</html>

図 11 に、最終的な出力を示します (スプレッドシートには、販売地区のセクターごとの売上個数と売上高が表示されています)。

図 11. Google スプレッドシートのフィードから生成されたクライアント・サイドのデータ・グリッド
Google スプレッドシートのフィードから生成されたクライアント・サイドのデータ・グリッドを示す画面のスクリーン・ショット

まとめ

以上の例からわかるように、Google Spreadsheets Data API では、Google スプレッドシートのデータを直接 PHP アプリケーションに取り込めるようにしています。この記事では Google Spreadsheets Data API で使用できる基本的なフィードの種類を紹介し、これらのフィードを Zend_Gdata で使用する方法を説明するために、Google スプレッドシートからデータを取得する方法に焦点を当てました。ユーザーのスプレッドシートを取得する方法、各スプレッドシートを調べて使用可能なワークシートの一覧を取得する方法、そしてリスト・フィードとセル・フィードを使ってスプレッドシートの実際の内容にアクセスする方法を説明しました。さらに、データ・フィルタリングの基本を紹介するために、特定の基準または範囲の制約に適合するスプレッドシートの行またはセルを表示する方法も説明しました。

しかし、Google Spreadsheets Data API で実行できることはこれだけではありません。PHP アプリケーションからスプレッドシートのデータを表示し、セル、行、ワークシートを追加、編集、そして削除することによってデータを変更することもできます。Google Spreadsheets Data API でこれらの操作を行う方法は、連載の第 2 回で詳しく説明します。次回の記事もお見逃しなく。

参考文献

学ぶために

製品や技術を入手するために

  • Zend Framework: Zend Framework をダウンロードして、よりセキュアで信頼性に優れ、幅広く利用可能な API を備えた最新の Web 2.0 アプリケーションおよび Web サービスを構築してください。
  • jQuery: 素早く簡潔な JavaScript ライブラリー、jQuery をダウンロードして、HTML 文書のトラバース、イベント処理、動画化、そして Ajax 対話を単純化してください。
  • jqGrid: Web 上で表形式のデータを表示して、操作できるこの Ajax 対応の JavaScript コントロールをダウンロードして試してみてください。
  • IBM 製品の評価版: DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を体験するには、評価版をダウンロードするか、IBM SOA Sandbox のオンライン試用版を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Open source
ArticleID=617691
ArticleTitle=Google スプレッドシートのデータを PHP で統合する: 第 1 回
publish-date=12142010