✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Jak zintegrować API Arkuszy Google z PHP

407

W przeszłości pracowałem nad projektem, w którym chcieliśmy dynamicznie zapisywać dane do arkusza kalkulacyjnego Google. Aby to osiągnąć, weszliśmy w interakcję z interfejsem API Arkuszy. Uważam, że jest to interesujący temat do wpisu na blogu. W tym artykule dowiemy się, jak zintegrować interfejs API Arkuszy Google za pomocą PHP. Będziemy wykonywać operacje tworzenia, pisania, dołączania i odczytywania arkuszy kalkulacyjnych za pośrednictwem interfejsu API.

Arkusz kalkulacyjny Google to bezpłatny internetowy pakiet oprogramowania biurowego obsługiwany przez Google. Arkusz kalkulacyjny można wykorzystać do własnych celów w ramach usługi Google Drive.

Jeśli chodzi o strony internetowe, możesz używać arkuszy Google do różnych celów. W arkuszu Google można przechowywać dane kontaktowe użytkownika (telefon i e-mail), szczegóły płatności, rejestracje na wydarzenia, aktywności i wiele więcej. Na stronie możesz chcieć zautomatyzowanego systemu, który wykonuje wszystkie operacje odczytu i zapisu w arkuszach kalkulacyjnych, gdy uruchomi się określona akcja. Można to zrobić za pomocą interfejsu Sheets API.

Zarejestruj aplikację i utwórz poświadczenia

Zamierzam używać OAuth do interakcji z API. OAuth to bezpieczniejszy i zalecany sposób wykonywania operacji interfejsu API. Wykonaj poniższe czynności, które są wymagane do integracji OAuth.

  • Przejdź do Konsoli programisty Google https://console.developers.google.com
  • Utwórz nowy projekt. Alternatywnie możesz również wybrać istniejący projekt.
  • Nadaj nazwę swojemu projektowi. Konsola Google wygeneruje dla niego unikalny identyfikator projektu.
  • Twój projekt pojawi się na górze lewego paska bocznego.
  • Kliknij Biblioteka. Zobaczysz listę interfejsów Google API.
  • Włącz interfejs API Arkuszy Google.
  • Kliknij poświadczenia. Wybierz identyfikator klienta Oauth w obszarze Utwórz poświadczenia. Wybierz przycisk radiowy dla aplikacji internetowej.
  • Podaj imię. W obszarze Autoryzowane źródła JavaScript wpisz adres URL swojej domeny. W Autoryzowanych identyfikatorach URI przekierowania dodaj link do adresu URL przekierowania. W moim przypadku przekazałem adres URL http://localhost/google-sheets-api/callback.php
  • Kliknij przycisk Utwórz. W wyskakującym okienku otrzymasz identyfikator klienta i klucz klienta. Skopiuj te dane. Za chwilę będzie nam potrzebny.

Jak zintegrować API Arkuszy Google z PHP

Konfiguracja podstawowa

Jak wspomniano, do wykonywania operacji API użyjemy OAuth. Wymaga wygenerowania tokena dostępu, który pełni rolę identyfikatora Twojego konta. Za pomocą tego tokena dostępu interfejsy API Google sprawdzają, czy przychodzące żądanie jest prawidłowe i autoryzowane.

Token dostępu ma krótką żywotność. Wkrótce wygasają. A po wygaśnięciu nie możemy wykonywać wywołań API, ponieważ Google traktuje żądanie z wygasłym tokenem jako nieautoryzowane żądanie. Aby rozwiązać ten problem, używamy „refresh_token", aby ponownie wygenerować token dostępu w tle. Tak działa OAuth.

Zacznijmy budować przepływ OAuth. Utwórz composer.jsonplik i dodaj w nim poniższe wiersze.

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

Następnie uruchom poniższe polecenie, aby zainstalować te biblioteki.

composer install

Gdy generujemy token dostępu, musi on być przechowywany w bazie danych. Przechowując go, możesz pobrać token w dowolnym momencie i wykonać wywołania API. Uruchom poniższe zapytanie, aby utworzyć tabelę w bazie danych.

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

Teraz utwórz klasę DB, która będzie współdziałać z bazą danych i pobierać, przechowywać i aktualizować informacje o tokenach w tabeli.

klasa-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)");
        }
    }
}

Zastąp symbole zastępcze w powyższym kodzie rzeczywistymi poświadczeniami bazy danych. Tutaj zakładam, że chcesz użyć jednego konta Google. Jeśli zamierzasz korzystać z wielu kont, zmodyfikuj zapytania zgodnie ze swoimi wymaganiami.

Wygeneruj token dostępu

Skończyliśmy z utworzeniem tabeli i instalowaniem bibliotek. Następną rzeczą do zrobienia jest autoryzacja konta Google i przechowywanie tokena dostępu w tabeli „token”.

Utwórz config.phpplik i napisz konfigurację zgodnie z wytycznymi biblioteki HybridAuth.

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 );

Upewnij się, że zdefiniowałeś wartości stałych GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET. Przekaż również adres URL wywołania zwrotnego w powyższym kodzie. Gdy użytkownik zakończy autoryzację, przekieruje do adresu URL wywołania zwrotnego.

Używając callback.phppliku, pobierzemy szczegóły tokena dostępu i zapiszemy go w bazie danych w następujący sposób.

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() ;
}

Na tym etapie przejdź do przeglądarki i uruchom YOUR_DOMAIN_URL/callback.php, przekieruje Cię to na konto Google. Zakończ proces autoryzacji. Po zakończeniu procesu sprawdź tabelę „token”. Powinien był przechowywać informacje o tokenie.

Utwórz arkusz kalkulacyjny za pomocą interfejsu API Arkuszy i PHP

Zapisałeś już token dostępu w swojej tabeli. Oznacza to, że możesz kontynuować dalsze operacje na arkuszach Google swojego konta. Zacznijmy od tworzenia arkusza kalkulacyjnego za pomocą interfejsu Sheets API.

tworzenie-arkusz.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.
        }
    }
}

Ten kod najpierw pobiera szczegóły tokena z bazy danych. Za pomocą tego tokena wywołuje usługę arkuszy Google i tworzy arkusz kalkulacyjny. Wydrukowałem identyfikator utworzonego arkusza kalkulacyjnego.

Jeśli token dostępu wygasł, kod trafia do bloku catch. W bloku catch ponownie generuje token dostępu, aktualizuje go w bazie danych i kontynuuje operację API.

Ten sam kod z niewielkimi zmianami bitowymi będzie używany do innych operacji na arkuszach kalkulacyjnych.

Zapisz dane w arkuszu kalkulacyjnym

Aby wykonać operacje zapisu, musisz przekazać zakres komórek do zapisu. Na przykład chcesz dodać nagłówki Nazwa i E-mail u góry. W takim przypadku twój zakres to „A1:B1″. Oznacza to, że napiszemy odpowiednio nagłówki Nazwa i E-mail w komórkach A1 i B1.

<?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.
        }
    }
}

Tutaj przekazałem identyfikator arkusza kalkulacyjnego do metody. Możesz modyfikować tę funkcję i przekazywać dodatkowe parametry. W poprzednim kodzie zwróciliśmy identyfikator arkusza kalkulacyjnego, którego można użyć w powyższym kodzie. Możesz też uzyskać identyfikator arkusza kalkulacyjnego z adresu URL arkusza. Zobacz zrzut ekranu poniżej.

Jak zintegrować API Arkuszy Google z PHP

Ciąg znaków znajdujący się między „d” i „edit” to identyfikator arkusza kalkulacyjnego Google.

Dołącz dane do Arkusza Google

Jeśli chcesz przechowywać określone informacje w arkuszu Google, musisz dołączyć je do istniejącego arkusza kalkulacyjnego. Mogą wystąpić sytuacje, w których chcesz dołączyć jeden lub więcej wierszy za jednym razem. Użytkownik może przekazać pojedynczy lub wiele elementów tablicy i dołączyć dane do arkusza, jak pokazano poniżej.

<?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.
        }
    }
}

Użyłem zakresu „A1:B1″ i przekazałem 2 oddzielne elementy tablicy. Interfejs Sheets API dołącza te szczegóły po danych tabeli. Pamiętaj, że chociaż przekazujemy „A1:B1″ w zakresie, nie zastąpi to wartości już zapisanych w tych komórkach. Zamiast tego zapisuje dane do następnych dostępnych komórek.

Czytaj dane z Arkusza Google

Napisaliśmy kod do tworzenia arkusza kalkulacyjnego, pisania do arkusza kalkulacyjnego i dołączania danych do arkusza kalkulacyjnego. Na koniec zobaczmy, jak odczytać dane z Arkusza Google.

<?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.
        }
    }
}

Mam nadzieję, że rozumiesz, jak zintegrować interfejs API Arkuszy Google za pomocą PHP. Chciałbym usłyszeć wasze przemyślenia i sugestie w sekcji komentarzy poniżej.

Powiązane artykuły

Źródło nagrywania: artisansweb.net

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów