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

  • 89
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

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として解釈されます

とのことです。