Python connect Google sheets by Google API
Tags: python
Published: 2021-10-03 13:35:35

อันเนื่องมาจาก ผมต้องการ Implement service สักตัวโดยที่ไม่ต้องมี Database หรือ Web server มันไม่ใช้เรื่องความมันหรือว่าอะไรหรอกครับแต่มันเป็นงานที่เรียนมิใช่งานบริษัท จึงทำให้เกิดเรื่องราวนี้ขึ้นมา 55555+

###Create Google sheets
จากที่รองไปหาข้อมูลมาจาก Google นะครับ เราจะต้องเริ่มจากการสร้าง Google sheets ใน Google drive ก่อนเลย

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bxhzh3jfcokr79h72n1p.png)

และต้องอย่าลืมกำหนดชื่อของ google sheets ด้วยนะครับ ^^

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3prvyk1rkcgndhn3ykjc.png)

เอาให้มันชัดๆไปเลย 

###Config Google Service Account
โดยเราจะต้องไปที่ [developer console](https://console.developers.google.com/) โดยจะต้องเข้าใช้งานผ่าน google account ของเราน้นเอง

**- Create google project**
ทำการสร้าง project ของเราหรือถ้าเรามี project ในนี้อยู่แล้วก็สามารถเอามาใช้ได้นะครับ โดยส่วนตัวผมจะทำการสร้าง project เพื่อที่จะง่ายในการ manage และควบคุม permission ต่างๆได้ง่าย

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pr1lrtbi6g2u5e40prvd.png)

**- Enable Google service**
เราจะทำการ enable Google Sheets API และ Google Drive API สำหรับ project ของเรา

Google Sheets API จะใช้สำหรับกำหนด permission สำหรับการจัดการข้อมูลภายใน google sheets ของเรา
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/26fs7nt0tbbmv0jepshy.png)

Google Drive API ใช้สำหรับการ access resource ต่างๆภายใน google drive

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/05ek0dkhsv09nbrkzna0.png)

**- Create credentials**
ทำการกดปุ่ม ``+ CREATE CREDENTIALS`` และทำการเลือก ``Service account`` 

กรอกข้อมูล Service account

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6n9qrpdhq3zo15rub6jn.png)

ทำการ grant permission สำหรับ project
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z9pgpwz2tmm9a6gvlzkg.png)

หลังจากนั้นเราก็จะได้ service account เพื่อนำไปใช้งานต่อไปครับ
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqkjl4xhr37qu0xm1pdd.png)

**- Download credential**

เลือก service account ที่เราได้ทำการสร้างขึ้นและเลือกไปที่ ``tabs KEY`` จากนั้นให้ทำการกดไปที่ปุ่ม ``ADD KEY`` และเลือก ``Create new key``

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/inhk6g1sdvg2a0vdfrmw.png)

ทำการเลือก Key type เป็น ``json`` และทำการกดปุ่ม ``create``

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ntfmplu37e8q95r9r7v.png)

หลังจากนั้นเราก็จะได้ไฟล์ key เพื่อเอาไปใช้ใน project ของเรา
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/97pet698fev3965qel4t.png)

**- setup google sheets permission**
ทำการเปิด file ที่เราได้ทำการ download มา และทำการ copy ``client_email``  
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lko7kn8k70pj9aswvd6r.png)

ไป google sheets ของเราและทำการกำหนด email ที่ได้จาก ``client_email``
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fmth5kvokfnpt3br5ahx.png)


###Python connect to google sheet
ในส่วนนี้ผมอาจจะขออธิบาย source code แค่นิดหน่อยก่อนนะครับ แล้วถ้า project ของผมเรียบร้อยจะขอมาให้ข้อมูลเพิ่มเติมครับ


**Project Layouts**
```
pans_apis
  |-- /repository
        |-- food_repository.py
  |-- credential_file.json
```
``repository`` จะทำหน้าที่ในการเก็บส่วนในการเชื่อมต่อฐานข้อมูลซึ่งตอนนี้ผมมองว่า google sheets ของผมนั้นก็คือฐานข้อมูลนั้นเองครับ โดยใน folder จะมี ``food_repository.py`` โดยในส่วนนนี้จะเป็นส่วนที่ใช้ในการเชื่อมต่อกับ google sheet ของเรา

``credential_file.json`` จะทำหน้าที่เก็บข้อมูล credential ที่เราได้ทำการ Download มากจาก google console ในตัวอย่างด้านบนครับ

และด้านล่างนี้คือตัวอย่าง code ที่ผมใช้ครับ 
```
import gspread
import pandas as pd
from oauth2client.service_account import ServiceAccountCredentials

from pprint import pprint


# define the scope
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credential = ServiceAccountCredentials.from_json_keyfile_name("credential_file.json",scope)

# authorize the clientsheet 
client = gspread.authorize(credential)

sheet = client.open('api-database')
sheet_instance = sheet.worksheet("Table_Food_In_Ref") 

# get all the records of the data
records_data = sheet_instance.get_all_records()
# convert the json to dataframe
records_df = pd.DataFrame.from_dict(records_data)

# view the top records
print(records_df.head())

```

โดยจะมีจุดที่สำคัญก็คือในส่วนของการ เรียกใช้งาน credential

```
credential = ServiceAccountCredentials.from_json_keyfile_name("credential_file.json",scope)
```

และก็จะมีการระบุ google sheet name ``api-database`` และ sheet ``Table_Food_In_Ref`` 
```
sheet = client.open('api-database')
sheet_instance = sheet.worksheet("Table_Food_In_Ref") 
```

โดยในส่วนของการเชื่อมต่อ google sheets ผมจะข้อจบไว้ประมาณนี้ก่อนแล้วกันนะครับ แล้วเดียวพบกันในส่วนที่จะทำ flask python มาเชื่อมต่อครับผม


อันนี้เป็นแหล่งข้อมูลที่ผมใช้นะครับ
- https://docs.gspread.org/en/latest/user-guide.html
- https://www.analyticsvidhya.com/blog/2020/07/read-and-update-google-spreadsheets-with-python/

ขอบคุณครับ