背景说明
因为项目中需要用到google sheet进行协同开发,我们客户端开发人员从goole sheet上面复制需要用到的数据,然后再手动黏贴到工程文件中,因为工程文件有多个,而且每次版本迭代都需要进行相同的操作,很浪费人力。最近学了下python,就想着怎么能够使用脚本去解决问题,努力了一番,所以就有了这篇简单的分享文章。
思路
想要实现脚本自动化,我们就需要能自动完成两步:1. 自动从google sheet上去获取目标数据 2. 获取到目标数据后,自动写入目标文件。
1. 从google sheet上获取目标数据
google sheet本质上也是一个网站,所以一开始我想着是不是可以才去爬虫的方式进行处理,然而看了下网站源码,简直一脸蒙蔽,要从这上面直接爬取目标数据,对于还没有python入门的我来说,难度有点大,所以果断放弃了。然后就在google上搜索,人海茫茫,总是有志同道合的人在,终于发现原来google sheet早已经开放了接口,供我们去调用。相关链接:google sheet 指南。看了下指南,我开始动手了~
step1
配置python运行环境,安装python包管理工具pip,并安装脚本所需要的库,安装库的命令如下:
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
step 2
因为要使用到google sheet的api,所以我们需要一个google账号来申请权限,并生成相应的配置文件,相关操作在上文的指南链接上面都有进行说明:
打开上文的链接,然后点击蓝色的“ENABLE THE GOOGLE SHEETS API” 按钮,会首先要求你登陆自己的google账号,登陆完成后,下载configuration.json
到脚本工程目录中。
step 3
进行了前期的准备工作,我们就可以开始直接拍代码了~
- 验证权限,代码如下所示
def check_auth():
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPE)
creds = flow.run_local_server()
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
return creds
- 创建sheet对象读取数据
service = build('sheets', 'v4', credentials=creds)
setting = Settings()
spreadsheets_id = setting.SAMPLE_SPREADSHEET_ID
content_range = setting.SAMPLE_RANGE_NAME
sheet = service.spreadsheets()
result = sheet.values().get(spreadsheetId=spreadsheets_id, range=content_range).execute()
values = result.get('values',[])
其中需要特别说明下两个参数:
一个是spreadsheetId
,这个是google sheet网址上的一个ID,网址的结构类似这样子:https://docs.google.com/spreadsheets/d/spreadsheetId/edit?ts=#gid=
,我们可以直接从网址上去获取到这个spreadsheetId
。
另外一个参数range
,它的结构类似这样子表名!B2:G4
,它是用来获取数据的详细位置,第一个部分代表你要读取数据的表, B2:G4,代表B2 到 G4这个矩形中包含的数据:
B2 | B3 | B4 |
---|---|---|
.. | .. | .. |
G2 | G3 | G4 |
2. 写数据到目标文件
读取到我们自己想要的数据后,就可以直接写入到目标文件中了:
with open(file_path, 'a', encoding="utf-8") as file_object:
file_object.write(string)
Done!