使用 Javascript 的带有 OAuth2.0 的 Google 电子表格 API
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14238935/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Google Spreadsheets API with OAuth2.0 using Javascript
提问by Josh
I'm trying to access a private Google Spreadsheet using Javascript. I have sucessfully authorized with OAuth2.0 and can see a listing of all my Google Drive docs. What I can't seem to do is get into a specific spreadsheet. Code is as follows with the relevant spreadsheet code in the function "retrieveAllFiles". A lot of this is culled from Google tutorials.
我正在尝试使用 Javascript 访问私人 Google 电子表格。我已成功获得 OAuth2.0 授权,并且可以看到我所有 Google Drive 文档的列表。我似乎无法做的是进入特定的电子表格。代码如下,函数“retrieveAllFiles”中的相关电子表格代码如下。其中很多是从 Google 教程中挑选出来的。
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>');
});
}
So to be clear, the end result currently is a listing of all my Google Drive docs, but no console.log for "get data processed". I'm not getting any error messages in the console, so I can't tell what is going on.
需要明确的是,目前的最终结果是我所有 Google Drive 文档的列表,但没有用于“处理数据”的 console.log。我没有在控制台中收到任何错误消息,所以我不知道发生了什么。
Thanks.
谢谢。
回答by Josh
Final solution compiled from a bunch of different sources, hopefully this will help someone.
从一堆不同的来源编译的最终解决方案,希望这会对某人有所帮助。
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);
});
}