Google SpreadSheetsをGoogle APIs Client Library for PHP 1.1.6で叩くための準備

なんかユーザー管理しないといけないんだけど、バックエンド開発が本当にだるい。しかも管理するのは若干リテラシーが低いNOTエンジニア。うーん管理画面も作らないといけないのか、みたいな強いられた状況で、胃袋が大開放。

そこで、たかだかユーザー管理ごときでSQLなんてやめてしまえ。NoSQL？いやいやもっとビジュアル化された、そうお前の目の前のExcelぐらいなビジュアライズを遂げたデータベースがあるじゃないか！いでよグーグルスプレッドシート！

## Google APIs Client Library for PHP ver 1.1.6

肝心なことは[Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする（1） - Mach3.laBlog](http://blog.mach3.jp/2015/09/16/google-spreadsheet-api-01.html)に書いてあった。ここで勉強しました、ありがとうございます。そして容赦なくコピペさせてもらって、自分がどう使ったかをここに記します。

というかちょっとハマった箇所があったので、そのメモな部分が多い。

以下、テストコードだが、Mach3.laBlogさんのコードがそもそも Google APIs Client Library for PHP の [バージョン1.1.6](https://github.com/google/google-api-php-client/releases/tag/1.1.6) であることに注意。最新版は数日前に 2.0.0 RC になっており、インターフェースが変わっていて`require_once autoload.php`してもエラーになる。何も考えずmasterブランチからダウンロードして、まずそれでハマった。

そのため、ダウンロードはgithubのREADMEの通り、[ここのzip](https://github.com/google/google-api-php-client/releases/tag/1.1.6)をダウンロードして、`src/Google`を使おう。ちなみに2.0.0RCは整理されたようでファイル数もインターフェースも綺麗になってるようだ。ここでは使わないけど。

## Google Developer 認証情報 json

GoogleのAPIの扉を開けゴマするjson cert keyをとっとこう。そんでどっかセキュアな場所に置いとこう、phpは別にpublicじゃなくても読めますからね。気に食わない時はパーミッションを`600`とかにしても良い。

1. [Google Developers Console](https://console.developers.google.com/)に入って、
2. アプリケーション作って、
3. 青い「APIを利用する」
4. メニュー「認証情報」
5. プルダウン「認証情報を追加」
6. 「サービスアカウント」

で作れる。ダウンロードされたjsonはなくしたら作りなおせ。カップラーメン作るより早い。

しかし、このコンソール画面は使いづらいな。迷子になる。

## スプレッドシートに共有をかける

そしてそのcertkey.jsonに書かれたメールアドレス`client_email`を共有にかけよう。

````json:certkey.json
{
  "private_key_id": "################",
  "private_key": "-----BEGIN PRIVATE KEY-----\#####################################################################################################-----END PRIVATE KEY-----\n",
  "client_email": "########@developer.gserviceaccount.com",
  "client_id": "#########gsa.apps.googleusercontent.com",
  "type": "service_account"
}
````

↑立派な`@developer.gserviceaccount.com`というメールアドレスをもってやがる。

スプレッドシート側での用意はこれだけというのが、[GAS経由](http://qiita.com/sakadon/items/e56856dd7d3c5b93cde1)とちがって、楽でいいね。

## コード

````php:test.php
// load Google APIs Client Library for PHP ver 1.1.6
require_once "/unko/Google/autoload.php";

$client = new Google_Client();
$client->setApplicationName("getSpreadsheet");

$credentials = $client->loadServiceAccountJson("/unko/.secret/certkey.json", array(
    Google_Service_Drive::DRIVE
));
$client->setAssertionCredentials($credentials);
$client->getAuth()->refreshTokenWithAssertion();

$accessTokenJson = $client->getAccessToken();
$accessToken = json_decode($accessTokenJson)->access_token;

// GET spreadsheets
$sheet_id = "##########################################";
$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]);

//print_r( $data['feed']['entry'] )

foreach ($data->feed->entry as $sheets) {
    if( $sheets->title->{"\$t"} == 'シート名は直接指定' ) {

        foreach ($sheets->link as $links) {
            if( $links->rel == 'http://schemas.google.com/spreadsheets/2006#listfeed' ){
                $listfeed = $links->href;
                echo '$listfeed: '.$listfeed;
            }
            if( $links->rel == 'http://schemas.google.com/spreadsheets/2006#cellsfeed' ){
                $cellsfeed = $links->href;
                echo '$cellsfeed: '.$cellsfeed;
            }
        }
    }
}
````

ここまでやれば、[Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする（2）](http://blog.mach3.jp/2015/09/17/google-spreadsheet-api-02.html)がすんなりイケルと思う。続きはそちらで。Good luck


## 補足

### `$sheet_id`

スプレッドシートのURLの文字列部分な、こういうの探して読んじゃう人は言わなくてもわかっちゃうべ？

### `$listfeed` と `$cellsfeed`

[記事のvol.1](http://blog.mach3.jp/2015/09/16/google-spreadsheet-api-01.html)では

> 読み書きに必要な “listfeed” と “cellsfeed” を変数等に格納しておきましょう。

とのことなので、それを探索する冗長な`foreach`文も書いた。データ構造が悪いことにしよう。

### session

sessionについてはおいらも今回不要だったのもあり、やってない。どっかで`start_session();`するだけで済む気がする。
公式ドキュメントにもさらっとどっかに書いてあった気がする（探したら見つからない）

### $t ってやつ

[PHP で JSON の object(stdClass) の参照したいデータが [&#8220;$t&#8221;] となっている時の取得方法と json_decode で配列を返す方法 ｜ memocarilog](http://memocarilog.info/php-mysql/7251)

によると、 `{}`で囲うとよいらしい。
`$sheets->title->{"\$t"}` うーん何かきめえ。