DEV Community

Mahesh Prajapati
Mahesh Prajapati

Posted on

Fetch and Convert Google Sheets Data to JSON with PHP

If you're working with Google Sheets and you need to make its data accessible as JSON for a web application or API, PHP provides a simple way to get, parse, and convert CSV data from Google Sheets. In this post, I'll walk you through a PHP script that gets data from public Google Sheets in CSV format and converts it into a structured JSON response.

Why use Google Sheets as JSON?

Google Sheets are widely used to organize data. Whether for prototyping, content management, or a lightweight database solution, having the ability to convert Google Sheets to JSON opens up many possibilities for dynamic web applications.

Here’s the complete PHP script:

<?php
// Array of sheet URLs with their respective IDs
$sheets = [
    'sheet1' => "https://docs.google.com/spreadsheets/d/e/2PACX-1vQawhdv3OZSq4n3DTEIwY6aID5otU3KTk_BYUUHc8nuCQNerFA0xdWRsd68z4aIpUs3JDFXohjsvJKy/pub?gid=0&single=true&output=csv",
    'sheet2' => "https://docs.google.com/spreadsheets/d/e/2PACX-1vQawhdv3OZSq4n3DTEIwY6aID5otU3KTk_BYUUHc8nuCQNerFA0xdWRsd68z4aIpUs3JDFXohjsvJKy/pub?gid=1073107567&single=true&output=csv",
];

// Set response type as JSON
header('Content-Type: application/json');

try {
    // Get the requested sheet identifier from the query parameter
    $sheet = $_GET['sheet'];

    // Validate the sheet identifier
    if (!isset($sheets[$sheet])) {
        throw new Exception("Invalid sheet identifier.");
    }

    // Fetch CSV data from Google Sheets
    $csvData = file_get_contents($sheets[$sheet]);
    if ($csvData === FALSE) {
        throw new Exception("Failed to fetch data from Google Sheets.");
    }

    // Parse CSV data into an array
    $rows = array_filter(array_map('str_getcsv', explode("\n", $csvData))); // Remove empty rows
    $headers = array_shift($rows); // First row as headers

    if (!$headers || empty($rows)) {
        throw new Exception("Invalid or empty CSV data.");
    }

    // Convert CSV rows to associative array
    $menu = array_map(function($row) use ($headers) {
        $row = array_map('trim', $row); // Trim whitespace
        if (count($row) !== count($headers)) {
            return null; // Skip rows with missing fields
        }
        return array_combine($headers, $row);
    }, $rows);

    // Filter out invalid rows
    $menu = array_filter($menu);

    // Return JSON response
    echo json_encode($menu);

} catch (Exception $e) {
    // Handle errors
    http_response_code(500);
    echo json_encode(['error' => $e->getMessage()]);
}

Enter fullscreen mode Exit fullscreen mode

How It Works

1. Google Sheets Setup:
Ensure your Google Sheet is published as a CSV. Go to File > Share > Publish to Web and copy the CSV link.

2. Mapping Sheet URLs:
The $sheets array maps user-friendly sheet identifiers (e.g., sheet1, sheet2) to their corresponding Google Sheets URLs.

3. Fetching Data:
The script uses PHP’s file_get_contents() to retrieve the CSV content.

4. Parsing CSV:
The data is parsed into an array using str_getcsv() and converted into an associative array with headers as keys.

5. JSON Conversion:
The processed data is encoded as JSON and sent back as the response.

6. Error Handling:
Errors such as invalid sheet identifiers, failed fetches, or malformed data are handled gracefully, returning appropriate error messages.


Example Usage

1. Request Format:
Call the script via URL, passing the sheet identifier as a query parameter:

http://yourdomain.com/sheet-fetcher.php?sheet=sheet1
Enter fullscreen mode Exit fullscreen mode

2. Expected JSON Response:
For a sheet with the following content:

Name,Age,City
Alice,30,New York
Bob,25,San Francisco

Enter fullscreen mode Exit fullscreen mode

The JSON output will be:

[
    { "Name": "Alice", "Age": "30", "City": "New York" },
    { "Name": "Bob", "Age": "25", "City": "San Francisco" }
]

Enter fullscreen mode Exit fullscreen mode

Error Responses

The script includes robust error handling. For example:

Invalid Sheet Identifier:

{ "error": "Invalid sheet identifier." }
Enter fullscreen mode Exit fullscreen mode

Fetch Error:

{ "error": "Failed to fetch data from Google Sheets." }
Enter fullscreen mode Exit fullscreen mode

Advantages of This Approach

  • Dynamic Data: Updates in Google Sheets are reflected in real-time.
  • Simple Integration: No external libraries required; works with plain PHP.
  • Flexible: Can handle multiple sheets using a single script.

This script is a simple yet powerful way to make Google Sheets data accessible via a JSON API. Whether you’re building a frontend app, creating dashboards, or exposing APIs, this technique will save you time and effort.

Top comments (0)