# [筆記] 使用 pygsheets 記錄實驗數據到 google sheet
## 設定 Google Drive API
1. 去 google cloud console 上建一個專案
https://console.cloud.google.com/
2. 接著在專案裡面搜尋 Google Drive API
![](https://i.imgur.com/3iSmb2E.png =x250)
3. 接著啟用它
![](https://i.imgur.com/Rcmi9JM.png =x200)
4. 去憑證 (Credentials) 點選"+建立憑證" 然後,選擇 "服務帳戶"
![](https://i.imgur.com/pF6KZqw.png =500x)
5. 設定完服務帳戶 ID 後可以在下方看到一組服務帳戶ID為首的email帳號
- 去 google sheet 表單中,將該帳號加入共用名單當中
![](https://i.imgur.com/uxTvW9l.png =230x)
6. 接著去服務帳戶的頁面裡面點選"金鑰>新增金鑰>選 json 格式"就會下載一個金鑰 json 檔案
![](https://i.imgur.com/4ZpDY3M.png =500x)
7. 記得還要啟用 google sheet api
![](https://i.imgur.com/JA16PfB.png =500x)
## 安裝與使套件 pysheets
安裝 pysheets
https://github.com/nithinmurali/pygsheets
```
pip install pysheets
```
使用 pysheets 把資料寫入 google sheet
```python
import pygsheets
import pandas as pd
#authorization
gc = pygsheets.authorize(service_file='{這裡放金鑰json的檔案路徑}')
# Create empty dataframe
df = pd.DataFrame()
# Create a column
df['name'] = ['tao1', 'tao2', 'tao3', "tao4"]
df['age'] = [11, 12, 13, 14]
#open the google spreadsheet
sh = gc.open('{這裡寫你的google sheet的名稱}')
#select the first worksheet
wks = sh[0]
#update the first worksheet with df, starting at cell A1 i.e.(0,0)
wks.set_dataframe(df,(0,0))
```
## 表單的基本操作
細節可以查 document
https://pygsheets.readthedocs.io/en/stable/worksheet.html
我紀錄一下我常用的
### update sheet 標單中 A1 那一格的值成 XDD
```python
wks.update_value('A1', 'XDD')
```
### update 整個 row
```python
wks.update_row(4, ['tao3', 18])
```
![](https://i.imgur.com/FaApasB.png =230x)
### 取得表單範圍內的值,例如從 'A1' ~ 'B4'
```python
start = 'A1'
end = 'B4'
res = wks.get_values(start, end)
print(type(res))
res
```
可以看到 output 長這樣
```
<class 'list'>
[['XDD', 'age'], ['tao1', '11'], ['tao2', '12'], ['tao3', '18']]
```
## 在表單裡面新增一個新的 TAB (worksheet)
再複習一次基本的設定與連線到表單 (sheet)
```python
import pygsheets
import pandas as pd
#authorization
gc = pygsheets.authorize(service_file='{這裡放金鑰json的檔案路徑}')
#open the google spreadsheet
sh = gc.open('{這裡寫你的google sheet的名稱}')
```
### 建立新的 TAB
例如建立一個 200 row 的表單,Tab 名稱為 nba_2023
```python
N = 200
sheet_name = "nba_2023"
sh.add_worksheet(sheet_name, rows=N)
```
### 把新的資料 (dataframe) 存進去
使用 property="title" 以及 value="nba" 去找到剛剛建立的 sheet
```python
datas = [["Irving", "Dallas Maverick", "PG"],
["Westbrook", "La Clippers", "PG"],
["Durant", "Phoenix Suns", "SF"],
["Curry", "Golden State Warriors", "PG"],
["Harden", "Philadelphia 76ers", "SG"],
["Jokić", "Denver Nuggets", "C"]]
df_new = pd.DataFrame(columns=['name', 'team', 'position'], data=datas)
ws = sh.worksheet(property="title", value="nba_2023")
ws.set_dataframe(df_new, (0,0))
```
目前結果
![](https://i.imgur.com/WMEgmh9.png =x300)
### 追加新的資料 rows append 到表單的後面
```python
values = [["Dončić", "Dallas Maverick", "SG"],
["Davis", "LA Lakers", "PF"],
["Tatum", "Boston Celtics", "SF"]]
ws = sh.worksheet(property="title", value="nba_2023")
ws.append_table(values=values)
```
結果
![](https://i.imgur.com/iB95y60.png =x300)
再執行一次就會看到這樣
![](https://i.imgur.com/SlNartQ.png =x320)
補充說明: 剛剛我們建立表單時設定 rows=200
當我執行完 append_table 兩次後,共新增了 6 筆資料,
此時表單的大小也會跟著長大,變成 200 + 6 = 206
![](https://i.imgur.com/LrjihJF.png =x230)
報告完畢!