且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何阅读PHP中的Google Drive电子表格?

更新时间:2022-10-31 11:20:52

解决方案,如果您不想使用API​​或Google身份验证。


  1. 转到Google云端硬盘中的电子表格。
  2. >
  3. 转至文件 - >在网络上发布

  4. 选择正确的工作表,并确保启用复选框始终更新。

  5. 仍然在同一个框中,您可以获得链接到电子表格的.csv链接。 现在可以像任何Web上的其他csv文件。
    以下是一些示例代码:

      $ spreadsheet_url =https://docs.google.com/spreadsheet/酒馆键= LT; somecode>&安培;单=真安培; GID = 0&安培;输出= CSV; $!
    $ b if(!ini_set('default_socket_timeout',15))echo<! - 无法更改套接字超时 - >; (($ $ = $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $' ))!== FALSE){
    $ spreadsheet_data [] = $ data;
    }
    fclose($ handle);
    }
    else
    die(Problem reading csv);


    All I'm trying to do is read a Google Spreadsheet from a web site. I've read and re-read the Google Drive API docs and everything Google Drive PHP on Stack Overflow and I still can't get to the end zone.

    Here's what I've done :

    1. Been to the Google APIs Console and :
      1. Enabled "Drive API" and "Drive SDK" under 'Services';
      2. Created an OAuth 2.0 client ID under 'API Access'. Under "Client ID for web applications", the console gave me "Client ID", "Email address", "Client secret", "Redirect URIs" and "JavaScript origins";

    2. Downloaded the "Google API PHP Client Library";
    3. Opened the Google Drive document (spreadsheet) and clicked on "Share" to get the document's 'key';
    4. Set up the following code :

    <?php 
    session_start(); 
    require_once 'lib/gapi/Google_Client.php'; 
    require_once 'lib/gapi/contrib/Google_DriveService.php'; 
    
    define( 'GDRIVE_CLIENT_ID', '<API Console - API Access - Client ID>' ); 
    define( 'GDRIVE_CLIENT_SECRET', '<API Console - API Access - Client secret>' ); 
    define( 'GDRIVE_REDIRECT_URIS', '<API Console - API Access - Redirect URIs>' ); 
    
    define( 'GDRIVE_SCOPE_01', 'h t t p s://www.googleapis.com/auth/drive' ); 
    define( 'GDRIVE_SCOPE_02', 'h t t p s://www.googleapis.com/auth/drive.apps.readonly' ); 
    define( 'GDRIVE_SCOPE_03', 'h t t p s://www.googleapis.com/auth/drive.file' ); 
    define( 'GDRIVE_SCOPE_04', 'h t t p s://www.googleapis.com/auth/drive.metadata.readonly' ); 
    define( 'GDRIVE_SCOPE_05', 'h t t p s://www.googleapis.com/auth/drive.readonly' ); 
    define( 'GDRIVE_FILE_KEY', '<'key' given from 'sharing' document>' ); 
    
    $client = new Google_Client(); 
    $client->setClientId( GDRIVE_CLIENT_ID ); 
    $client->setClientSecret( GDRIVE_CLIENT_SECRET ); 
    $client->setRedirectUri( GDRIVE_REDIRECT_URIS ); 
    $client->setScopes( array( GDRIVE_SCOPE_01, GDRIVE_SCOPE_02, GDRIVE_SCOPE_03, GDRIVE_SCOPE_04, GDRIVE_SCOPE_05 ) ); 
    
    try { 
      $file = $service->files->get( GDRIVE_FILE_KEY ); 
      echo "Title: ", $file->getTitle(); 
      echo "Description: ", $file->getDescription(); 
      echo "MIME type: ", $file->getMimeType(); 
    } catch (Exception $e) { 
      echo "An error occurred: ", $e->getMessage(); 
    } 
    ?> 
    

    All runs fine (no errors anyway) until the $service->files->get( GDRIVE_FILE_KEY ) call which triggers the exception:

    An error occurred: Error calling GET https://www.googleapis.com/drive/v2/files: (403) Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.

    What am I doing wrong? I've pulled my hair out (well, what was left).

    There is also a much easier, but less clean solution, if you don't want to bother with the API or Google Authentication.

    1. Go to your Spreadsheet in Google Drive.
    2. Go to files -> Publish on the Web
    3. Select the right worksheet and make sure to enable the checkbox always update.
    4. Still in the same box you can get a .csv Link to your spreadsheet.

    You can now access the contents like any other csv File on the Web. Here is some sample code:

    $spreadsheet_url="https://docs.google.com/spreadsheet/pub?key=<somecode>&single=true&gid=0&output=csv";
    
    if(!ini_set('default_socket_timeout', 15)) echo "<!-- unable to change socket timeout -->";
    
    if (($handle = fopen($spreadsheet_url, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $spreadsheet_data[] = $data;
        }
        fclose($handle);
    }
    else
        die("Problem reading csv");