web-dev-qa-db-ja.com

GoogleAPIスプレッドシートから値を受け取るために接続する方法

簡単だと思ってこのプロジェクトに着手しました。数時間後、私はGoogleAPIが複数のAPIとライブラリを備えた少し迷路であることに気づきました。私は本当にこれを行う方法について明確な指示をお願いします。

他のユーザーに編集を許可したGoogleドキュメントスプレッドシートをいくつか作成しました。

必要なのは、PHPを使用してこれらのスプレッドシートからプログラムで情報を取得することだけです。しかし、検索を開始するために接続する方法がわかりません。

これが私がこれまでにしたことです:

1-Google PHP APIライブラリをインストールしました。

2-同じアカウントでGoogleAPIプロジェクトを作成しました。どのAPIが必要で、どのoAuthキーが必要か」がわかりません。

3 https://github.com/asimlqt/php-google-spreadsheet-client からGoogleAPIスプレッドシートクライアントをインストールしました。

さて、今何? APIコマンドを送信して、必要なスプレッドシートを取得するにはどうすればよいですか。認証方法と取得方法がわかりません。これまでのところ、Googleドライブ用のAPIサーバーキーを使用して以下を試しました...これは単なる推測でした。 Google APIスプレッドシートクライアントの例から、以下をコピーして貼り付けました。

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

お願いします。明確な指示。私は完全なGoogleAPI初心者です。ありがとう。 SOAPUIまたはbashを介してテストする方法の例も役立ちます。これを使用して、Curlリクエストを発行する方法を理解できるからです。どうもありがとう!

14
user2029890

この回答はjrgdの回答へのアドオンであることが意図されており、コードが含まれているため、回答としてここに投稿します。

接続の問題自体が私を悩ませました。これを解決するために私がしなければならなかったことは次のとおりです: Google accessTokenを取得しようとしています 。また、スプレッドシートは、コード内にあるGoogleが生成した電子メールと共有する必要があります。

また、jrgdは、そのRequestオブジェクトに関する質問に答えます。これは、Google SpreadsheetAPIには存在しません。/*ライブラリをダウンロードするためにComposerを使用したときにそれを見つけることができませんでした* /代わりに、GingerDogが行ったことを実行することになりました:

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

getSpreadsheets()を使用すると、300を超えるHTTPエラーコードが返されるため、コードが例外をスローする可能性も高くなります。 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
_
1
Mike Warren

最近のプロジェクトで、Googleスプレッドシート認証とシートセル編集用のラッパークラスを作成しました。 2015年9月2日の時点で動作がテストされているため、非常に最新です。

前提条件:

  • Google開発者キーなどを準備します(これは、APIキーなどを取得する方法に関する優れた最新の記事です。- http://konstantinshkut.com/blog/2014/11/01/ how_to_get_data_from_google_spreadsheet_in_yii_php_application )。
  • 2つの必要なライブラリgoogle-api-php-clientとphp-google-spreadsheet-clientに必要なComposerをダウンロードしてインストールします。
  • Composerを使用して、上記の2つのライブラリをインストールします。これは、ライブラリを機能させるための推奨される方法です。

ラッパークラスを使用するには:

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

}

1
zrll2