WEB и WordPress новости, темы, плагины. Здесь мы делимся советами и лучшими решениями для сайтов.

Как интегрировать API Google Таблиц с PHP

3 195

В прошлом я работал над проектом, в котором мы хотели динамически записывать данные в электронную таблицу Google. Для этого мы использовали API Таблиц. Я нашел интересную тему для сообщения в блоге. Итак, в этой статье мы изучаем, как интегрировать Google Sheets API с помощью PHP. Мы собираемся выполнять операции создания, записи, добавления и чтения электронных таблиц через API.

Google Spreadsheet – это бесплатный офисный программный пакет на базе Интернета, поддерживаемый Google. Таблицу можно использовать для своих целей в сервисе Google Drive.

Что касается веб-сайтов, вы можете использовать таблицы Google для различных целей. В таблице Google можно хранить контактную информацию (телефон и электронная почта) своего пользователя, платежные реквизиты, регистрации на мероприятия, действия и многое другое. На веб-сайте вам может потребоваться автоматизированная система, которая выполняет все операции чтения и записи в электронных таблицах при срабатывании определенного действия. Это можно сделать через API Таблиц.

Зарегистрируйте приложение и создайте учетные данные

Я собираюсь использовать OAuth для взаимодействия с API. OAuth – более безопасный и рекомендуемый способ выполнения операций API. Выполните следующие действия, необходимые для интеграции OAuth.

  • Перейдите в консоль разработчика Google. https://console.developers.google.com
  • Создайте новый проект. Кроме того, вы также можете выбрать существующий проект.
  • Дайте название вашему проекту. Консоль Google сгенерирует для него уникальный идентификатор проекта.
  • Ваш проект появится в верхней части левой боковой панели.
  • Щелкните Библиотека. Вы увидите список API Google.
  • Включите API Google Таблиц.
  • Нажмите на учетные данные. Выберите Идентификатор клиента Oauth в разделе Создать учетные данные. Выберите переключатель для веб-приложения.
  • Дайте имя. В разделе «Авторизованные источники JavaScript» введите URL-адрес вашего домена. В URI авторизованного перенаправления добавьте ссылку URL перенаправления. В моем случае я передал URL http: //localhost/google-sheets-api/callback.php
  • Нажмите на кнопку «Создать». Во всплывающем окне вы получите идентификатор клиента и секрет клиента. Скопируйте эти данные. Нам это понадобится через минуту.

Как интегрировать API Google Таблиц с PHP

Базовая конфигурация

Как было сказано, мы будем использовать OAuth для выполнения операций API. Это требует, чтобы вы создали токен доступа, который действует как идентификатор для вашей учетной записи. Используя этот токен доступа, API Google проверяют, действителен ли входящий запрос и разрешен ли он.

У токена доступа короткий срок службы. Срок их действия скоро истекает. И после истечения срока действия мы не можем выполнять вызовы API, поскольку Google рассматривает запрос с истекшим токеном как неавторизованный. Чтобы решить эту проблему, мы используем «refresh_token» для регенерации токена доступа в фоновом режиме. Так работает OAuth.

Приступим к построению потока OAuth. Создайте composer.jsonфайл и добавьте в него строки ниже.

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

Затем выполните приведенную ниже команду для установки этих библиотек.

composer install

Когда мы генерируем токен доступа, его необходимо сохранить в базе данных. Сохраняя его, вы можете получить токен в любое время и выполнить вызовы API. Выполните приведенный ниже запрос, чтобы создать таблицу в базе данных.

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

Теперь создайте класс БД, который будет взаимодействовать с базой данных и извлекать, хранить и обновлять информацию о токенах в таблице.

класс-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)");
        }
    }
}

Замените заполнители в приведенном выше коде фактическими учетными данными вашей базы данных. Здесь я предполагаю, что вы хотите использовать одну учетную запись Google. Если вы собираетесь использовать несколько учетных записей, измените запросы в соответствии с вашими требованиями.

Создать токен доступа

Мы закончили создание таблицы и установку библиотек. Следующее, что нужно сделать, это авторизовать учетную запись Google и сохранить токен доступа в таблице «токенов».

Создайте config.phpфайл и запишите конфигурацию в соответствии с рекомендациями библиотеки 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 );

Обязательно укажите значения констант GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET. Кроме того, передайте URL-адрес обратного вызова в приведенном выше коде. Когда пользователь завершит авторизацию, он будет перенаправлен на URL-адрес обратного вызова.

Используя callback.phpфайл, мы получим данные токена доступа и сохраним их в базе данных следующим образом.

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

На этом этапе перейдите в браузер и запустите YOUR_DOMAIN_URL / callback.php, он перенаправит вас в учетную запись Google. Завершите процесс авторизации. После завершения процесса проверьте таблицу «токенов». Он должен был хранить информацию о токене.

Создайте электронную таблицу с помощью Sheets API и PHP

Теперь вы сохранили токен доступа в своей таблице. Это означает, что вы можете продолжить дальнейшие операции с таблицами Google вашей учетной записи. Давайте сначала начнем с создания электронной таблицы с помощью 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.
        }
    }
}

Этот код сначала получает данные токена из БД. Используя этот токен, он вызывает службу таблиц Google и создает электронную таблицу. Я распечатал идентификатор созданной таблицы.

Если срок действия токена доступа истек, код переходит в блок catch. В блоке catch он регенерирует токен доступа, обновляет его в базе данных и продолжает работу API.

Тот же код с небольшими изменениями будет использоваться для других операций с электронными таблицами.

Запись данных в электронную таблицу

Для выполнения операций записи вам необходимо передать диапазон записываемых ячеек. Например, вы хотите добавить заголовки «Имя» и «Электронная почта» вверху. В этом случае ваш диапазон станет «A1: B1». Это означает, что мы будем писать заголовки Name и Email в ячейках A1 и 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.
        }
    }
}

Здесь я передал методу идентификатор электронной таблицы. Вы можете изменить эту функцию и передать дополнительные параметры. В предыдущем коде мы вернули идентификатор электронной таблицы, который можно использовать в приведенном выше коде. Кроме того, вы можете получить идентификатор электронной таблицы из URL-адреса вашей таблицы. Смотрите скриншот ниже.

Как интегрировать API Google Таблиц с PHP

Строка между буквами d и edit – это идентификатор электронной таблицы Google.

Добавить данные в таблицу Google

Если вы хотите сохранить определенную информацию в таблице Google, вам необходимо добавить ее в существующую электронную таблицу. Могут быть случаи, когда вы захотите добавить одну или несколько строк за один раз. Пользователь может передать один или несколько элементов массива и добавить данные на лист, как показано ниже.

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

Я использовал диапазон A1: B1 и передал 2 отдельных элемента массива. API Таблиц добавляет эти сведения после данных таблицы. Имейте в виду, что хотя мы передаем «A1: B1» в диапазоне, он не заменит значения, уже записанные в этих ячейках. Вместо этого он записывает данные в следующие доступные ячейки.

Чтение данных из таблицы Google

Мы написали код для создания электронной таблицы, записи в электронную таблицу и добавления данных в электронную таблицу. Наконец, давайте посмотрим, как читать данные из Google Sheet.

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

Надеюсь, вы понимаете, как интегрировать Google Sheets API с помощью PHP. Я хотел бы услышать ваши мысли и предложения в разделе комментариев ниже.

Статьи по Теме

Источник записи: artisansweb.net

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее