如何使用Python访问(读取、写入)Google Sheets电子表格



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

我在这里看了谷歌文档APIhttps://developers.google.com/google-apps/spreadsheets/但不确定我是否命中了正确的链接。举个例子也会有很大帮助。

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

最佳,-Abhi

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

以下是官方文档中的一个代码示例,可以帮助您入门。然而,这里稍微长一点,更多的是";"真实世界";使用API的例子,你可以从中学习(视频和博客文章):

  • 将SQL数据迁移到Sheet-plus代码深入研究文章
  • 使用Sheets API加代码深潜文章格式化文本
  • 从电子表格数据和代码生成幻灯片
  • 表API视频库中的那些和其他

最新的Sheets API提供了旧版本中不可用的功能,即向开发人员提供对Sheet的编程访问,就像您在使用用户界面一样(创建冻结行、执行单元格格式、调整行/列大小、添加数据透视表、创建图表等),但不是像您可以对其执行搜索并从中获取选定行那样。您基本上需要在API之上构建一个查询层来完成这项工作。另一种选择是使用Google图表可视化API查询语言,该语言支持类似SQL的查询。也可以从图纸本身中进行查询。请注意,此功能在v4 API之前就已经存在,并且安全模型已在2016年8月中更新。

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

  • 在Google Drive中列出您的文件并深入研究代码
  • 谷歌硬盘:上传&下载文件加";穷人的纯文本到PDF转换器";代码深潜岗位(*)
  • 仅将Google工作表导出为CSV博客文章

(*)-TL;DR:将纯文本文件上传到Drive,导入/转换为谷歌文档格式,然后将该文档导出为PDF。以上帖子使用驱动器API v2;这篇后续文章描述了将其迁移到Drive API v3,这里有一个开发人员视频,结合了;穷人的转换器";职位。

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

ps。就谷歌文档而言,目前还没有REST API可用,因此以编程方式访问文档的唯一方法是使用谷歌应用程序脚本(与Node.js一样,这些应用程序是浏览器外的JavaScript,但不是在节点服务器上运行,而是在谷歌的云上运行;还可以查看我的介绍视频。),您可以构建一个Docs应用程序或Docs的附加组件(以及其他类似Sheets&Forms的东西)。

更新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客户端库部分集成。身份验证的方式类似,但(目前)需要多一点代码来管理令牌存储,这意味着与我们的库管理storage.json不同,您将使用pickletoken.pickle或您喜欢的任何名称)来存储它们,或者选择您自己的持久存储形式。对于这里的读者,请看一下更新后的Python快速启动示例。

看看GitHub-gspread。

我发现它非常容易使用,因为你可以通过检索整个专栏

first_col = worksheet.col_values(1)

和的一整排

second_row = worksheet.row_values(2)

您可以或多或少地构建一些基本的选择...,其中... = ...很容易。

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

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

Gspread让事情对我来说很容易。我还能够添加逻辑来检查各种条件,以创建月迄今和年迄今的结果。但我只是导入了整个该死的电子表格并从中进行了解析,所以我不能100%确定它是否正是你想要的。祝你好运。

看看api v4-pygheets的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")

请参阅此处的文档。

作者在这里。

最新的谷歌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()

您可以看看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()

免责声明:我是这个图书馆的作者。

这个线程似乎很旧了。如果有人还在看,这里提到的步骤是: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,您可能会遇到错误。

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

相关内容

  • 没有找到相关文章