なんかユーザー管理しないといけないんだけど、バックエンド開発が本当にだるい。しかも管理するのは若干リテラシーが低い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
とかにしても良い。
- Google Developers Consoleに入って、
- アプリケーション作って、
- 青い「APIを利用する」
- メニュー「認証情報」
- プルダウン「認証情報を追加」
- 「サービスアカウント」
で作れる。ダウンロードされたjsonはなくしたら作りなおせ。カップラーメン作るより早い。
しかし、このコンソール画面は使いづらいな。迷子になる。
スプレッドシートに共有をかける
そしてそのcertkey.jsonに書かれたメールアドレスclient_email
を共有にかけよう。
{
"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経由とちがって、楽でいいね。
コード
// 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"}
うーん何かきめえ。