Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする(1)
この記事は賞味期限切れです。(更新から1年が経過しています)
以前より公開されたスプレッドシートの読み込みについて記事をしたためてまいりましたが、 拙作の Ghostsheet 等はスプレッドシートを公開しなければならない、書き込みが出来ないといった欠点がありました。 今回は、Google製のPHPクライアントを利用して認証し、読み書きの実験を行ってみました。
下準備
まず必要な物をまとめます。
- サービスアカウントの鍵ファイル
- 1のアカウントに編集権限を与えたスプレッドシート
- Google製のクライアント(PHP)
サービスアカウントの鍵ファイル
- Google Developper Console でプロジェクトを作成します。
- 「認証情報」→「認証情報の追加」から「サービスアカウント」を選択
- 鍵ファイルをJSON形式で取得します。
このファイルは認証情報が記載されている大変重要なファイルなので、 サーバー上に設置する際には公開される状態にしないように配慮しましょう。
新規スプレッドシートの作成
- Google Drive で新しいスプレッドシートを作成します。
- 前工程の鍵ファイル内の「client_email」のメールアドレスに「編集者」の権限を与えます
- アドレスバーからスプレッドシートのIDをコピーしておきます
google/apiclient のインストール
ここでは認証に google-api-php-client を使用します。
Google APIs Client Library for PHP
The Google API Client Library enables you to work with Google APIs such as Google+, Drive, or YouTube on your server.
Composer でインストールするか、直接ソースをダウンロードするかお好みでどうぞ。
Composer の場合
require "vendor/autoload.php";
直接ダウンロードして設置した場合
require "the/path/to/google-api-php-client/src/Google/autoload.php";
認証してアクセストークンを取得する
APIにリクエストを投げるにはアクセストークンが必要なので、 まずはこれを取得します。
// クライアントを新たに生成
$client = new Google_Client();
$client->setApplicationName("DemoApp");
// 証明書を生成して
$credentials = $client->loadServiceAccountJson("./keys.json", array(
Google_Service_Drive::DRIVE
));
// クライアントに読ませる
$client->setAssertionCredentials($credentials);
// アクセストークンをリフレッシュする
$client->getAuth()->refreshTokenWithAssertion();
// アクセストークンを取得
$accessTokenJson = $client->getAccessToken();
$accessToken = json_decode($accessTokenJson)->access_token;
本来ならばこのアクセストークンはセッションに保存して再利用するのですが、 ここでは例をシンプルにするためにそのくだりは省いています。
スプレッドシートファイルの情報を取得する
google/apiclientにスプレッドシートを色々触れるAPIが用意されていればよかったのですが、 ちょっと見当たらなかったので、Google_Http_Request と Google_IO_Curl を使って直接リクエストを飛ばします。
$sheet_id = "XXXxxxXX-XXXxxxxxXXXXXX";
$request = new Google_Http_Request(
"https://spreadsheets.google.com/feeds/worksheets/{$sheet_id}/private/full?alt=json",
"GET",
array("Authorization" => "Bearer {$accessToken}")
);
$curl = new Google_IO_Curl($client);
$res = $curl->executeRequest($request);
$data = json_decode($res[0]);
URLに alt=json パラメータを付加しておくことでJSONでレスポンスが返ってくるので、デコードしましょう。 (デフォルトではAtomなのですが、PHPでは少々扱いづらい為JSONにしています)
かなり多くの情報が格納されているので目が回りそうですが、 スプレッドシートAPIでは共通して、概ね必要な情報は “feed” オブジェクト内の “entry” の中に入っています。
"entry": [
{
"id": {...},
"category": {...},
"title": {...},
"content": {...},
"link": {...},
...
}
]
こんな感じの構造になっていて、 “entry” の中にはそのスプレッドシートに含まれるシートの数だけオブジェクトが連ねてあります。 ここで肝になるのは “link” の部分で、それぞれのシートを読み書きする際にリクエストを飛ばすエンドポイントURLが記されています。
"link": [
{
"rel": "http://schemas.google.com/spreadsheets/2006#listfeed",
"type": "application/atom+xml",
"href": "https://spreadsheets.google.com/feeds/list/XXXxxxXX-XXXxxxxxXXXXXX/od6/private/full"
},
{
"rel": "http://schemas.google.com/spreadsheets/2006#cellsfeed",
"type": "application/atom+xml",
"href": "https://spreadsheets.google.com/feeds/cells/XXXxxxXX-XXXxxxxxXXXXXX/od6/private/full"
},
...
]
読み書きに必要な “listfeed” と “cellsfeed” を変数等に格納しておきましょう。
続きは次回
今回はスプレッドシートの情報を取得する所までこぎつけました。 次回はいよいよ実際に読み書きの処理を行ってみます。
コメント