【问题标题】:PERMISSION_DENIED error when accessing public Google Spreadsheet using Google Sheets API v4使用 Google Sheets API v4 访问公共 Google 电子表格时出现 PERMISSION_DENIED 错误
【发布时间】:2018-07-18 13:32:23
【问题描述】:

在我的网络应用程序中,直到今天,我都可以使用以下 HTML/JavaScript 代码访问公共 Google 电子表格:

HTML

<script src="https://apis.google.com/js/client.js?onload=loadSheetsApi"></script>

JavaScript

function loadSheetsApi() {
  gapi.client.setApiKey('<<MY_API_KEY>>');
  var discoveryUrl =
    'https://sheets.googleapis.com/$discovery/rest?version=v4';
  gapi.client.load(discoveryUrl).then(<<MY_FUNCTION>>);
}

即使我没有更改 HTML 或 JavaScript,请求也会返回以下内容

错误信息

{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}

OAuth 不是一个选项,因为我在网站上显示电子表格数据。

非常感谢任何帮助!

【问题讨论】:

标签: google-sheets-api


【解决方案1】:

我昨天遇到了同样的问题,我找到的唯一解决方案是创建一个服务帐户并将提供的电子邮件与文档共享并更改代码以获取数据。在我的情况下,您需要将工作表数据与网络服务器中的某个文件夹同步。如果你需要,我把 python 代码留给你。

import argparse
import sys
import json
import os

from google.oauth2 import service_account
import googleapiclient.discovery

reload(sys)
sys.setdefaultencoding('UTF8')

SCOPES = [
    'https://www.googleapis.com/auth/spreadsheets.readonly',
    'https://www.googleapis.com/auth/spreadsheets',
    'https://www.googleapis.com/auth/drive.readonly',
    'https://www.googleapis.com/auth/drive.file',
    'https://www.googleapis.com/auth/drive'
]

SERVICE_ACCOUNT_FILE = './service.json'

credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES)

service = googleapiclient.discovery.build('sheets', 'v4', credentials=credentials)

def save_file(filename, path, data, header):
    absolute_filename = (path + '/' + filename)
    if not header:
        absolute_filename = path + '/sheets/' + filename
        print "Trying " + absolute_filename
        directory = os.path.dirname(absolute_filename)
        try:
            os.stat(directory)
        except:
            os.makedirs(directory)

        with open(absolute_filename, 'w+') as outfile:
           json.dump(data, outfile)

def get_data(spreadsheet_id, row_range):
    if row_range is None:
        request = service.spreadsheets().get(spreadsheetId=spreadsheet_id)        
    else:
        request = service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=row_range)
    return request.execute()

def download_spreadsheet(args):
    spreadsheet_id = args.spreadsheetId
    output_path = args.outputPath
    head = get_data(spreadsheet_id, None)
    save_file(spreadsheet_id, output_path, head, True)
    detail = head['sheets']
    for sheet in detail:
        if 'GRID' == sheet['properties']['sheetType']:
            sheet_name = sheet['properties']['title']
            row_range = sheet_name + "!A1:AZ10000"
            data = get_data(spreadsheet_id, row_range)
            save_file(sheet_name, output_path, data, True)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Download google sheet from api as JSON')
    parser.add_argument('--spreadsheet-id', metavar='Your SPREADSHEET ID', dest='spreadsheetId', required=True,
                    help='Your Google\'s SpreadSheet Id')
    parser.add_argument('--output-path', metavar='Output directory', dest='outputPath', required=True,
                    help='Output path')
    download_spreadsheet(parser.parse_args())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2011-03-27
    • 2018-10-12
    相关资源
    最近更新 更多