如何在 JavaScript 中使用 Google Picker 下载 Google Sheet?

贵族提升

我正在尝试在我的网站上用 JavaScript 实现 Google Picker 和 Google Drive API。目前,我使用 PHP 脚本来获取 Google Drive 文档,但它使用的是受限范围,我想从我的应用程序中删除受限范围。

首先,我让Google Picker 快速入门代码正常工作我尝试使用在 Google Picker 代码中获取的访问令牌添加Google Drive getGoogle Drive 代码出现在 client.js 中,对吗?api.js 中使用的访问令牌是否与 client.js 中使用的访问令牌兼容?

我找到了六年前的旧 Gist,并尝试对其进行集成和更新。这是我现在的代码。gapi.client.drive.files.get未能得到该文件。

// Scope to use to access user's photos.
var scope = 'https://www.googleapis.com/auth/drive.file';

var pickerApiLoaded = false;
var driveApiLoaded = false;
var oauthToken;

// Use the API Loader script to load google.picker and gapi.auth.
function onApiLoad() {
    gapi.load('auth2', onAuthApiLoad);
    gapi.load('picker', onPickerApiLoad);
}

function onClientLoad() {
    gapi.client.setApiKey(developerKey);
    gapi.client.load('drive', 'v2', onDriveApiLoad);
}

function onAuthApiLoad() {
    var authBtn = document.getElementById('auth');
    authBtn.disabled = false;
    authBtn.addEventListener('click', function() {
        gapi.auth2.init({ client_id: clientId }).then(function(googleAuth) {
            googleAuth.signIn({ scope: scope }).then(function(result) {
                handleAuthResult(result.getAuthResponse());
            })
        })
    });
}

function onPickerApiLoad() {
    pickerApiLoaded = true;
    createPicker();
}

function onDriveApiLoad() {
    driveApiLoaded = true;
}

function handleAuthResult(authResult) {
    if (authResult && !authResult.error) {
        oauthToken = authResult.access_token;
        createPicker();
    }
}

// Create and render a Picker object for picking user Photos.
function createPicker() {
    if (pickerApiLoaded && oauthToken) {
        var view = new google.picker.DocsView(google.picker.ViewId.SPREADSHEETS);
        //view.setMimeTypes("text/csv");
        //view.setMode(google.picker.DocsViewMode.LIST);
        view.setQuery(jQuery('[updateparam="name"]').val());

        var picker = new google.picker.PickerBuilder().
                //addView(google.picker.ViewId.DOCS).
                addView(view).
                setInitialView(view).
                setOAuthToken(oauthToken).
                setDeveloperKey(developerKey).
                setCallback(pickerCallback).
                build();
        picker.setVisible(true);
    }
}

// A simple callback implementation.
function pickerCallback(data) {
    if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED) {
        var doc = data[google.picker.Response.DOCUMENTS][0];
        var fileId = doc[google.picker.Document.ID];
        jQuery('[updateparam="googleDriveFileId"]').val(fileId);

        //if (driveApiLoaded) {
            var request = gapi.client.drive.files.get({
                'fileId': fileId
            });
            request.execute(function(file) {
                var xhr = new XMLHttpRequest();
                xhr.open('GET', file.downloadUrl);
                xhr.setRequestHeader('Authorization', 'Bearer ' + oauthToken);
                xhr.onload = function() {
                    console.log(xhr.responseText);
                };
                xhr.onerror = function() {
                    warningMessage.displayMessage('Failed to download Google Drive document ' + fileId);
                };          
            });
        //} else {
        //  warningMessage.displayMessage('Google Drive API has not been loaded.');
        //}
    }
    // Triggers before Picker is shown
    // else {
    //  warningMessage.displayMessage('No Google Drive document selected.');
    //}
}

还有我的脚本标签:

<!-- The Google API Loader script. -->
<script type="text/javascript" src="https://apis.google.com/js/api.js?onload=onApiLoad"></script>
<script type="text/javascript" src="https://www.google.com/jsapi?key=KEY"></script>
<script type="text/javascript" src="https://apis.google.com/js/client.js?onload=onClientLoad"></script>
贵族提升

通过反复试验,我发现为了同时加载Google Picker(client:auth2)和Google Drive API(gapi.client),必须先用回调初始化Google Picker,然后再初始化Google Drive API带有必须链接的 Promise。如果 Promise 没有被链接,那么它将无法解析并且无法工作。

// Use the Google API Loader script to load the google.picker script.
function loadPicker() {
    gapi.load('auth', {'callback': onAuthApiLoad});
    gapi.load('picker', {'callback': onPickerApiLoad});
}

function onAuthApiLoad() {
    driveApiLoaded = true;
}

function onPickerApiLoad() {
    pickerApiLoaded = true;
}

function askForClientAuthorization() {
    gapi.load('client:auth2', function(_) {
        window.gapi.client.init({
            apiKey: developerKey,
            clientId: clientId,
            discoveryDocs: ["https://www.googleapis.com/discovery/v1/apis/drive/v3/rest"],
            scope: 'https://www.googleapis.com/auth/drive.file'
        })
        .then(function(__) {
            return gapi.client.drive.files.export({
                'fileId': window.googleDriveFileId,
                'mimeType': 'text/csv'
            })
            .then(function(file) {
                // Client is authorized to access this file, do something with the file
            })
            .catch(function(e) {
                gapi.auth.authorize(
                {
                    'client_id': clientId,
                    'scope': scope,
                    'immediate': false
                },
                handleAuthResult);
            });

        })
    })
}

function handleAuthResult(authResult) {
    if (authResult && !authResult.error) {
        oauthToken = authResult.access_token;
        createPicker();
        return true;
    } else {
        return false;
    }
}

// Create and render a Picker object for searching images.
function createPicker() {
    if (pickerApiLoaded && oauthToken) {
        var view = new google.picker.DocsView(google.picker.ViewId.SPREADSHEETS);
        view.setMode(google.picker.DocsViewMode.LIST);
        view.setQuery(window.dataFeedName);
        var picker = new google.picker.PickerBuilder()
                .setAppId(appId)
                .setOAuthToken(oauthToken)
                .addView(view)
                .setDeveloperKey(developerKey)
                .setCallback(pickerCallback)
                .build();
         picker.setVisible(true);
         return picker;
    }
}

// A simple callback implementation.
function pickerCallback(data) {
    if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED) {
        // Do work
    }
}

使用此代码,它必须检查用户是否有权进行每次执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Google Picker从Google云端硬盘下载文件

如何在google colab中使用python selenium下载pdf

如何使用google sheet api v4 javascript删除google sheet中的空白行?

如何使用 NodeJs 将 JavaScript 对象导出到 Google Sheet

使用VBA从Excel Sheet下载Google云端硬盘文件

如何从Google Picker v3中以“ id”从Google Photo下载原始图像

如何在nodejs中使用google sheet api v4附加行

如何在 Google Sheet Query 中使用 select * all 添加额外的自定义列

如何在 Javascript 中使用 Google Sheets API 获取 sheetId?

如何在Google图表中使用JavaScript全局变量

如何在Google表格图表中使用JavaScript数组?

如何在JavaScript(Google Chart)中使用Angular JS数据?

如何在Google Apps脚本中使用网址下载文件

如何在Django项目中使用下载的字体而不是Google字体API

如何在 PHP 中使用任何类型的 API 或 Google Drive API 获取 Google Sheet 的最后更新时间

在Google Sheet中使用Regex解析JSON

使用Google Picker API后尝试下载文件时出现错误401

为什么我在 javascript 中使用的数组不是用于 google sheet 2d 的?

使用 App Script 从 Google Sheet 下载文本文件

使用 JavaScript 從 URL 獲取 Google Sheet ID

无论如何,是否可以通过在节点 js 中使用 google sheet api 或 google drive api 等来删除对已共享用户的 google sheet 访问?

如何使用Google-sheet-apis(Node.js)从Google-sheet获取特定行?

在我的 Google Sheet 中使用 Google Script 从 Google Photos 导入一张 Google 图片

如何在Google Page Speed Insight上下载优化的图像,CSS,JavaScript

如何在Awesomium中使用Google Map?

如何在Google Colab中使用TPU

如何在Google Colab中使用Blender?

如何在Google Colaboratory中使用R?

如何在nuxt中使用Google Recaptcha?