LoginSignup
101
100

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-03-16

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

Google Developers Console での設定

プロジェクト作成

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の設定

09.png

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

10.png

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

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

今回は

こちらを利用します。

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);

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

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

詰まったこと

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

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

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

とのことです。

101
100
1

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
101
100