[PHP] Google Sheets API を使ってスプレッドシートの値を取得

PHPGoogle

Google スプレッドシートからデータを取ってきて、PHP で作っている Web アプリに取り込みたいとの要望があり、 PHP で Google スプレッドシートの値を取得する方法を調べた。
API を使わない方法も存在するが、ここでは Sheets API を使っている。

スポンサーリンク

Google スプレッドシートにアクセスする方法

調べると 2 つの方法が出てきて、 Google Sheets API を使う方法と、スプレッドシートをウェブ公開にしてシートの URL からアクセスする方法があった。

スプレッドシートをウェブ公開する方法は、お手軽で簡単に導入できそうだが、公開範囲を限定できる(同一アカウントでログインしている人のみ表示が選択可能)とはいえウェブ上に公開されるので、今回扱うデータの特性上よろしくない。

API を使う方法は、スプレッドシートにアクセスするシステムに対し、アクセス権限の認証を行うため、手間はかかるがスプレッドシートを公開することなくデータを取得することができる。よって、今回は API を使う方法を採用した。

Sheets API を使う方法

G メールとか Gppgle Drive とか Google がもつサービスを、自分のアプリケーションで使うとか、その他のサービスから利用できるようにしてくれる Google API ていうのがあって、この API の 1 つでスプレッドシートを扱えるようにしてくれるのが Sheets API である。

プロジェクトの作成

Google API Console の Google Sheets API のアプリケーション登録画面から「プロジェクトを作成」またはプルダウンから既存プロジェクトを選択し、「続行」ボタンをクリック。

Google Sheets API created wizard
Google Sheets API Created Wizard

認証情報の追加」までの操作は、 Google Cloud Platform でもできるみたい。

API が有効になる。「認証情報に進む」をクリック

turn on Google API
turn on Google API

認証情報の追加

以下を入力し、「必要な認証情報」をクリック。
使用する API : Google Sheets API
API を呼び出す場所 : ウェブサーバー ( node.js, tomcat など)
アクセスするデータの種類 : アプリケーションデータ
App Engine または Compute Engine でこのAPIを使用する予定はありますか : いいえ、使用していません。
Add credentials page 1
Add credentials page 1
API を呼び出す場所の種類
7 つから選ぶことができた。
API を呼び出す場所の種類
API を呼び出す場所の種類

サービスアカウント名を入力し、役割を選択する。(サービスアカウントは自動で作られた)
キーのタイプは「 JSON 」 を選択。
「次へ」をクリック。

Add credentials page2
Add credentials page2

JSON ファイルがダウンロードされるので、保存しておく。

サービス アカウントとキーが作成されました
サービス アカウントとキーが作成されました

スプレッドシートの共有

「IAMと管理」 → 「サービスアカウント」のメールアドレスをコピー。
IAM と管理のサービスアカウント
IAM と管理のサービスアカウント

値を取得したいスプレッドシートの「共有」をクリック。
ユーザーのところに、コピーしたメアドを入力し「送信」クリック。

(この時点で、Google Sheets API が無効になっている場合は、 「ダッシュボード」 → 「 API とサービス」 → 「 Google Sheets API 」の画面で有効にできそう。)

API Client Library のインストール

composer を使ってインストールする。
composer がない場合は、先に composer をインストールする。 composer のインストール方法は、 Amazon Linux に composer をインストール を参照してください。
(サーバーに置いて使う場合は、 GitHub にある公式ライブラリ googleapis/google-api-php-client からダウンロードする。)
プロジェクトのルートディレクトリに移動してから、コマンド実行。

$ php composer.phar require google/apiclient:^2.0

vendor フォルダと、 composer.json 、composer.lock というファイルが作成される。

認証情報の追加」でダウンロードされた json ファイルを credentials.json というファイル名にして、プロジェクトのルートディレクトリ( composer.json と同じ階層)に置く。

スプレッドシートの値を取得する PHP プログラム

ファイル名 test にアクセスして、シート名 シート1 の A1:D3 の範囲にある値を取得するコード。

spreadsheets test
spreadsheets test
<?php
require_once __DIR__ . '/vendor/autoload.php';

define('APPLICATION_NAME', 'test');
define('CLIENT_SECRET_PATH', __DIR__ . '/credentials.json');
define('SCOPES', implode(' ', array(
  Google_Service_Sheets::SPREADSHEETS_READONLY)
));

// アカウント認証情報インスタンスを作成
$client = new Google_Client();
$client->setScopes(SCOPES);
$client->setAuthConfig(CLIENT_SECRET_PATH);

//シート情報を操作するインスタンスを生成
$sheet = new Google_Service_Sheets($client);

$spreadsheetId = 'スプレッドシートのID';
$range = 'シート1!A1:D3';
$response = $sheet->spreadsheets_values->get($spreadsheetId, $range);
$values = $response->getValues();

foreach ($values as $index => $row) {
  echo $index+1;
  echo "<br><pre>";
  echo var_dump($row);
  echo "</pre>";
}

// echo の結果
1
array(4) {
  [0]=>
  string(0) ""
  [1]=>
  string(7) "project"
  [2]=>
  string(5) "price"
  [3]=>
  string(4) "word"
}
2
array(4) {
  [0]=>
  string(4) "Jan"
  [1]=>
  string(2) "pA"
  [2]=>
  string(6) "123.13"
  [3]=>
  string(4) "1234"
}
3
array(4) {
  [0]=>
  string(0) ""
  [1]=>
  string(5) "PB123"
  [2]=>
  string(5) "54.63"
  [3]=>
  string(4) "4234"
}


以上。

Posted by Agopeanuts