2013-01-09 26 views
11

Javascriptを使用して私的なGoogleスプレッドシートにアクセスしようとしています。 OAuth2.0を正常に承認し、Googleドライブのすべてのドキュメントのリストを見ることができます。私ができないように見えるのは、特定のスプレッドシートに入ることです。コードは、関数 "retrieveAllFiles"内の関連するスプレッドシートコードを使用して次のようになります。これはGoogleのチュートリアルから多く抜粋したものです。Javascriptを使用したOAuth2.0のGoogleスプレッドシートAPI

var clientId = 'working'; 
var apiKey = 'working'; 
var scopes = 'https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive https://spreadsheets.google.com/feeds'; 

function handleClientLoad() { 
    console.log('inside handleClientLoad function'); 
    gapi.client.setApiKey(apiKey); 
    window.setTimeout(checkAuth,1); 
} 

function checkAuth() { 
    console.log('inside checkAuth function'); 
    gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: true}, handleAuthResult); 
    console.log('finished checkAuth function'); 
} 

function handleAuthResult(authResult) { 
    console.log('inside handleAuthResult function'); 
    var authButton = document.getElementById('authButton'); 
    authButton.style.display = 'none'; 
    if (authResult && !authResult.error) { 
     //Access token has been succesfully retrieved, requests can be sent to the API. 
     apiCalls(); 
    } else { 
     //No access token could be retrieved, show the button to start the authorization flow. 
     authButton.style.display = 'block'; 
     authButton.onclick = function() { 
      gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false}, handleAuthResult); 
     }; 
    } 
} 

function apiCalls() { 
    console.log('inside apiCalls function'); 
    gapi.client.load('drive', 'v2', function() { 
     retrieveAllFiles(callback); 
    }); 
} 

function retrieveAllFiles(callback) { 
    $.get('http://spreadsheets.google.com/feeds/spreadsheets/private/full', function(data) { 
     console.log('get request processed'); 
     console.log(data); 
    }); 
    console.log('inside retrieveAllFiles function'); 
    var retrievePageOfFiles = function(request, result) { 
     request.execute(function(resp) { 
     result = result.concat(resp.items); 
     var nextPageToken = resp.nextPageToken; 
     if (nextPageToken) { 
      request = gapi.client.drive.files.list({ 
       'pageToken': nextPageToken 
      }); 
      retrievePageOfFiles(request, result); 
     } else { 
      callback(result); 
     } 
     }); 
    } 
    var initialRequest = gapi.client.drive.files.list(); 
    retrievePageOfFiles(initialRequest, []); 
} 

function callback(result) { 
    console.log('all should be loaded at this point'); 
    console.log(result); 
    $('#drive-list').append('<ul class="items"></ul>'); 
    $.map(result, function(v,i){ 
     $('.items').append('<li>' + v.title + ':' + v.id + '</li>'); 
    }); 
} 

だから、明確にするために、最終的な結果は、現在、すべての私のGoogleドライブのドキュメントの一覧ではありませんが、「処理されたデータを取得する」ためのはconsole.log。コンソールにエラーメッセージが表示されないので、何が起こっているのかわかりません。

ありがとうございました。

+0

あなたはSpreadSheetsのclientIDを取得する方法を教えてください。ありがとう! – VladL

+0

[Googleのデベロッパーコンソール](https://console.developers.google.com/project)にアクセスします。新しいプロジェクトを作成するか、既存のプロジェクトにログインします。左側のサイドバーで、 'APIs&auth'の' Credentials'セクションに進みます。それは 'ClientID'と呼ばれるセクションを持っていて、あなたはそこにもっと多くを見つけることができるはずです。 – Josh

答えて

20

さまざまなソースから集められた最終的なソリューションは、うまくいけば、これは誰かを助けるでしょう。

var scopes = 'https://spreadsheets.google.com/feeds'; 
var clientId = 'working'; 
var apiKey = 'working'; 

function handleClientLoad() { 
    console.log('inside handleClientLoad function'); 
    gapi.client.setApiKey(apiKey); 
    window.setTimeout(checkAuth,1); 
} 

function checkAuth() { 
    console.log('inside checkAuth function'); 
    gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: true}, handleAuthResult); 
    console.log('finished checkAuth function'); 
} 

function handleAuthResult(authResult) { 
    console.log('inside handleAuthResult function'); 
    console.log(gapi.auth.getToken()); 
    var authButton = document.getElementById('authButton'); 
    authButton.style.display = 'none'; 
    if (authResult && !authResult.error) { 
     //Access token has been successfully retrieved, requests can be sent to the API. 
     loadClient(); 
    } else { 
     //No access token could be retrieved, show the button to start the authorization flow. 
     authButton.style.display = 'block'; 
     authButton.onclick = function() { 
      gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false}, handleAuthResult); 
     }; 
    } 
} 

function loadClient() { 
    console.log('inside loadClient function'); 
    var token = gapi.auth.getToken().access_token; 
    var urlLocation = ''; //Get this from the URL of your Spreadsheet in the normal interface for Google Drive. 

    //This gives a spitout of ALL spreadsheets that the user has access to. 
    var url = 'https://spreadsheets.google.com/feeds/spreadsheets/private/full?access_token=' + token; 

    //This gives a list of all worksheets inside the Spreadsheet, does not give actual data 
    var url = 'https://spreadsheets.google.com/feeds/worksheets/' + urlLocation + '/private/full?access_token=' + token; 

    //This gives the data in a list view - change the word list to cells to work from a cell view and see https://developers.google.com/google-apps/spreadsheets/#working_with_cell-based_feeds for details 
    var url = 'https://spreadsheets.google.com/feeds/list/' + urlLocation + '/od6/private/full?access_token=' + token; 

    console.log(url); 
    $.get(url, function(data) { 
     console.log(data); 
    }); 
} 
+0

auth_tokenを最初に入れたときに、私は「400 Bad Request」エラーを再び出し始めました。それは悪いワークシートであることが判明した。これは、スプレッドシートのdocs.google.com URLからgid =の値を入力すると機能しました。私はurlLocationの完全なURLを試しませんでした。 APIのドキュメントや他のほとんどの場所では、docs URLのkey = valueを使用しています。したがって、docs.google.com/spreadsheet/ccc?key=blahblah&gid=5の場合は、「https://spreadsheets.google.com/feeds/list/blahblah/」のようにurlLocation = 'blahblah'とworksheetId = 5になります。 +トークン – jla

+1

この例ではかなり遠くになっていますが、クロスドメインのセキュリティ制限が私を止めてしまいます(つまり、「Access Control-Allow-Originのヘッダーはありません」など)このスクリプトを実行してJSが応答データにアクセスできるようにしたのはどこですか? –

関連する問題