Постановка задачи 💼

Необходимо создать Google-таблицу в Laravel.

Решение

Для работы с таблицами необходимо зарегистрироваться в Google. Затем настроить проект в сервисном аккаунте и установить библиотеку с помощью Composer.

Для генерации таблиц будем использовать библиотеку google-api-php-client


▶ Шаг 1: Создать сервисный аккаунт

● Создать учетку в Google, создать проект.
● Включить для созданного проекта Drive API и Sheets API.
● Создать учётные данные и сохранить закрытый ключ.

Зайти в Google Developers Console

Cоздать проект или использовать существующий.

Ula

Введите имя проекта и нажмите Create project

Ula

В обновленном списке проектов наведите на созданный проект

Ula

И слева будут настройки прав доступа. В секции Owner вы должны увидеть своего пользователя.

Ula

Если пользователя с ролью Владелец нет, то нажмите на Add Principal, внесите свой email с домена gmail.com и выберите группу Currently used - Owner. Сохраните изменения. Тем самым вы создали проект и сами себе выдали права.

Ula

Опять зайдите на страницу Google Developers Console

Выберите на своем проекте меню Settings.

Ula

И справа появится меню. Выберите Service account, а затем Create service accounts.

Ula

Введите название аккаунта и нажмите Create and continue

Ula

Выберите роль Owner и нажмите Continue

Ula


У вас появится созданный сервисный аккаунт. Нажмите в фильтре на email. Ula

В появившемся окне настроек сервисного аккаунта перейдите на вкладку Keys.

Ula

Нажмите на кнопку Add key. Выберите тип ключа “json” и нажмите Сreate. Будет создан и сразу скачан файл с ключами. Сохраните его. Он нам понадобится, чтобы получать доступ к сервисам Google.

Ula

Нажмите на иконку “бутерброд”, слева от надписи Google APIs, выберите пункт APIs and services, и в нем подпункт Enabled APIs and services.

Ula

В открывшемся окне нажмите Enable APIs and services.

Ula

Далее нам необходимо будет подключить Google Drive API и Google Sheets API. Для этого введите в строку поиска “google drive” или “Google Drive API” и кликните на сервисе Google Drive API. Нажмите Enable. Тоже самое повторить с Google Sheets.

Сайт уведомит вас, что API включено и предупредит, что нужно создать учетные данные. Игнорируйте это предупреждение (ведь мы уже создали сервисный аккаунт).

Убедитесь, что наши API подключены. Они должны включиться автоматически, при подключении API. Если подключение не работает, то вы увидете кнопку Enable. Включите его, при необходимости.

В последний раз зайдите на страницу Google Developers Console. Выберите на своем проекте меню Settings. В открывшемся окне выберите Service account, и скопируйте к себе на компьютер email сервисного аккаунта. Он пригодится, чтобы выдавать доступ к таблицам.


▶ Шаг 2: Установите библиотеку google-api-php-client

Первым шагом установим google-api-php с помощью Composer. Откройте свой терминал и перейдите в каталог вашего проекта Laravel. Запустите следующую команду, чтобы установить библиотеку:

composer require google/apiclient:^2.0


▶ Шаг 3: Код

После получения ключа API необходимо добавить его в файл конфигурации проекта Laravel. Для этого нужно открыть файл .env и добавить строки:

GOOGLE_APP_ID=your api id
GOOGLE_CLIENT_ID=your client id
GOOGLE_CLIENT_SECRET=your client secret
GOOGLE_REDIRECT=http://localhost/login/google/callback
GOOGLE_SCOPES="https://www.googleapis.com/auth/docs.readonly"
GOOGLE_APPROVAL_PROMPT="force"
GOOGLE_ACCESS_TYPE="offline"
GOOGLE_CLIENT_EMAIL=your client email
GOOGLE_AUTH_URI=your auth uri
GOOGLE_TOKEN_URI=your token uri

В папке config Laravel приложения добавьте google.php следующий код;

<?php

return [
    'project_id' => env('GOOGLE_APP_ID'),
    'private_key_id' => env('GOOGLE_CLIENT_SECRET'),
    'private_key' => env('GOOGLE_PRIVATE_KEY'),
    'client_email' => env('GOOGLE_CLIENT_EMAIL'),
    'client_id' => env('GOOGLE_CLIENT_ID'),
    'auth_uri' => env('GOOGLE_AUTH_URI'),
    'token_uri' => env('GOOGLE_TOKEN_URI'),
];

Создайте сервис таким образом: app>Services>GoogleService.php, а затем добавьте следующий код;

<?php

namespace App\Services;

use Google_Service_Sheets_BatchUpdateSpreadsheetRequest;
use Google_Service_Sheets_Request;

class GoogleService
{
    protected $client;

    public function __construct()
    {
        $this->client = $this->init();
    }

    public function init(): \Google_Client
    {
        $client = new \Google_Client();

        // Области, к которым будет доступ
        $client->setScopes([
            \Google_Service_Sheets::SPREADSHEETS,
            \Google_Service_Docs::DOCUMENTS
        ]);

        $client->setAuthConfig(config('google'));

        return $client;
    }

    public function getClient(): \Google_Client
    {
        return $this->client;
    }
    
    public function sheet(): \Google_Service_Sheets
    {
        return new \Google_Service_Sheets($this->client);
    }

    public function appendSheetRow(string $sheetId, $values, string $range = 'Лист 1')
    {
        $service = $this->sheet();
        
        $body = new \Google_Service_Sheets_ValueRange([
            'values' => $values,
        ]);

        $params  = [
            'valueInputOption' => 'RAW',
        ];

        $service->spreadsheets_values->append(
            $sheetId,
            $range,
            $body,
            $params,
        );
    }
}

Готовим наши данные, например, в контроллере и вызываем сервис.


// Готовим данные для отображения в таблице
$values = [....];
 
// $sheetId это ID таблицы 
// Получить $sheetId можно из
// google_spreadsheet_url: https://docs.gogle.com/spreadsheets/d/SPREADSHEET_ID
$sheetId = '9KdTaW01c7PURTW4D7QMGgkEexd_UTYi)pUiUIbsmNlY';

// Вызываем сервис
$service = new GoogleService();

// Добавить данные
$service->appendSheetRow($sheetId, $values);