asimlqt/php-google-spreadsheet-client
PHP client for the Google Sheets API that makes it easy to read, write, update and append spreadsheet data. Lightweight, practical wrapper with simple methods for authentication and common Sheets operations, ideal for integrating Google Sheets into PHP apps.
Installation
composer require asimlqt/php-google-spreadsheet-client
composer.json includes the package under require.Authentication
"client_email").First Use Case: Read a Cell
use Asimlqt\GoogleSpreadsheetClient\GoogleSpreadsheetClient;
$client = new GoogleSpreadsheetClient('path/to/service-account.json');
$spreadsheetId = 'your-spreadsheet-id'; // Found in the spreadsheet URL
$sheetName = 'Sheet1'; // Default sheet name
$cellValue = $client->getCellValue($spreadsheetId, $sheetName, 'A1');
echo $cellValue; // Outputs the value of cell A1
Key Files to Reference
src/GoogleSpreadsheetClient.php (Core class)examples/ (if available in the repo; otherwise, check GitHub for community examples).Reading Data
A1:D10):
$rangeData = $client->getRangeValues($spreadsheetId, $sheetName, 'A1:D10');
foreach ($rangeData as $row) {
foreach ($row as $cell) {
echo $cell . ' ';
}
}
Writing Data
$client->setCellValue($spreadsheetId, $sheetName, 'B2', 'New Value');
$client->appendRow($spreadsheetId, $sheetName, ['Name', 'Email', 'Age']);
Batch Operations
getBatchUpdate() to combine multiple updates (e.g., formatting + data) into one API call for efficiency.Handling Multiple Sheets
$sheets = $client->getSheets($spreadsheetId);
foreach ($sheets as $sheet) {
echo $sheet->getTitle() . "\n";
}
Integration with Laravel
// config/app.php
'bindings' => [
Asimlqt\GoogleSpreadsheetClient\GoogleSpreadsheetClient::class => function ($app) {
return new GoogleSpreadsheetClient(config('services.google.spreadsheet.key'));
},
];
// app/Facades/GoogleSpreadsheet.php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class GoogleSpreadsheet extends Facade {
protected static function getFacadeAccessor() {
return 'google.spreadsheet';
}
}
Register in AppServiceProvider:
$this->app->bind('google.spreadsheet', function () {
return new GoogleSpreadsheetClient(config('services.google.spreadsheet.key'));
});
Usage:
$value = GoogleSpreadsheet::getCellValue($spreadsheetId, 'Sheet1', 'A1');
Scheduled Jobs (Laravel)
// app/Console/Commands/SyncSpreadsheetData.php
use Illuminate\Console\Command;
use Asimlqt\GoogleSpreadsheetClient\GoogleSpreadsheetClient;
class SyncSpreadsheetData extends Command {
protected $signature = 'spreadsheet:sync';
public function handle(GoogleSpreadsheetClient $client) {
$data = $client->getRangeValues($spreadsheetId, 'Sheet1', 'A1:B100');
// Process data (e.g., save to DB)
}
}
app/Console/Kernel.php:
protected function schedule(Schedule $schedule) {
$schedule->command('spreadsheet:sync')->daily();
}
Authentication Issues
Invalid Credentials or 403 Forbidden.Rate Limits
cache()->remember()).Deprecated Methods
google/apiclient) for advanced features, but wrap it in a Laravel-friendly facade.Time Zone Handling
Carbon to parse/format:
use Carbon\Carbon;
$rawDate = $client->getCellValue($spreadsheetId, 'Sheet1', 'A1');
$carbonDate = Carbon::parse($rawDate);
Large Datasets
$batchSize = 100;
for ($i = 1; $i <= 1000; $i += $batchSize) {
$data = $client->getRangeValues($spreadsheetId, 'Sheet1', "A{$i}:B" . ($i + $batchSize));
// Process $data
}
Enable Logging
Add this to your GoogleSpreadsheetClient constructor to log API responses:
$client = new GoogleSpreadsheetClient('key.json', [
'logger' => function ($message) {
\Log::debug($message);
}
]);
Check HTTP Status Codes
try-catch to log errors:
try {
$data = $client->getRangeValues($spreadsheetId, 'Sheet1', 'A1:B10');
} catch (\Exception $e) {
\Log::error('Google Sheets Error: ' . $e->getMessage());
\Log::error($e->getTraceAsString());
}
Validate Spreadsheet ID
spreadsheetId is correct (extract from the URL: https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit).Custom Cell Formatting
// Hypothetical extension
$client->setRichTextCell($spreadsheetId, 'Sheet1', 'A1', [
'text' => 'Hello',
'bold' => true,
'color' => '#FF0000'
]);
Webhook Integration
function onEdit(e) {
const url = 'https://your-app.com/api/google-sheets-webhook';
const payload = {
spreadsheetId: e.source.getId(),
range: e.range.getA1Notation(),
value: e.value
};
UrlFetchApp.fetch(url, {
method: 'POST',
payload: JSON.stringify(payload),
headers: { 'Content-Type': 'application/json' }
});
}
Laravel Scout Integration
// app/Providers/AppServiceProvider.php
use Asimlqt\GoogleSpreadsheetClient\GoogleSpreadsheetClient;
use Laravel\Scout\Builder;
public function boot(GoogleSpreadsheetClient $client) {
Builder::macro('fromSpreadsheet', function ($spreadsheetId, $sheetName, $range) {
$data = $client->getRangeValues($spreadsheetId, $sheetName, $range);
return collect($data)->flatMap(fn($row) => $row);
});
}
Usage:
$results = (new Post)->search('query')->fromSpreadsheet($
How can I help you explore Laravel packages today?