72

我想知道您是否可以指出一个使用 python 读取/写入谷歌文档/电子表格的示例。

我确实在这里查看了谷歌文档 API https://developers.google.com/google-apps/spreadsheets/但不确定我是否点击了正确的链接。还有一个例子会有很大帮助。

我想做的是基于不同的列查询电子表格,更像是一个 SQL 查询,然后对数据进行一些下游解析,并将其放入另一个电子表格或 google docs 的文档中。

最好的,-Abhi

4

8 回答 8

106

(2016 年 6 月至 12 月)这里的大多数答案现在已经过时了,因为:1)GData API是上一代 Google API,这就是为什么 @ Josh Brown很难找到旧的 GData Docs API 文档。虽然并非所有 GData API 都已被弃用,所有较新的Google API都不使用Google Data 协议;2) 谷歌发布了一个新的谷歌表格 API(不是 GData)。为了使用新的 API,您需要获取适用于 Python 的 Google APIs 客户端库(与[或适用于 Python 3]一样简单)并使用最新的Sheets API v4+pip install -U google-api-python-clientpip3,它比旧的 API 版本更强大、更灵活。

这是官方文档中的一个代码示例,可帮助您入门。但是,这里有一些更长、更“真实”的使用 API 的示例,您可以从中学习(视频和博客文章):

最新的 Sheets API 提供了旧版本中没有的功能,即让开发人员可以像使用用户界面一样以编程方式访问工作表(创建冻结行、执行单元格格式设置、调整行/列大小、添加数据透视表、创建图表等.),但不像是某个数据库,您可以对其执行搜索并从中获取选定的行。您基本上必须在执行此操作的 API 之上构建一个查询层。一种替代方法是使用Google Charts Visualization API 查询语言,它支持类似 SQL 的查询。您还可以从工作表本身进行查询。请注意,此功能在 v4 API 之前就已存在,并且安全模型已于 2016 年8 月更新. 要了解更多信息,请查看我的 G+ 转发以查看Google 开发人员专家的完整文章。

另请注意,Sheets API 主要用于以编程方式访问上述电子表格操作和功能,但要执行文件访问,例如导入/导出、复制、移动、重命名等,请改用Google Drive API。使用 Drive API 的示例:

(*) - TL;DR:将纯文本文件上传到云端硬盘,导入/转换为 Google Docs 格式,然后将该 Doc 导出为 PDF。上面的帖子使用 Drive API v2;这篇后续帖子描述了将其迁移到 Drive API v3,这是一个结合了“穷人转换器”帖子的开发者视频。

要了解有关如何在 Python 中使用 Google API 的更多信息,请查看我的博客以及我正在制作的各种 Google 开发人员视频(系列 1系列 2 )。

附言。就Google Docs而言,目前没有可用的 REST API,因此以编程方式访问 Doc 的唯一方法是使用Google Apps 脚本(与 Node.js 一样,它是浏览器之外的 JavaScript,但不是在 Node 服务器上运行,这些应用程序在 Google 的云中运行;还可以查看我的介绍视频。)使用 Apps 脚本,您可以构建Docs 应用程序或Docs插件(以及其他东西,如表格和表单)。

2018 年 7 月更新:上述“ps”。不再是真的。G Suite 开发人员团队在 Google Cloud NEXT '18 上预先宣布了新的 Google Docs REST API。有兴趣加入新 API 早期访问计划的开发人员应在https://developers.google.com/docs注册。

2019 年 2 月更新:去年 7 月推出的 Docs API 预览版现已普遍提供给所有人……阅读发布帖子了解更多详细信息。

2019 年 11 月更新:为了使 G Suite 和 GCP API 更加内联,今年早些时候,所有 G Suite 代码示例都与 GCP 的较新(低级非产品)Python 客户端库部分集成。auth 的完成方式类似,但(目前)需要更多代码来管理令牌存储,这意味着storage.json您将使用pickletoken.pickle或您喜欢的任何名称)而不是我们的库管理来存储它们,或者选择您自己的形式持久存储。对于这里的读者,请查看更新的 Python 快速入门示例

于 2016-06-16T20:32:59.080 回答
55

看看GitHub-gspread

我发现它非常易于使用,因为您可以通过

first_col = worksheet.col_values(1)

和一整排

second_row = worksheet.row_values(2)

您可以或多或少轻松地构建一些基本...选择... = ...

于 2012-04-07T16:35:49.433 回答
28

我知道这个线程现在已经过时了,但是这里有一些关于 Google Docs API 的不错的文档。它很难找到,但很有用,所以也许它会对你有所帮助。http://pythonhosted.org/gdata/docs/api.html

我最近在一个项目中使用 gspread 来绘制员工时间数据。我不知道它对你有多大帮助,但这里有一个代码链接:https ://github.com/lightcastle/employee-timecards

Gspread 让我的工作变得非常简单。我还能够添加逻辑来检查各种条件以创建本月至今和年初至今的结果。但我只是导入了整个 dang 电子表格并从那里解析它,所以我不能 100% 确定它是否正是您正在寻找的。祝你好运。

于 2013-03-01T16:55:14.110 回答
10

看看 api v4 - pygsheets的 gspread 端口。它应该很容易使用,而不是谷歌客户端。

示例示例

import pygsheets

gc = pygsheets.authorize()

# Open spreadsheet and then workseet
sh = gc.open('my new ssheet')
wks = sh.sheet1

# Update a cell with value (just to let him know values is updated ;) )
wks.update_cell('A1', "Hey yank this numpy array")

# update the sheet with array
wks.update_cells('A2', my_nparray.to_list())

# share the sheet with your friend
sh.share("myFriend@gmail.com")

请参阅此处的文档。

作者在这里。

于 2017-02-20T20:22:27.010 回答
9

最新的 google api 文档记录了如何使用 python 写入电子表格,但导航到它有点困难。这是一个链接到如何附加的示例

以下代码是我第一次成功尝试附加到谷歌电子表格。

import httplib2
import os

from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

# If modifying these scopes, delete your previously saved credentials
# at ~/.credentials/sheets.googleapis.com-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Sheets API Python Quickstart'


def get_credentials():
    """Gets valid user credentials from storage.

    If nothing has been stored, or if the stored credentials are invalid,
    the OAuth2 flow is completed to obtain the new credentials.

    Returns:
        Credentials, the obtained credential.
    """
    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,
                                   'mail_to_g_app.json')

    store = oauth2client.file.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
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Needed only for compatibility with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials

def add_todo():
    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 = 'PUT YOUR SPREADSHEET ID HERE'
    rangeName = 'A1:A'

    # https://developers.google.com/sheets/guides/values#appending_values
    values = {'values':[['Hello Saturn',],]}
    result = service.spreadsheets().values().append(
        spreadsheetId=spreadsheetId, range=rangeName,
        valueInputOption='RAW',
        body=values).execute()

if __name__ == '__main__':
    add_todo()
于 2016-09-13T04:13:41.413 回答
3

你可以看看Sheetfu。以下是自述文件中的一个示例。它提供了一种超级简单的语法来与电子表格进行交互,就好像它是一个数据库表一样。

from sheetfu import Table

spreadsheet = SpreadsheetApp('path/to/secret.json').open_by_id('<insert spreadsheet id here>')
data_range = spreadsheet.get_sheet_by_name('people').get_data_range()

table = Table(data_range, backgrounds=True)

for item in table:
    if item.get_field_value('name') == 'foo':
        item.set_field_value('surname', 'bar')              # this set the surname field value
    age = item.get_field_value('age')
    item.set_field_value('age', age + 1)
    item.set_field_background('age', '#ff0000')             # this set the field 'age' to red color

# Every set functions are batched for speed performance.
# To send the batch update of every set requests you made,
# you need to commit the table object as follow.
table.commit()

免责声明:我是这个库的作者。

于 2018-12-03T08:33:32.863 回答
0

这个线程似乎很老了。如果有人还在寻找,这里提到的步骤:https ://github.com/burnash/gspread工作得很好。

import gspread
from oauth2client.service_account import ServiceAccountCredentials
import os

os.chdir(r'your_path')

scope = ['https://spreadsheets.google.com/feeds',
     'https://www.googleapis.com/auth/drive']

creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
gc = gspread.authorize(creds)
wks = gc.open("Trial_Sheet").sheet1
wks.update_acell('H3', "I'm here!")

确保将凭据 json 文件放在当前目录中。将其重命名为 client_secret.json。

如果您没有使用当前凭据启用 Google Sheet API,您可能会遇到错误。

于 2019-06-11T05:46:54.060 回答
-2

我认为您正在查看该 API 文档页面中基于单元格的提要部分。然后,您可以在 Python 脚本中使用 PUT/GET 请求,使用commands.getstatusoutputsubprocess

于 2012-03-13T20:46:02.163 回答