使用python3访问Google表格上的电子表格

时间:2017-02-27 14:23:59

标签: python google-sheets google-api google-spreadsheet-api google-api-python-client


我试图使用谷歌api(v4)的电子表格阅读个人电子表格。
我在更改电子表格ID,范围名称和范围时,从谷歌提供的示例中复制了代码 无论我做什么(将电子表格公开等),我都会遇到HttpError:找不到404请求的实体。

我的代码:

import httplib2
import os

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly',
        'https://www.googleapis.com/auth/spreadsheets',
        'https://www.googleapis.com/auth/drive',
        'https://www.googleapis.com/auth/drive.readonly']
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'python'

def get_credentials():
    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir,
            'sheets.googleapis.com-python.json')

    store = Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        credentials = tools.run_flow(flow, store, None)
    return credentials

def main():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
            'version=v4')
    service = discovery.build('sheets', 'v4', http = http,
            discoveryServiceUrl = discoveryUrl)
    spreadsheetId = 'ID'
    rangeName = 'RANGE'
    result = service.spreadsheets().values().get(
            spreadsheetId = spreadsheetId, range = rangeName).execute()

2 个答案:

答案 0 :(得分:3)

您尚未设置文件/电子表格ID或有效的单元格范围。你还有很多额外的代码,可能包括比你需要的更多的范围。这是一个较短的一个你可以借用,只是转出一个工作表的内容,只需要RO范围:

from pprint import pprint

from apiclient import discovery
from httplib2 import Http
from oauth2client import file, client, tools

SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly'
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
    creds = tools.run_flow(flow, store)
SHEETS = discovery.build('sheets', 'v4', http=creds.authorize(Http()))

SHEET_ID = 'YOUR_SHEET_DRIVE_FILE_ID'
rows = SHEETS.spreadsheets().values().get(spreadsheetId=SHEET_ID,
    range='Sheet1', fields='values').execute().get('values', [])
pprint(rows)

在你运行它之前(它将在没有修改的情况下在Python 2和3上运行),确保你已经......

如果您仍然遇到任何类型的错误,请将其作为上述OP的更新发布。 FWIW,我已经制作了几个视频,展示了Sheets API的其他用途,以防其他代码示例提供帮助。

(所有较新的视频都将成为this video series的一部分,专注于各种G Suite API。)

答案 1 :(得分:0)

在问题和前面的答案中看到了很多样板代码看似简单的任务我想用pygsheets分享我的食谱。

为了能够从Python脚本访问Google表格API,我已在Google API信息中心注册并选择了Authorizing pygsheets中描述的签名凭据选项。

我已经下载了一个带有Google API凭据的json文件,并将其保存在与我的Python脚本相同的目录中。 json文件包含一个看起来像

的专用电子邮件地址

x-...updater@x...updater.iam.gserviceaccount.com

为了让脚本能够访问我的Google表格,我已经使用json文件中包含的电子邮件地址共享了我的工作表(使用默认设置“可以编辑”)。

然后,访问Google表格的Python代码可能如下所示:

import pygsheets
import pandas as pd

gc = pygsheets.authorize(service_file='service_creds.json')
sh = gc.open('Export Data')
wks_export = sh.worksheet(property='title', value='Export by Month')

# Google worksheet as Pandas dataframe.   
export_df = wks_export.get_as_df()

# Here can be done some local operations on the dataframe.

# Updating the worksheet with the values from the modified dataframe.
wks_export.set_dataframe(export_df, start='A1', fit=True)