PHPからGoogleスプレッドシートにデータを登録してみた

PHPからGoogleスプレッドシートにデータを登録してみた

弊社の取り組みで、POSSEという学生プログラミングコミュニティに関わっておりますが、その中で学生に実際の案件に近い形でチーム開発を経験してもらうというカリキュラムがあります。

POSSEについてはこちら

https://posse.anti-pattern.co.jp/

学生がチームに分かれて取り組むカリキュラムになっており、モックアップを作成しながらお客様に要件ヒアリングを行います。その後は開発、テストまで行い、最後にはお客様の要件を満たしているか、プログラムはちゃんと実装できているか、チームで協力して開発できているかなどの基準で良かったチームを表彰します。お客様が実際にほしいと思っているものを作成するので、良いものを作った場合は実際にお客様の会社のサービスとして利用される可能性もあります。

私はメンターとしてチーム開発をサポートする、という立場で参加しております。

学生が要件定義をしている中で、

「作成するサイトで申込みがあった場合、申込みの情報をスプレッドシートに保存したい」という要件がありました。

本当にスプレッドシートが最適なのか、 別の形が良いのではないドか、など学生が要件ヒアリングをしているのを聞いていると、スプレッドシートに保存するというのが、選択肢としてありそうな感じでした。

プログラムからスプレッドシートにデータを保存。というのを実装したことが無く、実装できないのであれば学生に早めに伝えないと行けないので、念の為実装確認をした。というのがこの記事を書いた経緯になります。では本題に入ります。

実装方法を調べるため公式のGoogleさん探すと、以下のページを見つけました。

PHP Quickstart | Sheets API | Google Developers

https://developers.google.com/sheets/api/quickstart/php

POSSEのカリキュラムでPHPを勉強しているのですが、丁度PHPのサンプルが公式にありました。こんなページあるのなら実装できそうなので、検証要らない気もしますが。。。念の為実装してみます

Step 1: Turn on the Google Sheets API

これはスプレッドシートにアクセスするアカウントを作成するために必要な作業です。ボタンポチポチ押して行くと、OAuthって出てきました。ログインしないといけないので嫌です。

左のメニューにAuthorizing Requestsとあるので見てみると、API keyと書いてあるのでこれ使いたいです。

Acquiring and using an API keyを見ると、Credentials pageでキーを作れと書いてあるので作りに行きます。

認証情報を作成 - サービスアカウントから作成します。

名前はわかりやすいものを設定して、権限などは付与せずに作成します。

その後認証用のキーを作成します。作成したユーザをクリックし、キーのタブを選択、鍵を追加 - 新しい鍵を作成を選択します。

JSONを選択し作成ボタンを押します。

鍵が作成されダウンロードされますので、大事に保管しておきます。

これでStep1は終わりです。

Step 2: Install the Google Client Library

こちらはライブラリのインストールです。

書いてあるとおりコマンド打てばライブラリがインストールされます。composerがなくてエラーになる場合はインストールしてからですね。

Step 3: Set up the sample

サンプルコードがあるので使わせていただきます。

手を入れるのは2箇所、

OAuthを使うようになっているところを、API Keyを使うようにする。

データを取ってくるサンプルなので、書き込むように変更する。

API Keyを使うようにする

サンプルの中にAPI Keyを使う処理も入っているので、つまんで使います。

getClient()メソッドの中で色々処理してますが、STEP1で作った認証情報設定するだけで基本OKぽいです。

サンプルはsetScopesで読み込み専用としているので、書き込みできそうなものを設定します。

ここのドキュメントにパラメータが記載されてます。

https://developers.google.com/resources/api-libraries/documentation/sheets/v4/php/latest/class-Google_Service_Sheets.html

$client = new Google\_Client(); $client->setScopes(Google\_Service\_Sheets::SPREADSHEETS); $client->setAuthConfig('credentials.json'); $service = new Google\_Service\_Sheets($client);

書き込むように変更する

はじめ見ていたPHP Quickstartの左のメニューに、Reading and Writing Valuesとあるので見てみます。

Writing to a single rangeのサンプルがあるのでこれをパクります

$values = \[  
    \[  
        // Cell values ...  
    \],  
    // Additional rows ...  
\];  
$body = new Google\_Service\_Sheets\_ValueRange(\[  
    'values' => $values  
\]);  
$params = \[  
    'valueInputOption' => $valueInputOption  
\];  
$result = $service->spreadsheets\_values->update($spreadsheetId, $range,  
$body, $params);  
printf("%d cells updated.", $result->getUpdatedCells());

このサンプルそのまま使えないので、手を入れます

appendメソッドに渡すのは以下の情報

・$spreadsheetId(スプレッドシートのID)

・$range(対象シートや対象セルなどの情報)

・$body(追加する値)

・$params(関数など 設定しない場合はUSER_ENTEREDで良さそう)

参考ドキュメント:

https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append

https://developers.google.com/sheets/api/reference/rest/v4/ValueInputOption

スプレッドシートIDはURLから確認できます。

例)https://docs.google.com/spreadsheets/d/1yZYItshTGo4HRreUhNrTaoCDfxOdZBVm8uZhFWEqA70/edit#gid=0

太字の部分がスプレッドシートIDになります。

ボディーには追加する値、今回は「posse」を設定します。

$spreadsheetId = '1yZYItshTGo4HRreUhNrTaoCDfxOdZBVm8uZhFWEqA70';  
$range = 'シート1';  
$values = \[  
    \[  
        'posse'  
    \],  
\];  
$body = new Google\_Service\_Sheets\_ValueRange(\[  
    'values' => $values  
\]);  
$params = \[  
    'valueInputOption' => 'USER\_ENTERED'  
\];  
$result = $service->spreadsheets\_values->append($spreadsheetId, $range, $body, $params);  
printf("%d cells appended.", $result->getUpdates()->getUpdatedCells());

結果のコード全体では下記のようになります。

quickstart.phpという名前で保存しておきます。

< ?php  
require \_\_DIR\_\_ . '/vendor/autoload.php';  
$client = new Google\_Client();  
$client->setScopes(Google\_Service\_Sheets::SPREADSHEETS);  
$client->setAuthConfig('credentials.json');  
$service = new Google\_Service\_Sheets($client);  
$spreadsheetId = '1yZYItshTGo4HRreUhNrTaoCDfxOdZBVm8uZhFWEqA70';  
$range = 'シート1';  
$values = \[  
    \[  
        'posse'  
    \],  
\];  
$body = new Google\_Service\_Sheets\_ValueRange(\[  
    'values' => $values  
\]);  
$params = \[  
    'valueInputOption' => 'USER\_ENTERED'  
\];  
$result = $service->spreadsheets\_values->append($spreadsheetId, $range, $body, $params);  
printf("%d cells appended.", $result->getUpdates()->getUpdatedCells());

最後に対象のスプレッドシートに、Step1で作ったユーザからアクセス出来るようにアクセス権設定をします。

これで準備完了です。

Step 4: Run the sample

root@9046954e4dec:/var/www/html# php quickstart.php 1 cells appended.

1セル追加したと出てますね。実際にスプレッドシート見てみます

値が設定できているのでOKですね!サンプルがコピペで動く感じでは無かったのでちょっと時間かかりましたが、割と簡単に動くのを確認出来ました。

あとは今回実装するシステムで、credentials.jsonが外部から見られちゃった。。。ということがないように、気をつけてほしいなと願っています。(もちろん成果物のチェック対象です)