PHP | POSTデータをGoogleスプレッドシートに保存する方法

PHPを使ってPOSTデータをGoogleスプレッドシートに保存する方法メモ。

環境情報

  • PHPバージョン: PHP 7.4.33
  • サーバー: エックスサーバー(x10)

必要なファイル

  1. config.php – Google API認証情報を含むファイル
  2. vendor/autoload.php – Google Sheets APIのクライアントライブラリを読み込むためのファイル
  3. spreadsheet.php – POSTデータをGoogleスプレッドシートに保存するスクリプト

config.phpの設定

まず、config.phpファイルを作成し、Google APIの認証情報を設定します。このファイルはGoogle APIへの接続情報を安全に管理するために必要です。

<?php
define('SERVICE_ACCOUNT_KEY', 'path/to/service-account-key.json');
define('SPREADSHEET_ID', 'your_spreadsheet_id');
?>

composerの設定

次に、Google Sheets APIクライアントライブラリをインストールするためにcomposerを使用します。プロジェクトのルートディレクトリで以下のコマンドを実行してください。

composer require google/apiclient:^2.0

spreadsheet.phpの作成

次に、spreadsheet.phpファイルを作成し、以下のスクリプトを追加します。このスクリプトはPOSTリクエストを受け取り、Googleスプレッドシートに保存します。

<?php
header('Content-type: application/json; charset=utf-8');

// config.phpファイルを読み込む
require 'config.php';

// タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');

// 送信されたデータを取得
$data1 = filter_input(INPUT_POST, 'data1');
$data2 = filter_input(INPUT_POST, 'data2');
$created = date('Y-m-d H:i:s');

// Google Sheets API クライアントライブラリの読み込み
require 'vendor/autoload.php';

// 認証情報のパス
$client = new \Google_Client();
$client->setApplicationName('Google Sheets API PHP Quickstart');
$client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
$client->setAuthConfig(SERVICE_ACCOUNT_KEY); // サービスアカウントキーのJSONファイル
$client->setAccessType('offline');

// Google Sheets API サービスオブジェクトの作成
$service = new \Google_Service_Sheets($client);

// スプレッドシートIDとシート名を指定
$spreadsheetId = SPREADSHEET_ID;
$sheetName = 'results';
$range = $sheetName . '!A1';

// ヘッダー行を準備
$headerValues = [
    ['ID', 'data1', 'data2', 'created']
];
$headerBody = new \Google_Service_Sheets_ValueRange([
    'values' => $headerValues
]);
$params = [
    'valueInputOption' => 'RAW'
];

// データをスプレッドシートに追加する関数
function appendData($service, $spreadsheetId, $sheetName, $dataValues) {
    // データ行を追加
    $dataBody = new \Google_Service_Sheets_ValueRange([
        'values' => $dataValues
    ]);
    $dataRange = $sheetName . '!A:A'; // データ範囲を指定
    $params = [
        'valueInputOption' => 'RAW',
        'insertDataOption' => 'INSERT_ROWS'
    ];
    return $service->spreadsheets_values->append($spreadsheetId, $dataRange, $dataBody, $params);
}

try {
    // 最初にヘッダー行が設定されていない場合、設定する
    $response = $service->spreadsheets_values->get($spreadsheetId, $range);
    $values = $response->getValues();
    if (empty($values)) {
        $service->spreadsheets_values->update($spreadsheetId, $range, $headerBody, $params);
    }

    // シートの現在のID列の最大値を取得
    $range = $sheetName . '!A:A'; // ID列のみを取得
    $response = $service->spreadsheets_values->get($spreadsheetId, $range);
    $values = $response->getValues();
    $maxId = 0;
    foreach ($values as $row) {
        if (is_numeric($row[0])) {
            $maxId = max($maxId, (int)$row[0]);
        }
    }

    // 新しいIDを生成
    $newId = $maxId + 1;

    // データ行を準備
    $dataValues = [
        [$newId, $data1, $data2, $created]
    ];

    // データ行を追加
    $result = appendData($service, $spreadsheetId, $sheetName, $dataValues);

    $param = $created.'に'.$data1.'と'.$data2.'を追加 (ID: '.$newId.')';
    echo json_encode(["status" => "success", "message" => $param]);
} catch (Exception $e) {
    echo json_encode(["status" => "error", "message" => "Failed to save data to Google Sheets: " . $e->getMessage()]);
}
?>

スクリプトの説明

  1. ヘッダー設定: header('Content-type: application/json; charset=utf-8'); は、出力をJSON形式に設定します。
  2. config.phpの読み込み: require 'config.php'; でGoogle API接続情報を読み込みます。
  3. タイムゾーン設定: date_default_timezone_set('Asia/Tokyo'); でタイムゾーンを設定します。
  4. POSTデータの取得: filter_input(INPUT_POST, 'data1'); で送信されたデータを取得します。
  5. Google APIクライアントの設定: Google_Clientクラスを使用してGoogle APIクライアントを設定します。
  6. Google Sheetsサービスオブジェクトの作成: Google_Service_Sheetsクラスを使用してサービスオブジェクトを作成します。
  7. ヘッダー行の追加: 最初にヘッダー行が設定されていない場合、ヘッダー行を設定します。
  8. ID列の最大値取得と新しいID生成: ID列の最大値を取得し、新しいIDを生成します。
  9. データ行の追加: appendData関数を使用してデータ行をGoogleスプレッドシートに追加します。
  10. エラーハンドリング: 例外が発生した場合、エラーメッセージをJSON形式で出力します。

使用方法

  1. 上記のスクリプトをそれぞれのファイルに保存します。
  2. ウェブフォームからdata1data2のデータをPOSTリクエストで送信します。
  3. spreadsheet.phpをサーバー上で実行すると、データがGoogleスプレッドシートに保存されます。

コメント

タイトルとURLをコピーしました