...
✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Hur man integrerar Google Sheets API med PHP

28

Tidigare har jag arbetat med ett projekt där vi ville skriva data dynamiskt till Google-kalkylbladet. För att uppnå detta hade vi interagerat med Sheets API. Jag tyckte att det var ett intressant ämne för blogginlägget. Så i den här artikeln studerar vi hur man integrerar Google Sheets API med PHP. Vi kommer att utföra skapa, skriva, lägga till och läsa operationer på kalkylark via API.

Google Spreadsheet är ett gratis webbaserat programvarukontorspaket som underhålls av Google. Man kan använda kalkylbladet för sitt eget syfte inom Google Drive-tjänsten.

När det gäller webbplatser kan du använda Google-ark för olika ändamål. Man kan lagra användarens kontaktinformation (telefon och e-post), betalningsinformation, händelseregistreringar, aktiviteter och mycket mer i Google-bladet. På webbplatsen kanske du vill ha ett automatiserat system som läser allt, skriver operationer på kalkylblad när specifika åtgärder utlöses. Det kan göras via Sheets API.

Registrera en ansökan och skapa referenser

Jag ska använda OAuth för att interagera med API: et. OAuth är ett säkrare och rekommenderat sätt att göra API-operationer. Följ stegen nedan som krävs för OAuth-integration.

  • Gå till Googles utvecklarkonsol https://console.developers.google.com
  • Skapa ett nytt projekt. Alternativt kan du också välja befintligt projekt.
  • Ge ditt projekt ett namn. Google Console genererar unikt projekt-ID för det.
  • Ditt projekt kommer att visas överst till vänster i sidofältet.
  • Klicka på Bibliotek. Du kommer att se en lista över Google API: er.
  • Aktivera Google Sheets API.
  • Klicka på referenser. Välj Oauth-klient-id under Skapa referenser. Välj alternativknappen för webbapplikation.
  • Ge namnet. Under Auktoriserat JavaScript-ursprung anger du din domän-URL. I de auktoriserade omdirigerings-URI: erna lägg till länken till omdirigerings-URL: n. I mitt fall skickade jag webbadressen http: //localhost/google-sheets-api/callback.php
  • Klicka på knappen Skapa. Du får klient-ID och klienthemlighet i popup-fönstret. Kopiera dessa detaljer. Vi behöver det om ett ögonblick.

Hur man integrerar Google Sheets API med PHP

Grundläggande konfiguration

Som sagt kommer vi att använda OAuth för att utföra API-operationer. Det kräver att du genererar en åtkomsttoken som fungerar som en identifierare för ditt konto. Med hjälp av denna åtkomsttoken kontrollerar Google API: er om den inkommande begäran är giltig och auktoriserad.

Åtkomsttoken har kort livslängd. De upphör snart. Och när det har gått ut kan vi inte göra API-samtal eftersom Google behandlar begäran med den utgångna token som en obehörig begäran. För att lösa problemet använder vi ‘refresh_token’ för att återskapa åtkomsttoken i bakgrunden. Så här fungerar OAuth.

Låt oss börja bygga OAuth-flödet. Skapa composer.jsonfilen och lägg till nedanstående rader i den.

{
    "require": {
        "google/apiclient": "2.0",
        "hybridauth/hybridauth": "~3.0"
    }
}

Kör sedan kommandot nedan för installation av dessa bibliotek.

composer install

När vi genererar åtkomsttoken måste den lagras i en databas. Genom att lagra den kan du hämta en token när som helst och göra API-samtalen. Kör frågan nedan för att skapa en tabell i databasen.

CREATE TABLE `token` ( `id` int(11) NOT NULL AUTO_INCREMENT,
 `access_token` text NOT NULL,
 PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Skapa nu en DB-klass som kommer att interagera med databasen och hämtar, lagrar, uppdaterar tokeninformation i tabellen.

klass-db.php

<?php
class DB {
    private $dbHost     = "DB_HOST";
    private $dbUsername = "DB_USERNAME";
    private $dbPassword = "DB_PASSWORD";
    private $dbName     = "DB_NAME";
      
    public function __construct(){
        if(!isset($this->db)){
            // Connect to the database
            $conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName);
            if($conn->connect_error){
                die("Failed to connect with MySQL: ". $conn->connect_error);
            }else{
                $this->db = $conn;
            }
        }
    }
  
    public function is_table_empty() {
        $result = $this->db->query("SELECT id FROM token");
        if($result->num_rows) {
            return false;
        }
  
        return true;
    }
  
    public function get_access_token() {
        $sql = $this->db->query("SELECT access_token FROM token");
        $result = $sql->fetch_assoc();
        return json_decode($result['access_token']);
    }
  
    public function get_refersh_token() {
        $result = $this->get_access_token();
        return $result->refresh_token;
    }
  
    public function update_access_token($token) {
        if($this->is_table_empty()) {
            $this->db->query("INSERT INTO token(access_token) VALUES('$token')");
        } else {
            $this->db->query("UPDATE token SET access_token = '$token' WHERE id = (SELECT id FROM token)");
        }
    }
}

Ersätt platshållarna i ovanstående kod med dina faktiska databasuppgifter. Här antar jag att du vill använda ett enda Google-konto. Om du tänker använda flera konton kan du ändra frågorna enligt dina krav.

Skapa åtkomsttoken

Vi är klara med att skapa en tabell och installera bibliotek. Nästa sak behöver göras är att auktorisera Google-kontot och lagra åtkomsttoken i tabellen "token".

Skapa en config.phpfil och skriv en konfiguration enligt riktlinjerna för HybridAuth-biblioteket.

config.php

<?php
require_once 'vendor/autoload.php';
require_once 'class-db.php';
  
define('GOOGLE_CLIENT_ID', 'PASTE_CLIENT_ID_HERE');
define('GOOGLE_CLIENT_SECRET', 'PASTE_CLIENT_SECRET_HERE');
  
$config = [
    'callback' => 'YOUR_DOMAIN_URL/callback.php',
    'keys'     => [
                    'id' => GOOGLE_CLIENT_ID,
                    'secret' => GOOGLE_CLIENT_SECRET
                ],
    'scope'    => 'https://www.googleapis.com/auth/spreadsheets',
    'authorize_url_parameters' => [
            'approval_prompt' => 'force', // to pass only when you need to acquire a new refresh token.
            'access_type' => 'offline'
    ]
];
  
$adapter = new HybridauthProviderGoogle( $config );

Se till att definiera värdena för konstanterna GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET. Skicka också URL för återuppringning i ovanstående kod. När användaren har slutfört auktoriseringen omdirigeras de till återuppringnings-URL: en.

Med hjälp av callback.phpfilen hämtar vi åtkomsttokeninformation och lagrar den i databasen enligt följande.

callback.php

<?php
require_once 'config.php';
  
try {
    $adapter->authenticate();
    $token = $adapter->getAccessToken();
    $db = new DB();
    if($db->is_table_empty()) {
        $db->update_access_token(json_encode($token));
        echo "Access token inserted successfully.";
    }
}
catch( Exception $e ){
    echo $e->getMessage() ;
}

I det här skedet går du till webbläsaren och kör YOUR_DOMAIN_URL / callback.php, det omdirigerar dig till Google-kontot. Slutför auktoriseringsprocessen. Efter att ha slutfört processen, kontrollera tabellen ‘token’. Det borde ha lagrat tokeninformationen.

Skapa ett kalkylark med Sheets API och PHP

Du har nu lagrat åtkomsttoken i din tabell. Det betyder att du kan fortsätta med ytterligare åtgärder på Google-ark i ditt konto. Låt oss först börja med att skapa kalkylblad med Sheets API.

create-sheet.php

<?php
require_once 'config.php';
 
create_spreadsheet();
 
function create_spreadsheet() {
 
    $client = new Google_Client();
 
    $db = new DB();
 
    $arr_token = (array) $db->get_access_token();
    $accessToken = array(
        'access_token' => $arr_token['access_token'],
        'expires_in' => $arr_token['expires_in'],
    );
 
    $client->setAccessToken($accessToken);
 
    $service = new Google_Service_Sheets($client);
 
    try {
        $spreadsheet = new Google_Service_Sheets_Spreadsheet([
            'properties' => [
                'title' => 'API Sheet'
            ]
        ]);
        $spreadsheet = $service->spreadsheets->create($spreadsheet, [
            'fields' => 'spreadsheetId'
        ]);
        printf("Spreadsheet ID: %sn", $spreadsheet->spreadsheetId);
    } catch(Exception $e) {
        if( 401 == $e->getCode()) {
            $refresh_token = $db->get_refersh_token();
 
            $client = new GuzzleHttpClient(['base_uri' => 'https://accounts.google.com']);
 
            $response = $client->request('POST', '/o/oauth2/token', [
                'form_params' => [
                    "grant_type" => "refresh_token",
                    "refresh_token" => $refresh_token,
                    "client_id" => GOOGLE_CLIENT_ID,
                    "client_secret" => GOOGLE_CLIENT_SECRET,
                ],
            ]);
 
            $data = (array) json_decode($response->getBody());
            $data['refresh_token'] = $refresh_token;
 
            $db->update_access_token(json_encode($data));
 
            create_spreadsheet();
        } else {
            echo $e->getMessage(); //print the error just in case your video is not uploaded.
        }
    }
}

Den här koden får först tokenuppgifterna från DB. Med hjälp av denna token ringer den Googles arktjänst och skapar ett kalkylark. Jag skrev ut ID för ett skapat kalkylark.

Om en åtkomsttoken har löpt ut går koden till fångstblocket. I fångsten blockerar den åtkomsttoken, uppdaterar den i databasen och fortsätter API-åtgärden.

Samma kod med små ändringar kommer att användas för andra operationer på kalkylark.

Skriv data till ett kalkylark

För att utföra skrivoperationerna måste du skicka ett antal celler som ska skrivas. Du vill till exempel lägga till rubriker Namn och E-post högst upp. I så fall blir ditt intervall ‘A1: B1’. Det betyder att vi kommer att skriva namn- och e-postrubriker i A1- respektive B1-celler.

<?php
require_once 'config.php';
 
write_to_sheet('SPREADSHEET_ID');
 
function write_to_sheet($spreadsheetId = '') {
  
    $client = new Google_Client();
  
    $db = new DB();
  
    $arr_token = (array) $db->get_access_token();
    $accessToken = array(
        'access_token' => $arr_token['access_token'],
        'expires_in' => $arr_token['expires_in'],
    );
  
    $client->setAccessToken($accessToken);
  
    $service = new Google_Service_Sheets($client);
  
    try {
        $range = 'A1:B1';
        $values = [
            [
                'Name',
                'Email',
            ],
        ];
        $body = new Google_Service_Sheets_ValueRange([
            'values' => $values
        ]);
        $params = [
            'valueInputOption' => 'USER_ENTERED'
        ];
        $result = $service->spreadsheets_values->update($spreadsheetId, $range, $body, $params);
        printf("%d cells updated.", $result->getUpdatedCells());
    } catch(Exception $e) {
        if( 401 == $e->getCode()) {
            $refresh_token = $db->get_refersh_token();
  
            $client = new GuzzleHttpClient(['base_uri' => 'https://accounts.google.com']);
  
            $response = $client->request('POST', '/o/oauth2/token', [
                'form_params' => [
                    "grant_type" => "refresh_token",
                    "refresh_token" => $refresh_token,
                    "client_id" => GOOGLE_CLIENT_ID,
                    "client_secret" => GOOGLE_CLIENT_SECRET,
                ],
            ]);
  
            $data = (array) json_decode($response->getBody());
            $data['refresh_token'] = $refresh_token;
  
            $db->update_access_token(json_encode($data));
  
            write_to_sheet($spreadsheetId);
        } else {
            echo $e->getMessage(); //print the error just in case your video is not uploaded.
        }
    }
}

Här har jag skickat kalkylbladets ID till metoden. Du kan ändra denna funktion och skicka ytterligare parametrar. I den föregående koden har vi returnerat kalkylbladets ID som kan användas i ovanstående kod. Alternativt kan du hämta kalkylbladets ID från din webbadress. Se skärmdumpen nedan.

Hur man integrerar Google Sheets API med PHP

Strängen som visas mellan ‘d’ och ‘redigera’ är ID för ett Google-kalkylark.

Lägg till data på ett Google-ark

Om du vill lagra specifik information i Google-ark måste du lägga till den i det befintliga kalkylarket. Det kan finnas fall där du vill lägga till en eller flera rader på en gång. Användaren kan skicka de enskilda eller flera matriselementen och lägga till data till arket enligt nedan.

<?php
require_once 'config.php';
 
append_to_sheet('SPREADSHEET_ID');
  
function append_to_sheet($spreadsheetId = '') {
  
    $client = new Google_Client();
  
    $db = new DB();
  
    $arr_token = (array) $db->get_access_token();
    $accessToken = array(
        'access_token' => $arr_token['access_token'],
        'expires_in' => $arr_token['expires_in'],
    );
  
    $client->setAccessToken($accessToken);
  
    $service = new Google_Service_Sheets($client);
  
    try {
        $range = 'A1:B1';
        $values = [
            [
                'John Doe',
                '[email protected]',
            ],
            [
                'Jack Waugh',
                '[email protected]',
            ],
            // Additional rows ...
        ];
        $body = new Google_Service_Sheets_ValueRange([
            'values' => $values
        ]);
        $params = [
            'valueInputOption' => 'USER_ENTERED'
        ];
        $result = $service->spreadsheets_values->append($spreadsheetId, $range, $body, $params);
        printf("%d cells appended.", $result->getUpdates()->getUpdatedCells());
    } catch(Exception $e) {
        if( 401 == $e->getCode()) {
            $refresh_token = $db->get_refersh_token();
  
            $client = new GuzzleHttpClient(['base_uri' => 'https://accounts.google.com']);
  
            $response = $client->request('POST', '/o/oauth2/token', [
                'form_params' => [
                    "grant_type" => "refresh_token",
                    "refresh_token" => $refresh_token,
                    "client_id" => GOOGLE_CLIENT_ID,
                    "client_secret" => GOOGLE_CLIENT_SECRET,
                ],
            ]);
  
            $data = (array) json_decode($response->getBody());
            $data['refresh_token'] = $refresh_token;
  
            $db->update_access_token(json_encode($data));
  
            append_to_sheet($spreadsheetId);
        } else {
            echo $e->getMessage(); //print the error just in case your video is not uploaded.
        }
    }
}

Jag har använt intervallet ‘A1: B1’ och skickat två separata arrayelement. Sheets API bifogar dessa uppgifter efter tabelldata. Observera även om vi skickar ‘A1: B1’ inom intervallet, kommer det inte att ersätta värden som redan är skrivna i dessa celler. Istället skriver den data till nästa tillgängliga celler.

Läs data från ett Google-ark

Vi har skrivit en kod för att skapa ett kalkylark, skriva till ett kalkylark och lägga till data i kalkylarket. Slutligen, låt oss se hur man läser data från ett Google-ark.

<?php
require_once 'config.php';
 
read_sheet('SPREADSHEET_ID');
  
function read_sheet($spreadsheetId = '') {
  
    $client = new Google_Client();
  
    $db = new DB();
  
    $arr_token = (array) $db->get_access_token();
    $accessToken = array(
        'access_token' => $arr_token['access_token'],
        'expires_in' => $arr_token['expires_in'],
    );
  
    $client->setAccessToken($accessToken);
  
    $service = new Google_Service_Sheets($client);
  
    try {
        $range = 'A:B';
        $response = $service->spreadsheets_values->get($spreadsheetId, $range);
        $values = $response->getValues();
 
        if (empty($values)) {
            print "No data found.n";
        } else {
            print "Name, Email:n";
            foreach ($values as $row) {
                // Print columns A and E, which correspond to indices 0 and 4.
                printf("%s, %sn", $row[0], $row[1]);
            }
        }
    } catch(Exception $e) {
        if( 401 == $e->getCode()) {
            $refresh_token = $db->get_refersh_token();
  
            $client = new GuzzleHttpClient(['base_uri' => 'https://accounts.google.com']);
  
            $response = $client->request('POST', '/o/oauth2/token', [
                'form_params' => [
                    "grant_type" => "refresh_token",
                    "refresh_token" => $refresh_token,
                    "client_id" => GOOGLE_CLIENT_ID,
                    "client_secret" => GOOGLE_CLIENT_SECRET,
                ],
            ]);
  
            $data = (array) json_decode($response->getBody());
            $data['refresh_token'] = $refresh_token;
  
            $db->update_access_token(json_encode($data));
  
            read_sheet($spreadsheetId);
        } else {
            echo $e->getMessage(); //print the error just in case your video is not uploaded.
        }
    }
}

Jag hoppas att du förstår hur du integrerar Google Sheets API med PHP. Jag skulle vilja höra dina tankar och förslag i kommentarsektionen nedan.

relaterade artiklar

Inspelningskälla: artisansweb.net

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer