LoginSignup
8
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-05

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

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

Google APIs Client Library for PHP ver 1.1.6

肝心なことはGoogle APIs Client Library for PHP を使ってスプレッドシートを読み書きする(1) - Mach3.laBlogに書いてあった。ここで勉強しました、ありがとうございます。そして容赦なくコピペさせてもらって、自分がどう使ったかをここに記します。

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

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

そのため、ダウンロードはgithubのREADMEの通り、ここのzipをダウンロードして、src/Googleを使おう。ちなみに2.0.0RCは整理されたようでファイル数もインターフェースも綺麗になってるようだ。ここでは使わないけど。

Google Developer 認証情報 json

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

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

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

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

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

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

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経由とちがって、楽でいいね。

コード

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)がすんなりイケルと思う。続きはそちらで。Good luck

補足

$sheet_id

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

$listfeed$cellsfeed

記事のvol.1では

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

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

session

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

$t ってやつ

PHP で JSON の object(stdClass) の参照したいデータが [“$t”] となっている時の取得方法と json_decode で配列を返す方法 | memocarilog

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

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9