【スプレッドシートAPI】データを取得・入力するPHPの例|Google API クライアントの利用方法

今回は、Googleスプレッドシートを扱えるAPI(Google Sheets API)をPHPで利用して、スプレッドシートのデータを取得・入力する簡単な例となります。
例では、Google API クライアントを利用してAPIリクエストを行うPHPスクリプトを、コマンドラインから実行して、スプレッドシートのデータを取得・入力します。
Google Sheets APIを利用する準備
APIを有効にする
Google Sheets APIを利用するには、GCP(Google Cloud Platform)で有効にする必要があります。
APIを有効にする方法は、以下のリンク先を参考にしてみてください。
サービスアカウントを作成して認証情報をダンロード
GCPで有効にしたAPIを呼び出すには認証情報が必要となります。認証情報の種類にはいくつかありますが、今回の例では、サービスアカウントを作成して認証情報(JSONファイル)をダウンロードしている前提としています。
サービスアカウントを作成して認証情報をダンロードする方法は、以下のリンク先を参考にしてみてください。
サービス アカウントの作成と管理 | IAM のドキュメント | Google Cloud
スプレッドシートをサービスアカウントと共有
APIで扱うスプレッドシートを、作成したサービスアカウントと共有します。
スプレッドシートを共有する方法については、以下のリンク先を参考にしてみてください。
スプレッドシートIDを確認
サービスアカウントと共有したスプレッドシートをAPIで扱うには、スプレッドシートIDが必要となります。
スプレッドシートIDを確認する方法については、以下のリンク先を参考にしてみてください。
Google API クライアントをComposerでインストール
まずは、プロジェクトのフォルダを作成します。
そして、ComposerでGoogle APIクライアントをインストールするため、プロジェクトのルートディレクトリにcdコマンドで移動し、以下のコマンドを実行します。
composer require google/apiclient:^2.12.1
PHPライブラリの依存関係を管理するComposerをMacで利用する方法については、以下のリンク先を参考にしてみてください。
Google API クライアントの読み込み・インスタンスの作成
今回の例では、プロジェクトのルートディレクトリにPHPファイルを作成し、以下のソースコードを記述します。
コード内のxxxxxxxx.jsonの箇所には、ダウンロードした認証情報(JSONファイル)へのパスを指定します。
<?php
require_once __DIR__ . '/vendor/autoload.php';
// 環境変数GOOGLE_APPLICATION_CREDENTIALSを設定(認証情報へのパスを指定)
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . __DIR__ . '/xxxxxxxx.json');
// Google APIの設定を行うGoogle_Clientのインスタンスを作成
$client = new Google_Client();
$client->useApplicationDefaultCredentials(); // 利用する認証情報を指定
$client->addScope(Google_Service_Sheets::SPREADSHEETS); // 利用するスコープを指定
// スプレッドシートを扱うGoogle_Service_Sheetsのインスタンスを作成
$service = new Google_Service_Sheets($client);
上記コードでは、Google API クライアントライブラリを読み込み、Google APIの設定を行うGoogle_Clientクラス、APIリクエストで利用するGoogle_Service_Sheetsクラスのインスタンスを作成しています。
Google Sheets API の利用例
以下、それぞれのGoogle Sheets API のリクエスト例となり、上記コード後に記述してファイルを実行します。
コード内のxxxxxxxxの箇所には、確認したスプレッドシートIDを指定します。範囲はA1型で指定していますが、R1C1型でも指定可能。(R1C1型では「R」はRow(行)、「C」はColumn(カラム)を意味し、それらR・Cの数値順でセル番地を表します。)
また、コマンドラインから作成したファイルを実行するには、ファイルのあるディレクトリに移動して、次のコマンドを実行します。
php ファイル名
1つの範囲を取得する例
1つの範囲から値を取得する例となり、getValues()で取得している値は、行と列の2次元配列となります。
// スプレッドシートIDを指定
$ssId = 'xxxxxxxx';
// 取得する範囲を指定
$range = 'sheet01!A1:D4';
$result = $service->spreadsheets_values->get($ssId, $range);
$values = $result->getValues();
var_dump($values);
get()の第3引数には、出力形式の変更など、任意でクエリパラメータも指定できます。クエリパラメータやレスポンスデータなどの詳細は、文末の参考サイトを確認してみてください。
複数の範囲を取得する例
複数の範囲から値を取得する例となり、getValues()で取得している値は、行と列の2次元配列となります。
// スプレッドシートIDを指定
$ssId = 'xxxxxxxx';
// 取得する範囲を配列で指定
$ranges = [
'sheet01!A1:D4',
'sheet02!A1:D4',
];
// クエリパラメータを指定
$params = [
'ranges' => $ranges,
];
$result = $service->spreadsheets_values->batchGet($ssId, $params);
$getRanges = $result->getValueRanges();
foreach($getRanges as $getRange){
$values = $getRange->getValues();
var_dump($values);
}
batchGet()の第2引数の配列には、出力形式の変更など、任意で他のクエリパラメータも指定できます。クエリパラメータやレスポンスデータなどの詳細は、文末の参考サイトを確認してみてください。
1つの範囲に入力する例
1つの範囲に値を入力する例となります。
// スプレッドシートIDを指定
$ssId = 'xxxxxxxx';
//入力する範囲を指定
$range = 'sheet01!A1:B2';
// 入力する値の配列(行ごと)を要素にもつ配列を作成
$values = [
[ "マイケル・ジョーダン", 23 ],
[ "マジック・ジョンソン", 32 ],
];
// リクエストbodyに指定するインスタンスを作成
$body = new Google_Service_Sheets_ValueRange([
'values' => $values
]);
// クエリパラメータを指定
$params = [
// 入力する値の解釈の設定。文字列は数字や日付などに変換
'valueInputOption' => 'USER_ENTERED'
];
$result = $service->spreadsheets_values->update($ssId, $range, $body, $params);
任意で他のクエリパラメータも指定できます。クエリパラメータやレスポンスデータなどの詳細は、文末の参考サイトを確認してみてください。
複数の範囲に入力する例
複数の範囲に値を入力する例となります。
// スプレッドシートIDを指定
$ssId = 'xxxxxxxx';
// 入力する範囲・値(行ごと)の連想配列を要素とした配列を作成
$rangesValues = [
'sheet01!A1:B2' => [
[ "マイケル・ジョーダン", 23 ],
[ "マジック・ジョンソン", 32 ],
],
'sheet02!A1:B2' => [
[ "ステフィン・カリー", 30 ],
[ "ジェームズ・ハーデン", 13 ],
],
];
// 範囲・値を設定するインスタンスを配列にセット
$data = [];
foreach($rangesValues as $key => $value ){
$data[] = new Google_Service_Sheets_ValueRange([
'range' => $key,
'values' => $value
]);
}
// リクエストbodyに指定するインスタンスを作成
$body = new Google_Service_Sheets_BatchUpdateValuesRequest([
'data' => $data,
// 入力する値の解釈の設定。文字列は数字や日付などに変換
'valueInputOption' => 'USER_ENTERED',
]);
$result = $service->spreadsheets_values->batchUpdate($ssId, $body);
リクエストbodyには他のオプションも指定できます。リクエストbodyやレスポンスデータなどの詳細は、文末の参考サイトを確認してみてください。