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

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

# Google Developers Console での設定

## プロジェクト作成

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

![01.png](https://qiita-image-store.s3.amazonaws.com/0/8961/3f9a75fb-6ce6-be55-5e99-c67ba930866c.png)

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

![02.png](https://qiita-image-store.s3.amazonaws.com/0/8961/954be70e-9282-7616-d6e0-763bfd63c8ea.png)

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

![03.png](https://qiita-image-store.s3.amazonaws.com/0/8961/cf1eb1fe-3503-c8e9-c083-9fa1bdd016fc.png)

メニューの「API」から

![04.png](https://qiita-image-store.s3.amazonaws.com/0/8961/d982cd47-3b37-3c3f-15db-8d4ccdf039b5.png)

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

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

![06.png](https://qiita-image-store.s3.amazonaws.com/0/8961/1c8f913a-0eb1-f549-2103-78bcfa972701.png)

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

![07.png](https://qiita-image-store.s3.amazonaws.com/0/8961/f515678f-5141-9524-c5f1-dd0abb657f4b.png)

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

![08.png](https://qiita-image-store.s3.amazonaws.com/0/8961/a65a2a4e-6aec-cb69-bd43-d08241995910.png)

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

# Google Spreadsheetの設定

https://drive.google.com/

![09.png](https://qiita-image-store.s3.amazonaws.com/0/8961/dde7c3b8-ce54-0d0f-9b2e-3c3178a4a697.png)

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

![10.png](https://qiita-image-store.s3.amazonaws.com/0/8961/281e9648-101d-84cf-e3df-53115f8a6cef.png)

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

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

今回は

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

こちらを利用します。

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

```json:composer.json
  "require": {
    "asimlqt/php-google-spreadsheet-client": "2.3.*",
    "google/apiclient": "1.1.2"
  }
```
このような composer.json 作成し

```bash
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 ここに記載があるものほぼそのままです。

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

とのことです。