PHPからGoogle Spreadsheets APIを使う
同じことやるの2度目なのに、すっかり忘れてしまっていたので、3度めに備えてメモ。
やりたいこと
(MySQLに入っている)あるデータを、Google Spreadsheets APIを使ってスプレッドシートに書き込む。
使うもの
以下のライブラリを使う。
事前準備
APIの有効化
まだの人は、Google API Consoleからプロジェクトを作成。
次に、左のメニューから「API」を選択して、必要なAPIを有効にする必要があるんだけど、スプレッドシートを使うには”Drive API”を有効にしておけば良さそう。
サービスアカウントの作成
最後に、API用の「アカウント」を作成。APIを使う方法として、ユーザー(Googleアカウントを持っている人間)の権限でアクセスする方法と、システムアカウントのようなものを作ってその権限でアクセスする方法の2通りがある。ちなみに、前者はWebアプリケーションでよく使われるOAuthを使う。
今回は、バッチ処理で定期的にMySQLデータをGoogleスプレッドシートに書き込むので、後者の「サービスアカウント」を使う方法を使用。
以下、手順。
- APIコンソールの左のメニューから「認証情報」を選択
- 右のメイン画面から「新しいクライアントIDを作成」をクリック
- 「サービスアカウント」を選択
- JSONキーをダウンロード出来るようになるが、これは多分使わないので、「新しいP12キーを作成」をクリックし、鍵をダウンロード。失くさないように要注意。
スプレッドシートの権限を設定
読み書きしたいスプレッドシートに対して、サービスアカウントからアクセスできる必要があるため、「共有」設定で、先ほど作成したサービスアカウントのメールアドレス(例: 123456789012-asdfghjkl1234567890qwertyuiop@developer.gserviceaccount.com )に対してアクセス許可を与える必要がある。
これで準備完了。
プログラム
大まかな流れとして、access tokenの作成まではGoogle APIs Client Library for PHPを使用し、実際のスプレッドシートへのアクセスにはphp-google-spreadsheet-clientライブラリを使用する。
初期化〜アクセストークン取得
$client = new Google_Client(); $client->setApplicationName("Great Application"); // 以下の値は、API Consoleより確認する $clientId = '123456789012-asdfghjkl1234567890qwertyuiop.apps.googleusercontent.com'; $serviceAccountName = '123456789012-asdfghjkl1234567890qwertyuiop@developer.gserviceaccount.com'; $keyFile = '/path/to/greate-app-00ab12345678.p12'; // Google_Client を初期化 $client->setClientId($clientId); $credentials = new Google_Auth_AssertionCredentials( $serviceAccountName, $scopes, file_get_contents($keyFile) ); $client->setAssertionCredentials($credentials); // access token 取得 if ($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($credentials); } $objToken = json_decode($client->getAccessToken()); $accessToken = $objToken->access_token;
スプレッドシートにアクセス
初期化が必要らしい。
$serviceRequest = new DefaultServiceRequest($accessToken); ServiceRequestFactory::setInstance($serviceRequest);
ここまでやれば、あとはライブラリのドキュメント(README)を見れば問題ないかと思うが、一応例を挙げておく。
$spreadsheetService = new Google\Spreadsheet\SpreadsheetService(); // "ID"は、スプレッドシートのURLを見れば分かる $spreadsheet = $spreadsheetService->getSpreadsheetById('1pyNsD8mTr7ufThnGY9dvfB3HF9mJ45TLgqvAbdG-Q4G'); $worksheetFeed = $spreadsheet->getWorksheets(); $worksheet = $worksheetFeed->getByTitle("出力先シート");
まとめ
非技術者にMySQLのテーブルを直接見せるのには抵抗がある場合など、スプレッドシートに出力したい場面は結構あると思う。そういう時に、PHPのライブラリを使って比較的簡単にGoogleスプレッドシートにデータの出力が出来る。
用語が分かりにくかったり事前準備が若干面倒だったりするが、上のような手順に従えば問題ないはず。分かりにくいポイントは
- p12キーを使う
- 「サービスアカウント」を使う
- そのアカウントに対してスプレッドシートの権限を与える
といったところか。
なお、Google APIコンソールやAPIの仕様は結構変わりやすいので、その時点での最新ドキュメントを参照する。