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. Большое спасибо!

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

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

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

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

 <?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 = 'fill_with_info_from_console@developer.gserviceaccount.com'; 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 и информация из 2-х api-библиотек

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

  • EDIT: Кажется, что имена столбцов в документе google ограничены: пробел не разрешен (?), Недопустимо ли подчеркивание (?), CamelCase кажется хлопотным. Мне только удалось заставить тире работать, например, в «place-other», иначе api выбрасывает «исключение Uncaught»,

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

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

Этот ответ должен быть дополнением к ответу 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-loop:

 /* 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 

Я написал класс обертки для проверки подлинности 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); } 

}