PHPでGoogle Spreadsheetにデータ投入してみる

More than 3 years have passed since last update.

Google Spreadsheetに集計値を入れたら、Google Analytics との連携も取りやすいし数値の共有もしやすそう。最近PHPでコードを書くことが多いのでスクリーンショット付きで細かく書いてみました。


Google Developers Console での設定


プロジェクト作成

https://console.developers.google.com/project

01.png

「プロジェクトを作成」から

02.png

適当なプロジェクト名を設定して「作成」。

03.png

メニューの「API」から

04.png

Drive APIを検索して「ON」にする。


クライアントIDの作成、キーの取得

06.png

「認証情報」から「新しいクライアントIDを作成」

07.png

「サービスアカウント」を選択し作成を行います。

08.png

「新しいP12キーを作成」からキーファイル「プロジェクト名-xxx.p12」を作成して保存してください。また、表示される「クライアントID」「メールアドレス」はこの先必要になるのでメモしておいてください。


Google Spreadsheetの設定

https://drive.google.com/

09.png

Googleドライブからスプレッドシートを新規に作成し「データ投入テスト」という名前に設定します。また、先のデータ投入のため「A1」に「date」「B1」に「value」を入力します。

10.png

共有設定で、「クライアントIDの作成、キーの取得」の最後で表示されたメールアドレス「××××@developer.gserviceaccount.com」に対して編集権限を与えます。


パッケージのインストール、ファイルの配置

今回は

https://github.com/asimlqt/php-google-spreadsheet-client

こちらを利用します。

spreadsheet_testというフォルダを作りその中に


composer.json

  "require": {

"asimlqt/php-google-spreadsheet-client": "2.3.*",
"google/apiclient": "1.1.2"
}

このような composer.json 作成し

composer install

インストールしてください。

また composer.json を設置したフォルダに先ほどダウンロードした「プロジェクト名-xxx.p12」を配置してください。

現在のファイル一覧

+ spreadsheet_test

+ composer.json
+ composer.lock
+ プロジェクト名-xxx.p12
+ vendor/


プログラム作成

※コードの中身は http://stackoverflow.com/questions/21470405/google-api-how-to-connect-to-receive-values-from-spreadsheet ここに記載があるものほぼそのままです。


spreadsheet_test/test.php

<?php

require_once('vendor/autoload.php');

$G_CLIENT_ID = 'サービスアカウントのクライアントID';
$G_CLIENT_EMAIL = 'サービスアカウントのメールアドレス';
$G_CLIENT_KEY_PATH = 'プロジェクト名-xxx.p12';
$G_CLIENT_KEY_PW = 'notasecret';

$obj_client_auth = new Google_Client ();
$obj_client_auth->setApplicationName ('TestApplication');
$obj_client_auth->setClientId ($G_CLIENT_ID);
$obj_client_auth->setAssertionCredentials (new Google_Auth_AssertionCredentials(
$G_CLIENT_EMAIL,
array('https://spreadsheets.google.com/feeds','https://docs.google.com/feeds'),
file_get_contents ($G_CLIENT_KEY_PATH),
$G_CLIENT_KEY_PW
));

$obj_client_auth->getAuth()->refreshTokenWithAssertion();
$obj_token = json_decode($obj_client_auth->getAccessToken());
$accessToken = $obj_token->access_token;

$serviceRequest = new Google\Spreadsheet\DefaultServiceRequest($accessToken);
Google\Spreadsheet\ServiceRequestFactory::setInstance($serviceRequest);

$spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
$spreadsheetFeed = $spreadsheetService->getSpreadsheets();

$spreadsheet = $spreadsheetFeed->getByTitle('データ投入テスト');
$worksheetFeed = $spreadsheet->getWorksheets();
$worksheet = $worksheetFeed->getByTitle('シート1');
$listFeed = $worksheet->getListFeed();

$row = array('date'=>'2015/03/01', 'value'=>1);
$listFeed->insert($row);
$row = array('date'=>'2015/03/01', 'value'=>2);
$listFeed->insert($row);


これを実行するとスプレッドシートにデータが投入されます。

https://github.com/asimlqt/php-google-spreadsheet-client#updating-a-list-row

ここを参考にすれば、日付をキーにして数値を更新する、などといった事も可能です。


詰まったこと


  • フィールド名が日本語だった場合にうまく更新ができなかった。アルファベットのみにすれば動作したので、詳細には調査していません。


フィールド名に関しての追記


The column names are the header values of the worksheet lowercased and with all non-alpha-numeric characters removed. For example, if the cell A1 contains the value "Time 2 Eat!" the column name would be "time2eat".


とドキュメントに記述されています。

ざっくりと翻訳すると、

英数字とハイフン以外の文字列は取り除かれて、すべて小文字として扱います。

たとえばTime 2 Eat!time2eatとして解釈されます

とのことです。