Data Engineering/Python

[Python/GoogleSpreadSheet API] GoogleSpreadSheet 데이터 삽입, 삭제

YSY^ 2023. 9. 16. 18:53

이번 포스팅에서는 googlespreadsheet api를 활용한 데이터 insert, 데이터 제거에 대해 알아봅니다.

 

Api 세팅

def api_setting():
    scope = ['https://www.googleapis.com/auth/spreadsheets'
             ,'https://www.googleapis.com/auth/drive']
    json_file_name = 'asset_management_key.json'
    credentials = ServiceAccountCredentials.from_json_keyfile_name(json_file_name, scope)
    gc = gspread.authorize(credentials)
    creds = None
    creds = service_account.Credentials.from_service_account_file(
        json_file_name, scopes=scope
    )

    service = build(
        serviceName="sheets",
        version="v4",
        credentials=creds,
        cache_discovery=False,
        )
    spreadsheets = service.spreadsheets()

    return spreadsheets

데이터 Setting (Data Frame to List)

  • 먼저 데이터를 리스트 형식으로 만들어줍니다.
  • 보통 pandas dataframe으로 데이터를 만들어 두는데, 이를 리스트 형식으로 변환해야합니다.
  • 또한 컬럼이름이 필요하면 컬럼이름도 리스트 가장 앞부분에 포함시켜주어야 합니다.
  • 또한 데이터를 string처리해주지 않으면 type가 맞지 않아 에러가 날 확률이 높습니다. 어처피 수치형을 문자형으로 변환하더라도 구글스프레드 시트에서 알아서 수치형으로 바꿔 인식해줍니다.
# Null값을 채워줍니다.
df = df.fillna('')
#string처리해주지 않으면 type가 맞지 않아 에러가 날 확률이 높습니다.
df = df.astype(str) 

# 컬럼 이름들과 데이터의 value들을 리스트 형식으로 만들어줍니다.
data_list = [df.columns.values.tolist()] + df.values.tolist()
data_list

Data Insert (데이터 삽입)

  • 데이터를 리스트화 했으면 구글스프레드 시트에 insert해줍니다.
  • values.update() 구문을 활용합니다.
  • cell_range에는 시트 이름을 넣어줍니다. 아래 코드에서 볼 수 있듯이 컬럼 범위도 정해줄 수 있습니다. (EX. A:AZ)
  • ValueInputOption에는 Raw와 USER_ENTERED 중 하나를 선택합니다
    • 관련링크 : https://developers.google.com/sheets/api/reference/rest/v4/ValueInputOption?hl=ko 
    • Raw : 사용자가 입력한 그대로 데이터를 넣어줍니다.
    • USER_ENTERED :  값은 사용자가 UI에 입력한 것처럼 파싱됩니다. 숫자는 숫자로 유지되지만 문자열은 Google Sheets UI를 통해 셀에 텍스트를 입력할 때 적용되는 규칙을 따라 숫자, 날짜 등으로 변환될 수 있습니다.
  • Body에 MajorDimemsion에는 "ROWS"를 세팅합니다
    • ROWS가 보통  일반적으로 생각하는 방식이기 때문입니다.
    • range=A1:B2,majorDimension=ROWS을 요청하면 [[1,2],[3,4]]를 반환
    • range=A1:B2,majorDimension=COLUMNS를 요청하면 [[1,3],[2,4]]를 반환
def insert_data(data_list, spreadsheets,gsheet_id , sheet_name):
    body = {
        "values": data_list,
        "majorDimension": "ROWS",
        }
    cell_range = sheet_name+"!A:AZ"
    spreadsheets.values().update(
            spreadsheetId=gsheet_id,
            range=cell_range,
            valueInputOption="USER_ENTERED",
            body=body,
            ).execute()

Data Clear(삭제)

def clear_data(spreadsheets, gsheet_id, sheet_name):
    spreadsheets.values().clear(
            spreadsheetId=gsheet_id,
            range=sheet_name,
            ).execute()

 

728x90
반응형