[Googel API] API設定教學(Google Sheet|Google OAuth 2.0)

Derek Wu
Aug 26, 2020

--

會用到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試算表

這邊跟大家分享,希望後人可以少走些路!

  1. 啟用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=後面到&前面的一串驗證碼都複製起來,

目前還沒想到好的方法來接 return 的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
更歡迎你在下方留言,我很樂意與你討論聊天或回答問題!

--

--

Derek Wu

B.S. in Math, 4 years Recsys engineer exp, currently pursuing M.S. in Computer Science. 數學系畢業,美國交換學生,四年演算法&系統工程師經驗,開發推薦系統。目前研究生在讀中, Work hard, play hard!