Laravel で注文データをGoogleスプレッドシートに追加する

さてさて、少し前まではデータを表で管理しようとなると、ほぼ100%の確率でExcelを使っていたのではないでしょうか。

もちろん今でもこの影響で主に企業内ではExcelが重宝されていますが、それでもやはりこのインターネット時代の現在、それも少しずつ変化の兆しが見えてきたのではないでしょうか。

そうです!
Googleスプレッドシートです。

Googleスプレッドシートは誰でも無料で使えるにもかかわらず、他のユーザーと共同でデータを変更したり、最近だとマクロにも対応したりとExcelを使わずとも高機能な表計算ができるようになってきています。(さらに、スマホアプリでどこからでもアクセスができるようになっているなどメリットは多数です)

そして、実はPHPからでもこのスプレッドシートを操作することができると知っているでしょうか?例えば、注文があるごとにスプレッドシートにそのデータを追加していくという機能だって実現できるわけです。

ということで、今回はPHP(Laravel)からGoogleスプレッドシートを操作する手順をご紹介しましょう!ぜひ学習の参考にしてみてくださいね。

※ 開発環境Laravel 5.7

やりたいこと

注文を受けたら、「商品の注文データ」という名前のスプレッドシートへ1行ずつ追加していくプログラムです。(注文部分はランダムにデータを作成します)

では、実際に開発していきましょう!

準備すること

Google APIでスプレッドシートを有効にする

まず、Googleアカウントへログインしておいてください。そして、ログインした状態で、Google API Consoleへアクセスします。

するとページ左上の赤枠の部分をクリックすると「プロジェクトの選択」というダイアログが表示されますので、「新しいプロジェクト」というリンクをクリックします。

「新しいプロジェクト」というページ表示されるので、プロジェクト名(ここではDev Test)として作成ボタンをクリックします。

これでプロジェクトが追加されました。

続いて、Google Spreadsheets APIを追加します。ページ左にあるメニューのAPIとサービスをクリックします。

そして、APIとサービスの有効化をクリック。

APIを検索する画面が表示されます。

検索バーに「sheet」と入力するとAPIが表示されるので、これをクリック。

次に表示されたページの「有効にする」ボタンをクリック。

Google Sheets APIが追加されるので、続けてページ右側にある「認証情報を作成」リンクをクリックします。

次のページ表示されるので、

  • 使用するAPI ・・・ Google Sheets API
  • APIを呼び出す場所 ・・・ ウェブサーバー
  • アクセスするデータの種類 ・・・ アプリケーションデータ
  • App Engine または Compute Engine でこの API を使用する予定はありますか? ・・・ いいえ、使用しません

を選択して「必要な認証情報」ボタンをクリックします。

認証情報の追加ページが表示されるので、

  • サービスアカウント名
  • 役割

を入力&選択して次へをクリックします。

すると次の表示が出て、自動的に認証に必要なJSONファイルがダウンロードされます。

ダウンロードしたJSONファイルは後で使うので、credentials.jsonという名前に変えてstorage/app/json/フォルダに入れておきましょう。

スプレッドシートをつくる

では、Googleスプレッドシートに「商品の注文データ」というシートを作って、書き込み権限を設定しておきましょう。

まず、スプレッドシートのトップページを開いて次の赤枠の部分をクリックします。

すると新しいシートが表示されますので、左上のタイトルを「商品の注文データ」としておきましょう。

次に、ページ右上にある共有ボタンをクリック。

共有ダイアログが表示されますので、ここに先ほどダウンロードしたJSONファイルの中に書かれているクライアント・メールアドレスを入力します。

※ クライアントメールアドレスは、JSONファイルの以下の部分に書いてあります。

"client_email": "dev-test@****************.iam.gserviceaccount.com",

これでGoogle Sheets APIとの共有設定が完了しました。

データの追加に備えて、以下のように注文データのヘッダー部分を作っておきましょう。

Google Client Libraryをインストールする

Google APIは、PHPからの操作がしやすいようにライブラリを公開していますのでインストールしましょう。

といっても、composerが使えるので次のコマンド一発で完了します。

composer require google/apiclient:^2.0

※ ただし、Laravel用に作成されたものではないのでFacadeは使えません。

テストの注文データを作る

本来ならウェブページから注文できるようにして注文情報をスプレッドシートへ追加したいところですが、さすがに今回のテーマからは外れてしまうのでfor()ループでテストの注文データを作成するようにします。

せっかくなので、リアルなダミーデータを作成してくれるFakerを使ってお客さんの名前をランダムに作ってみましょう。

$faker = \Faker\Factory::create('ja_JP');

ではfor()ループさせて注文データをつくります。

$faker = \Faker\Factory::create('ja_JP');

for($i = 0 ; $i < 5 ; $i++) {

    $customer_name = $faker->name;
    $product_id = array_random([1, 2, 3]);
    $qty = array_random([3, 5, 10]);
    $amount = array_random([1000, 5000, 10000]);
    $order = [
        $customer_name,            // お客さんの名前
        $product_id,               // 商品ID
        now()->toDateTimeString(), // 注文日時
        $amount,                   // 値段
        $qty,                      // 個数
        8,                         // 税金
    ];
    print_r($order);

}

実際に実行すると以下のようなデータをつくることができます。

では、準備はすべて完了しました。
次の項目から実際にスプレッドシートへ注文データを追加していきましょう!

スプレッドシートへ注文データを追加する

作成したスプレッドシートのIDを取得する

まず「商品の注文データ」シートのIDを取得しておきましょう。

IDはURLに含まれています。シートを表示してアドレスバーの以下の部分を取得してください。

https://docs.google.com/spreadsheets/d/(スプレッドシートのID)/edit#gid=0

Google_Service_Sheetsを取得するモデルをつくる

では、Google_Client(インストール済み)とcredentials.json(保存済み)を使って認証&スプレッドシート用のインスタンスを取得するモデルをつくりましょう。

次のコマンドでモデルを作成。

php artisan make:model GoogleSheet

ファイルを開いて、以下のように変更します。

<?php

namespace App;

class GoogleSheet
{
    public static function instance() {

        $credentials_path = storage_path('app/json/credentials.json');
        $client = new \Google_Client();
        $client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
        $client->setAuthConfig($credentials_path);
        return new \Google_Service_Sheets($client);

    }
}

※ DB機能は必要ないので、extends部分は削除しています。

やっていることは、ダウンロードして設置したcredentials.jsonを使ってGoogle_Clientで認証、そしてGoogle_Service_Sheetsのインスタンスを取得しています。

これで、次のようにシートのインスタンスをいつでも取得することができるようになります。

$sheets = \App\GoogleSheet::instance();

では、スプレッドシートへのアクセスがうまくいくかどうかをテストするために、先ほど作成したヘッダー部分の項目を取得してみましょう。

$sheets = \App\GoogleSheet::instance();

$sheet_id = '(あなたのスプレッドシートID)';
$range = 'A1:H1';
$response = $sheets->spreadsheets_values->get($sheet_id, $range);
$values = $response->getValues();
print_r($values);

実行すると以下のようになります。

注文データをスプレッドシートへ追加する

では、やっと本題に到着しました。
実際に注文データ(先ほど作ったテストデータ)をスプレッドシートへ追加していきましょう。

コードはこうなります。

$sheets = \App\GoogleSheet::instance();
$sheet_id = '(あなたのスプレッドシートID)';
$faker = \Faker\Factory::create('ja_JP');

for($i = 0 ; $i < 5 ; $i++) {

    $customer_name = $faker->name;
    $product_id = array_random([1, 2, 3]);
    $qty = array_random([3, 5, 10]);
    $amount = array_random([1000, 5000, 10000]);

    $order = [
        $customer_name,            // お客さんの名前
        $product_id,               // 商品ID
        now()->toDateTimeString(), // 注文日時(今の時間)
        $amount,                   // 値段
        $qty,                      // 個数
        8,                         // 税金
        '=D:D*E:E',                // 小計
        '=G:G*(1+F:F*0.01)'        // 合計(小計 + 税額)
    ];

    $values = new \Google_Service_Sheets_ValueRange();
    $values->setValues([
        'values' => $order
    ]);
    $params = ['valueInputOption' => 'USER_ENTERED'];
    $sheets->spreadsheets_values->append(
        $sheet_id,
        'A1',
        $values,
        $params
    );

}

まず、注文データ$orderにはスプレッドシートの「小計」と「合計」を自動的に計算する式を追加しています。

そして、$sheets->spreadsheets_values->append()を使ってデータを追加していきます。

ではコードを実行してみましょう。

うまくいきました!
小計や合計もうまく計算して表示されています。

おまけ

せっかくなので、金額は円表記にしておきましょう。
まず、値段の列「D」をクリックして選択状態にします。

次に表示形式 ➜ 数字 ➜ 通貨(端数切り捨て)をクリック。

すると、D列(値段)だけでなく、計算式でD列を使っているG列(小計)、H列(合計)も自動的に円表記にしてくれます。

お疲れ様でした!