會用到Google Api 來更新Google Sheet試算表,是因為每天要從Python下載前一天推薦系統成效,複製、貼上到共用的試算表讓同事看真的是太麻煩了,所以決定來研究用Python直接更新Google試算表(嚴格來說是Jupyter Notebook啦)。結果一不小心就繞了很多路,先是發現不能把API的mail加入共用,或是
APIError: {'code': 403, 'message': 'The caller does not have permission', 'status': 'PERMISSION_DENIED'}
或是
oauthlib.oauth2.rfc6749.errors.MismatchingStateError: (mismatching_state) CSRF Warning! State not equal in request and response.
後來發現我的Google帳戶是G Suite公司的所以權限部分需要更多設定,才能用API更新數據。
總而言之,最後還是摸索出自己的一套方式透過Python來更新Google試算表
這邊跟大家分享,希望後人可以少走些路!
- 啟用Google Sheet API
這邊簡述流程:
選擇你的機構底下(如果有的話),建立新專案
=>搜尋 Google Sheet
=>按"啟用"
2. 建立憑證
簡單版的話選服務帳戶,然後把產生的mail在試算表的"共用"加入共同編輯者就可以了。
遇到不能共用,像我一樣,就選擇「OAuth 用戶端 ID」驗證吧。
輸入名稱
選擇 網頁應用程式(web)
新增URI ,如果有自己寫的Call Back請填連結,不然就填http://localhost:8080/
3.下載憑證
建好了之後,可以在總覽頁下載json的憑證,另存為檔名"credentials.json",然後丟到Jupyter專案下的資料夾
4. 來到Python的部分
不囉嗦,直接上code
import json
import pickle
from google.oauth2 import credentials
from requests_oauthlib import OAuth2Session# 載入憑證
with open('credentials.json', 'r') as read_file:
credential = json.load(read_file)
client_id = credential['web']['client_id']
client_secret = credential['web']['client_secret']
authorization_base_url = credential['web']['auth_uri']
token_url = credential['web']['token_uri']
redirect_uri = 'http://localhost:8080/'
scope = ['https://www.googleapis.com/auth/spreadsheets'] #可以編輯# 登入驗證
google = OAuth2Session(client_id, scope=scope, redirect_uri=redirect_uri)
authorization_url, state = google.authorization_url(authorization_base_url,
access_type="offline", prompt="select_account")
print ('請點連結驗證,', authorization_url)# 取得授權碼
redirect_response = input('貼上轉跳後頁面的code參數:')
creds_info = google.fetch_token(token_url, client_secret=client_secret,
code=redirect_response)# 儲存Token
creds = credentials.Credentials(creds_info['access_token']).with_quota_project('請填你的專案名稱')
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
就複製貼上,然後Ctrl+Enter執行
5. 登入
然後會自動轉跳到一個錯誤頁面,把網址的code=後面到&前面的一串驗證碼都複製起來,
在剛剛執行python 輸入,成功的話你就會看到.json檔存在目錄下面了。
讀取Google Sheet內容 & 編輯Google 試算表內容
import pickle
import os.path
from googleapiclient.discovery import build
#載入token
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)# 讀取內容
SAMPLE_SPREADSHEET_ID = '你試算表的ID'
SHEET_NAME = '工作表1'
SAMPLE_RANGE_NAME = SHEET_NAME+'!A1:B2' #表+表格範圍service = build('sheets', 'v4', credentials=creds)
sheet = service.spreadsheets()
result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,
range=SAMPLE_RANGE_NAME).execute()
print(result)# 更新/寫入
SAMPLE_RANGE_NAME = SHEET_NAME+'!A1:B2' #表+表格範圍value_input_option = "USER_ENTERED"
value.value_range_body = {
"majorDimension":"ROWS",
"values":[["A欄第一列","A欄第二列"],["B欄第一列"]]
}request = service.spreadsheets().values().update(spreadsheetId=SAMPLE_SPREADSHEET_ID, range=SAMPLE_RANGE_NAME, valueInputOption=value_input_option, body=value_range_body)
response = request.execute()
print(response)
成功的話 retrun
{'spreadsheetId': '試算表的ID', 'updatedRange': "'工作表1'!A1:B2", 'updatedRows': 2, 'updatedColumns': 2, 'updatedCells': 3}
我繞了好多路,希望大家可以抄捷徑
有遇到任何問題,歡迎留言討論~
如果有讓你看完這篇文,可以幫我拍手 1–10 下
如果覺得這文章對你有幫助,可以幫我拍手 10–30 下
如果覺得想看到更多關於學習筆記的文章,可以幫我拍手 30–50 下
讓我知道也記得 Follow我 DerekWu
更歡迎你在下方留言,我很樂意與你討論聊天或回答問題!