API Google Как подключиться для получения значений из электронной таблицы

Я приступил к этому проекту, думая, что это будет просто. Много часов спустя я понимаю, что API Google - это немного лабиринт с несколькими API и библиотеками. Мне действительно нужно прояснить, как это сделать.

Я создал несколько электронных таблиц Google Doc, которые я разрешил другим пользователям редактировать.

Все, что мне нужно - это программно получить информацию из этих электронных таблиц с помощью PHP. Тем не менее, я не могу понять, как подключиться, даже начать поиск.

Вот что я сделал до сих пор:

1 - Установлены библиотеки API Google PHP.

2 - Создал проект API Google в той же учетной записи. Я не знаю, какой API мне нужен и какие ключи oAuth мне нужны.

3 - Установлен клиент электронной почты Google API из https://github.com/asimlqt/php-google-spreadsheet-client.

Ну, а теперь что? Как отправить команду API для получения таблицы, которую я хочу. Я не уверен, как аутентифицироваться и как получить. До сих пор я попробовал следующее, используя ключ API-сервера для Google Диска... это было просто предположение. Я скопировал и вставил нижеприведенный пример из клиента Google API Spreadsheet:

<?php
require_once 'php-google-spreadsheet-client-master\src\Google\Spreadsheet\Autoloader.php';

$accessToken = 'xxxxxxxxxxxxxxxxxxxxxxx';
$request = new Google\Spreadsheet\Request($accessToken);
$serviceRequest = new Google\Spreadsheet\DefaultServiceRequest($request);
Google\Spreadsheet\ServiceRequestFactory::setInstance($serviceRequest);


$spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
$spreadsheetFeed = $spreadsheetService->getSpreadsheets();
?>

Я получаю следующую ошибку:

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\php\php-google-spreadsheet-client-master\src\Google\Spreadsheet\SpreadsheetFeed.php:43 Stack trace: #0 C:\php\php-google-spreadsheet-client-master\src\Google\Spreadsheet\SpreadsheetFeed.php(43): SimpleXMLElement->__construct('') #1 C:\php\php-google-spreadsheet-client-master\src\Google\Spreadsheet\SpreadsheetService.php(39): Google\Spreadsheet\SpreadsheetFeed->__construct(false) #2 C:\php\google_docd.php(11): Google\Spreadsheet\SpreadsheetService->getSpreadsheets() #3 {main} thrown in C:\php\php-google-spreadsheet-client-master\src\Google\Spreadsheet\SpreadsheetFeed.php on line 43  

Пожалуйста, пожалуйста. Очистить инструкции. Я полный новичок в API Google. Благодарю. Примеры того, как тестировать в SOAPUI или через bash, также будут полезны, поскольку я могу использовать это, чтобы выяснить, как выдавать запрос Curl. Большое спасибо!

Ответы

Ответ 1

Я, наконец, получил его работу, несмотря на все попытки из документов сделать его похожим на невозможное, вот моя настройка:

Вам нужно будет создать учетные данные в консоли API: https://console.developers.google.com/ Там вам нужно сначала создать проект и создать набор аутентифицированной информации для вашего приложения: в левом меню выберите API и Auth, затем учетные данные. Нажмите "Создать новый идентификатор клиента" (красная кнопка), затем выберите "Учетная запись службы". Вы загрузите файл, сохраните его в безопасности. вы загрузите его с помощью script.

Кроме того, обратите внимание: он никогда не работал, если: мой документ был "старой таблицей". Мне также нужно было разделить документ электронной таблицы с идентификатором пользователя (тем, который может быть почтовым ящиком), сгенерированным на консоли Google. Документ содержит верхнюю строку, которая была заморожена с соответствующим именем столбца (имя, возраст).

Вот php script, который я использовал в сочетании с приведенным выше:

<?php
require_once 'php-google-spreadsheet/src/Google/Spreadsheet/Autoloader.php';
require_once 'google-api-php-client/src/Google_Client.php';

const G_CLIENT_ID       = 'fill_with_info_from_console.apps.googleusercontent.com';
const G_CLIENT_EMAIL    = '[email protected]';
const G_CLIENT_KEY_PATH = 'key/keep_the_complex_filename_here_privatekey.p12';
const G_CLIENT_KEY_PW   = 'notasecret';

$obj_client_auth  = new Google_Client ();
$obj_client_auth -> setApplicationName ('test_or_whatever_you_like');
$obj_client_auth -> setClientId (G_CLIENT_ID);
$obj_client_auth -> setAssertionCredentials (new Google_AssertionCredentials (
    G_CLIENT_EMAIL, 
    array('https://spreadsheets.google.com/feeds','https://docs.google.com/feeds'), 
    file_get_contents (G_CLIENT_KEY_PATH), 
    G_CLIENT_KEY_PW
));
$obj_client_auth -> getAuth () -> refreshTokenWithAssertion ();
$obj_token  = json_decode ($obj_client_auth -> getAccessToken ());
$accessToken = $obj_token->access_token;

$request = new Google\Spreadsheet\Request($accessToken);
$serviceRequest = new Google\Spreadsheet\DefaultServiceRequest($request);
Google\Spreadsheet\ServiceRequestFactory::setInstance($serviceRequest);
$spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
$spreadsheetFeed = $spreadsheetService->getSpreadsheets();
$spreadsheet = $spreadsheetFeed->getByTitle('title_of_the_spreadsheet_doc');
$worksheetFeed = $spreadsheet->getWorksheets();
$worksheet = $worksheetFeed->getByTitle('title_of_the_tab');
$listFeed = $worksheet->getListFeed();

// this bit below will create a new row, only if you have a frozen first row adequatly labelled

$row = array('name'=>'John', 'age'=>25);
$listFeed->insert($row);

?>

Я также должен отметить:

  • Все это по-прежнему очень много работает, но, надеюсь, поможет кому-то написать удивительные инструкции для любого, чтобы лучше понять nitty gritty

  • Это компиляция битов из документации Google, некоторые ответы на stackoverflow и информация из двух библиотек api

  • Было ужасно больно, чтобы эта работа работала, и это действительно не должно; Я предполагаю, что это связано с тем, что google переводит аутентификацию, интерфейс консоли и версии api в одно и то же время.

  • РЕДАКТИРОВАТЬ: Кажется, что имена столбцов в документе google ограничены: пробел не разрешен (?), недопустимо ли подчеркивание (?), CamelCase кажется неприятным. Мне удалось заставить тире работать, например, в "place-other", иначе api выбрасывает "исключение для исключения"

  • EDIT: я использовал ту же самую настройку для нового проекта и все еще работаю с новой моделью электронных таблиц, представленной Google недавно. Что задерживает меня, что я забыл: пустая ячейка не разрешена, заголовки должны быть заморожены без пробелов, и при запросе с PHP они строчные.

Надеюсь, это поможет!

Ответ 2

Этот ответ должен быть дополнением к ответу jrgd, и я отправляю его здесь, как ответ, потому что он содержит код.

Проблемы с подключением сами меня повесили. Вот что я должен был сделать, чтобы решить эту проблему: Попытка получить доступ к Google. Кроме того, электронная таблица должна использоваться совместно с электронной почтой Google, которую вы найдете в своем коде.

Кроме того, jrgd, чтобы ответить на ваш вопрос об этом объекте Request: он не существует с API Google Spreadsheet;/* Я не мог найти его, когда использовал Composer для загрузки библиотеки */ Вместо этого я закончил работу с GingerDog:

$serviceRequest = new Google\Spreadsheet\DefaultServiceRequest($accessToken); Google\Spreadsheet\ServiceRequestFactory::setInstance($serviceRequest);

Также существует значительная вероятность того, что код генерирует исключение при использовании getSpreadsheets() из-за возвращаемого кода ошибки HTTP, который превышает 300. Класс SpreadsheetService имеет этот метод (вот его код: /** * Fetches a list of spreadhsheet spreadsheets from google drive. * * @return \Google\Spreadsheet\SpreadsheetFeed */ public function getSpreadsheets() { return new SpreadsheetFeed( ServiceRequestFactory::getInstance()->get('feeds/spreadsheets/private/full') ); } Обратите внимание, что существует еще один класс, который выполняет "грязную работу здесь": класс DefaultServiceRequest. Используется get():

/**
     * Perform a get request
     * 
     * @param string $url
     * 
     * @return string
     */
    public function get($url)
    {
        $ch = $this->initRequest($url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
        return $this->execute($ch);
    }
    /**
     * Executes the api request.
     * 
     * @return string the xml response
     *
     * @throws \Google\Spreadsheet\Exception If the was a problem with the request.
     *                                       Will throw an exception if the response
     *                                       code is 300 or greater
     *                                       
     * @throws \Google\Spreadsheet\UnauthorizedException
     */
    protected function execute($ch)
    {
        $ret = curl_exec($ch);

        $info = curl_getinfo($ch);
        $httpCode = (int)$info['http_code'];

        if($httpCode > 299) {
            if($httpCode === 401) {
                throw new UnauthorizedException('Access token is invalid', 401);
            } else {
                throw new Exception('Error in Google Request', $info['http_code']);
            }
        }

        return $ret;
    }

Обратите внимание, что функция из своего внутреннего помощника имеет шанс вернуть http_code, который заставит код генерировать исключение. Нехорошо для бизнеса.

Решение

Как я исправился, чтобы изменить следующую строку кода: $spreadsheetFeed = $spreadsheetService->getSpreadsheets();

для этого цикла while:

/* my way of "making" it work; // I just getSpreadsheets() until there stops being an exception thrown */
    $googleException = new Exception();
    while ($googleException != null)
    {
        try
        {
            $spreadsheetFeed = $spreadsheetService->getSpreadsheets();  # This line randomly throws exception, for some reason. 
            $googleException = null;
        }
        catch (Exception $e)
        {
            $googleException = $e;
        }
    }
    //var_dump($spreadsheetFeed->getArrayCopy());   // test line

Ответ 3

Я написал класс обертки для проверки подлинности и листы ячеек Google Таблиц в моем недавнем проекте. Протестировано с 02 сентября 2015 года, так что оно очень актуально!

Предпосылки:

  • Подготовьте ключи разработчика Google и т.д. (это отличная и обновленная статья о том, как получить ключи API и т.д. - http://konstantinshkut.com/blog/2014/11/01/how_to_get_data_from_google_spreadsheet_in_yii_php_application).
  • Загрузите и установите Composer, необходимые для двух необходимых библиотек google-api-php-client и php-google-spreadsheet-client.
  • Используйте Composer для установки вышеуказанных двух библиотек; это рекомендуемый способ работы библиотек.

Чтобы использовать класс оболочки:

// Initialise Google Sheets instance
$sheets = new GoogleSheets();

$sheets->clientID      = 'YOUR CLIENT ID FROM GOOGLE DEV CONSOLE';
$sheets->clientEmail   = 'YOUR CLIENT EMAIL FROM GOOGLE DEV CONSOLE';
$sheets->clientKeyPath = 'PATH TO THE P12 FILE YOU DOWNLOADED FROM GOOGLE DEV CONSOLE';
$sheets->clientKeyPw   = 'IT IS USUALLY notasecret';

$sheets->appName          = 'WHATEVER NAME YOU WANT';
$sheets->spreadsheetTitle = 'TITLE FOR THE SPREADSHEET YOU WANT TO EDIT';
$sheets->worksheetTitle   = 'WORKSHEET TITLE IN THAT SPREADSHEET';

// Authenticate with Google
$sheets->authenticate();

// Now update the specific row cell
$sheets->updateListEntry(ROW_HEADER, $submissionID, CELL_HEADER, CELL_VALUE);
echo "updated!";

И вот класс оболочки - не стесняйтесь модифицировать его - большая часть кода в значительной степени стандартная, шаблонная. Протестировано!

// Autoload classes thanks to Composer
require_once('vendor/autoload.php');

class GoogleSheets {
  // Instance variables
  public $clientID, $clientEmail, $clientKeyPath, $clientKeyPw, $appName, $spreadsheetTitle, $worksheetTitle;
  private $spreadsheetFeed;

  // connect to Google using OAuth2, boilerplate code...
  public function authenticate() {
    $obj_client_auth  = new Google_Client ();
    $obj_client_auth -> setApplicationName ($this->appName);
    $obj_client_auth -> setClientId ($this->clientID);
    $obj_client_auth -> setAssertionCredentials (new Google_Auth_AssertionCredentials (
        $this->clientEmail, 
        array('https://spreadsheets.google.com/feeds','https://docs.google.com/feeds'), 
        file_get_contents ($this->clientKeyPath), 
        $this->clientKeyPw
    ));
    $obj_client_auth -> getAuth () -> refreshTokenWithAssertion ();
    $obj_token  = json_decode ($obj_client_auth -> getAccessToken ());
    $accessToken = $obj_token->access_token;

    $serviceRequest = new Google\Spreadsheet\DefaultServiceRequest($accessToken);
    Google\Spreadsheet\ServiceRequestFactory::setInstance($serviceRequest);
    $spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
    $this->spreadsheetFeed = $spreadsheetService->getSpreadsheets();
}

// Find matching row with header $field and cell value $value, and update cell with header $cellHeader to $cellValue
public function updateListEntry($field, $value, $cellHeader, $cellValue) {
    // Get the required spreadsheet, then worksheet by title
    $spreadsheet = $this->spreadsheetFeed->getByTitle($this->spreadsheetTitle);
    $worksheetFeed = $spreadsheet->getWorksheets();
    $worksheet = $worksheetFeed->getByTitle($this->worksheetTitle);

    // sq stands for structured query
    $listFeed = $worksheet->getListFeed(array("sq" => $field . " = " . $value));
    $entries = $listFeed->getEntries();
    $listEntry = $entries[0];

    $values = $listEntry->getValues();
    $values[$cellHeader] = $cellValue;
    $listEntry->update($values);
}

}