スプレッドシートへの読み込みと書き込みをPHPで操作したかった。そして実装してみた。
GCPの操作
スプレッドシートを操作する上でGCPのSheets APIを使用することになる。
下記の手順でGCP上で諸々の設定をまずは行う必要がある。
- GCP上で新規プロジェクトを作成する。(もしくは任意のプロジェクト内で操作を行う)
- Google Sheets APIページでAPIを有効にする
- 「認証情報を作成」から新規にサービスアカウントを作成する
- 「このサービス アカウントにプロジェクトへのアクセスを許可する」は省略する
- 「ユーザーにこのサービス アカウントへのアクセス権を付与(オプション)」は省略する
- 認証に使用する鍵を作成する。
- 端末にJSONファイルをダウンロードする。
以上の手順が完了した後にGoogle Sheets API
の画面から「認証情報」を選択するとアカウントの一覧が表示される。
この中からサービスアカウントのメールアドレスを取得してスプレッドシートの共有ユーザーとして登録する。これでまずは連携のためのセットアップが完了する。
PHPプログラムの実装
まずはPHP用のクライアントライブラリをダウンロードする。
$ composer require google/apiclient:"^2.0"
PHPでプログラムを作成する上でGoogleアカウントの認証を行う必要があるが、これはGCPを操作した時に作成されたJSONファイルを使用する。
ここではauth-key.json
というファイル名に変更して使用する。
スプレッドシートの読み込み
読み込みを行うプログラムは以下のようになる。
<?php
require __DIR__ . '/vendor/autoload.php';
$key_file = __DIR__ . './auth-key.json';
// スプレッドシートのID
$sheet_id = 'xxxxxxxxxxxxxxxxxxxx';
// アカウント認証インスタンスの生成
$client = new Google_Client();
$client->setAuthConfig($key_file);
$client->setApplicationName('Sheet Api Test');
$scopes = [Google_Service_Sheets::SPREADSHEETS];
$client->setScopes($scopes);
// シートの読み込みインスタンスを生成
$service = new Google_Service_Sheets($client);
// 1列目の値を取得
$response = $service->spreadsheets_values->get($sheet_id, 'sheet1!A:A');
var_dump($response);
関数を実行すると$response
にはGoogle_Service_Sheets_ValueRange
が返される。
このオブジェクトのvalues
プロパティにスプレッドシートの値が保持されることになる。
下記はvar_dump()の結果。(1行目にある2つのセルの値を取得)
object(Google_Service_Sheets_ValueRange)#58 (7) {
["collection_key":protected]=>
string(6) "values"
["majorDimension"]=>
string(4) "ROWS"
["range"]=>
string(14) "sheet1!A1:A978"
["values"]=>
array(2) {
[0]=>
array(1) {
[0]=>
string(3) "9/1"
}
[1]=>
array(1) {
[0]=>
string(3) "9/2"
}
}
["internal_gapi_mappings":protected]=>
array(0) {
}
["modelData":protected]=>
array(0) {
}
["processed":protected]=>
array(0) {
}
}
スプレッドシートの書き込み
書き込みを行うプログラムは以下のようになる。
書き込み用のインスタンスを作成し、書き込む値を指定するだけで簡単に操作を行える。
<?php
require __DIR__ . '/vendor/autoload.php';
$key_file = __DIR__ . './auth-key.json';
// スプレッドシートのID
$sheet_id = 'xxxxxxxxxxxxxxxxxxxx';
// アカウント認証インスタンスの生成
$client = new Google_Client();
$client->setAuthConfig($key_file);
$client->setApplicationName('Sheet Api Test');
$scopes = [Google_Service_Sheets::SPREADSHEETS];
$client->setScopes($scopes);
// シートの書き込みインスタンスを生成
$sheet = new Google_Service_Sheets($client);
// 書き込みデータ
$values = [
[1,2,3,4,5],
];
$body = new Google_Service_Sheets_ValueRange([
'values' => $values,
]);
// 書き込みの実行
$response = $sheet->spreadsheets_values->append(
$sheet_id,// spread sheet id
'sheet1!B18:F18',
$body,
['valueInputOption' => 'USER_ENTERED']
);