안녕하세요.
오늘은 프로그램 개발을 잘 모르는 Hardware engineer가 AI 언어 모델로 Python을 이용한 프로그램을 만들어 보고자 합니다. 최종 결과물은 나중에 알게 되겠지요..ㅋ
1. 개발 환경
- 사용한 Ai model : Gemini 2.0
- 사용한 프로그램 : Python
나의 질문 (to AI) :
파이썬으로 구글 시트에 연결하여 시트에 있는 셀의 데이터를 읽어오는 코드를 짜고 싶어, 구글 로그인 ID와 구글 시트 주소 정보는 코드에 넣는 자리를 만들어 주고, 구글 로그인 암호는 terminal 창에 입력하는 식으로 만들어줘
AI 답변 :
이 코드를 실행하기 위해서는 gspread 라이브러리와 google-auth-httplib2, google-auth-oauthlib 라이브러리가 필요합니다. 아직 설치하지 않으셨다면 터미널에서 다음 명령어를 사용하여 설치해 주세요.
pip install gspread google-auth-httplib2 google-auth-oauthlib
다음은 코드입니다.
import gspread
from google.oauth2.credentials import Credentials
from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow
import os
import getpass
# --- 여기에 Google Sheets 정보 입력 ---
SPREADSHEET_URL = "YOUR_SPREADSHEET_URL" # 구글 시트 주소
SHEET_NAME = "Sheet1" # 읽어올 시트 이름
CELL_RANGE = "A1" # 읽어올 셀 범위 (예: "A1", "B3", "A1:C5")
GOOGLE_ACCOUNT_EMAIL = "YOUR_GOOGLE_ACCOUNT_EMAIL" # 구글 계정 이메일
# OAuth 2.0 자격 증명 파일 이름 (자동 생성 또는 다운로드)
CREDENTIALS_FILE = 'credentials.json'
def read_google_sheet_cell(spreadsheet_url, sheet_name, cell_range, google_account_email):
"""
Google 계정으로 로그인하여 구글 시트의 특정 셀 또는 범위의 데이터를 읽어옵니다.
Args:
spreadsheet_url (str): 구글 시트 URL.
sheet_name (str): 읽어올 시트 이름.
cell_range (str): 읽어올 셀 범위 (예: "A1", "B3", "A1:C5").
google_account_email (str): 구글 계정 이메일 주소.
Returns:
list or str: 셀 범위가 하나면 문자열, 여러 셀이면 값들의 리스트를 반환합니다.
인증 실패 또는 오류 발생 시 None을 반환합니다.
"""
creds = None
# 이미 저장된 토큰이 있는지 확인
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', ['https://www.googleapis.com/auth/spreadsheets.readonly'])
# 유효한 토큰이 없으면 새로 로그인
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
CREDENTIALS_FILE, ['https://www.googleapis.com/auth/spreadsheets.readonly'])
print(f"다음 URL로 접속하여 인증을 완료해주세요:\n{flow.authorization_url()[0]}")
auth_code = input("인증 코드를 입력하세요: ")
flow.fetch_token(code=auth_code)
creds = flow.credentials
# 다음 실행을 위해 토큰 저장
with open('token.json', 'w') as token:
token.write(creds.to_json())
try:
gc = gspread.authorize(creds)
spreadsheet = gc.open_by_url(spreadsheet_url)
worksheet = spreadsheet.worksheet(sheet_name)
values = worksheet.acell(cell_range).value if ":" not in cell_range else worksheet.get(cell_range)
return values
except Exception as e:
print(f"오류 발생: {e}")
return None
if __name__ == "__main__":
data = read_google_sheet_cell(SPREADSHEET_URL, SHEET_NAME, CELL_RANGE, GOOGLE_ACCOUNT_EMAIL)
if data is not None:
print(f"[{SHEET_NAME}!{CELL_RANGE}]의 데이터: {data}")
코드 사용 방법:
- Google Cloud Platform (GCP) 설정 및 OAuth 2.0 클라이언트 ID 발급 (처음 한 번만):
- Google Cloud Platform 콘솔로 이동합니다.
- 새로운 프로젝트를 만들거나 기존 프로젝트를 선택합니다.
- API 및 서비스 > 사용자 인증 정보로 이동합니다.
- 사용자 인증 정보 만들기 > OAuth 클라이언트 ID를 선택합니다.
- 애플리케이션 유형을 "데스크톱 앱"으로 선택하고 이름을 입력한 후 만들기를 클릭합니다.
- 생성된 OAuth 클라이언트 ID를 다운로드합니다 (JSON 형식). 다운로드한 JSON 파일을 코드와 같은 디렉토리에 저장하고 파일 이름을 credentials.json으로 변경합니다.
- Google Sheets 설정:
- 접근하려는 Google Sheets를 엽니다.
- Google Sheets의 URL을 복사하여 SPREADSHEET_URL 변수에 입력합니다.
- 읽어오려는 시트의 이름을 확인하고 SHEET_NAME 변수에 입력합니다.
- 읽어오려는 셀 또는 셀 범위를 CELL_RANGE 변수에 입력합니다 (예: "A1", "B3", "A1:C5").
- Google 계정 이메일 주소를 GOOGLE_ACCOUNT_EMAIL 변수에 입력합니다.
- 코드 실행:
- 위의 파이썬 코드를 .py 파일로 저장합니다 (예: read_sheet_oauth.py).
- 터미널을 열고 해당 파일이 있는 디렉토리로 이동합니다.
- 처음 실행하는 경우 python read_sheet_oauth.py 명령어를 실행하면 웹 브라우저가 열리면서 Google 계정 로그인을 요청하고, 해당 앱에 Google Sheets 접근 권한을 부여할지 묻는 화면이 나타납니다.
- 권한을 부여하면 인증 코드가 표시됩니다. 이 코드를 터미널에 입력하고 Enter 키를 누릅니다.
- 인증이 완료되면 token.json 파일이 생성되어 다음 실행 시에는 별도의 로그인 과정 없이 저장된 토큰을 사용하여 인증합니다.
- 이후 실행 시에는 python read_sheet_oauth.py 명령어를 바로 실행하면 됩니다.
주의사항:
- 보안: OAuth 2.0 방식을 사용하더라도 Google 계정 자체의 보안에 주의해야 합니다.
- 권한: 코드에서 요청하는 권한(https://www.googleapis.com/auth/spreadsheets.readonly)은 Google Sheets를 읽기만 하는 권한입니다. 필요한 권한 수준을 신중하게 선택하세요.
- credentials.json 파일: 이 파일에는 중요한 정보가 담겨 있으므로 안전하게 관리하고 코드 저장소에 직접 업로드하지 않도록 주의하세요.
- token.json 파일: 이 파일은 인증 정보를 담고 있으므로 .gitignore 등에 추가하여 버전 관리에서 제외하는 것이 좋습니다.
나의 질문
구글 클라우드 플랫폼은 나중에 돈을 내야 해서, 이 방법 아닌 다른 방법으로 알려줘
AI 답변
이해했습니다. Google Cloud Platform (GCP)을 사용하지 않고, 추가 비용 없이 Google Sheets의 데이터를 읽어오는 다른 방법을 알려드리겠습니다.
Google Apps Script를 웹 앱으로 배포하여 데이터 접근하기
이 방법은 Google Apps Script라는 Google Workspace의 스크립트 플랫폼을 사용하여 Google Sheets의 데이터를 JSON 형태로 제공하는 웹 앱을 만들고, 파이썬에서는 해당 웹 앱의 URL을 호출하여 데이터를 받아오는 방식입니다.
단계 1: Google Sheets에 Apps Script 작성 및 웹 앱 배포
- Google Sheets 열기: 데이터를 읽어올 Google Sheets 파일을 엽니다.
- 스크립트 편집기 열기: 메뉴에서 확장 프로그램 > Apps Script를 클릭합니다. 새 스크립트 편집기 창이 열립니다.
- 스크립트 작성: 다음 코드를 스크립트 편집기에 붙여넣습니다.
function doGet(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet1"); // 실제 시트 이름으로 변경
var range = sheet.getDataRange();
var values = range.getValues();
// 데이터를 JSON 형태로 변환
var data = [];
var headers = values[0];
for (var i = 1; i < values.length; i++) {
var rowData = {};
for (var j = 0; j < headers.length; j++) {
rowData[headers[j]] = values[i][j];
}
data.push(rowData);
}
var jsonOutput = JSON.stringify(data);
return ContentService.createTextOutput(jsonOutput).setMimeType(ContentService.MimeType.JSON);
}
function getCellData(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetName = e.parameter.sheetName || "Sheet1"; // 기본 시트 이름
var cellRange = e.parameter.range || "A1"; // 기본 셀 범위
var sheet = ss.getSheetByName(sheetName);
if (!sheet) {
return ContentService.createTextOutput(JSON.stringify({"error": "Sheet not found"})).setMimeType(ContentService.MimeType.JSON);
}
var value = sheet.getRange(cellRange).getValue();
return ContentService.createTextOutput(JSON.stringify({"value": value})).setMimeType(ContentService.MimeType.JSON);
}
- doGet(e) 함수는 시트의 모든 데이터를 JSON 형태로 반환합니다. 필요에 따라 특정 범위만 가져오도록 수정할 수 있습니다.
- getCellData(e) 함수는 URL 파라미터로 sheetName과 range를 받아 해당 셀의 값을 JSON 형태로 반환합니다.
- 스크립트 저장: 좌측 상단의 디스켓 아이콘을 클릭하여 스크립트를 저장합니다. 적절한 이름 (예: GoogleSheetsAPI)을 지정합니다.
- 웹 앱으로 배포:
- 메뉴에서 배포 > 새 배포를 클릭합니다.
- "배포 유형 선택"에서 "웹 앱"을 선택합니다.
- "다음 권한으로 실행"은 "나(사용자 자신)" 또는 "웹 앱을 배포한 사용자"를 선택합니다. 데이터 접근 권한 관리에 따라 선택합니다.
- "액세스할 수 있는 사용자"는 "모든 사용자" 또는 특정 사용자 그룹을 선택합니다. 데이터를 공개하고 싶지 않다면 "나만" 또는 특정 사용자로 제한해야 합니다. "모든 사용자"로 설정하면 인터넷에 URL이 노출될 경우 누구나 접근할 수 있습니다.
- "배포" 버튼을 클릭합니다.
- 권한 승인 요청이 나타나면 Google 계정을 선택하고 필요한 권한을 승인합니다.
- 배포가 완료되면 웹 앱 URL이 생성됩니다. 이 URL을 파이썬 코드에서 사용하게 됩니다.
단계 2: 파이썬 코드로 웹 앱 URL 호출하여 데이터 읽기
import requests
import json
# --- 여기에 Google Sheets 웹 앱 정보 입력 ---
WEB_APP_URL_ALL_DATA = "YOUR_WEB_APP_URL_FOR_ALL_DATA" # doGet 웹 앱 URL
WEB_APP_URL_CELL_DATA = "YOUR_WEB_APP_URL_FOR_CELL_DATA" # getCellData 웹 앱 URL
def read_sheet_all_data(web_app_url):
"""웹 앱 URL을 통해 구글 시트의 모든 데이터를 JSON 형태로 읽어옵니다."""
try:
response = requests.get(web_app_url)
response.raise_for_status() # 응답 상태 코드가 200 OK가 아니면 예외 발생
data = response.json()
return data
except requests.exceptions.RequestException as e:
print(f"웹 앱 요청 오류: {e}")
return None
except json.JSONDecodeError as e:
print(f"JSON 디코딩 오류: {e}")
return None
def read_sheet_cell_data(web_app_url, sheet_name, cell_range):
"""웹 앱 URL과 파라미터를 통해 특정 셀의 데이터를 읽어옵니다."""
params = {"sheetName": sheet_name, "range": cell_range}
try:
response = requests.get(web_app_url, params=params)
response.raise_for_status()
data = response.json()
return data.get("value")
except requests.exceptions.RequestException as e:
print(f"웹 앱 요청 오류: {e}")
return None
except json.JSONDecodeError as e:
print(f"JSON 디코딩 오류: {e}")
return None
if __name__ == "__main__":
# 전체 데이터 읽기 예시
all_data = read_sheet_all_data(WEB_APP_URL_ALL_DATA)
if all_data:
print("전체 데이터:")
for row in all_data:
print(row)
print("-" * 20)
# 특정 셀 데이터 읽기 예시
sheet_name_to_read = "Sheet1" # 읽을 시트 이름
cell_to_read = "B2" # 읽을 셀 범위
cell_value = read_sheet_cell_data(WEB_APP_URL_CELL_DATA, sheet_name_to_read, cell_to_read)
if cell_value:
print(f"[{sheet_name_to_read}!{cell_to_read}]의 값: {cell_value}")
코드 사용 방법:
- 위의 Apps Script 코드를 Google Sheets의 스크립트 편집기에 붙여넣고 저장한 후 웹 앱으로 배포합니다. 이때 생성된 웹 앱 URL을 복사하여 파이썬 코드의 WEB_APP_URL_ALL_DATA 변수에 입력합니다.
- 특정 셀의 값을 읽어오는 기능을 사용하려면, getCellData(e) 함수를 포함하여 웹 앱을 다시 배포하고, 생성된 웹 앱 URL을 WEB_APP_URL_CELL_DATA 변수에 입력합니다.
- 파이썬 코드를 실행하면 웹 앱 URL로 HTTP GET 요청을 보내고, 웹 앱이 반환하는 JSON 데이터를 파싱하여 출력합니다.
장점:
- 무료: Google Apps Script는 Google Workspace 계정에서 무료로 사용할 수 있습니다.
- 간편한 데이터 접근: 웹 앱 URL만 알면 파이썬에서 쉽게 데이터를 가져올 수 있습니다.
- 권한 관리: 웹 앱 배포 시 접근 권한을 설정하여 데이터 보안을 관리할 수 있습니다.
주의사항:
- 웹 앱 URL 보안: 웹 앱 URL이 노출되지 않도록 주의해야 합니다. 민감한 데이터가 포함된 경우 "액세스할 수 있는 사용자" 설정을 신중하게 관리하세요.
- Apps Script 한도: Google Apps Script에는 실행 시간, API 호출 횟수 등의 할당량 제한이 있을 수 있습니다. 대규모 데이터 처리에는 적합하지 않을 수 있습니다.
- 실시간성: 웹 앱을 호출할 때마다 최신 데이터를 가져오지만, 실시간 동기화는 아닙니다.
이 방법은 Google Cloud Platform과 같은 외부 서비스를 사용하지 않고 Google Workspace 내에서 제공하는 기능을 활용하여 Google Sheets 데이터에 접근하는 대안입니다. 웹 앱 URL을 안전하게 관리하고, 데이터의 성격에 따라 접근 권한을 적절히 설정하는 것이 중요합니다.
##########################################################################################
힘들게 Apps Script 들어가서 따라해서, 실행 버튼 눌렀더니 error 발생
1) doGet선택해서 실행하면, 아래 error
2) getCellData선택해서 실행하면, 아래 error 발생
getCellData
-> 해결 방법은 아래 post 확인
TypeError: Cannot read properties of undefined (reading parameter')getCellData
주제: Apps Script에서 getCellData로 실행했을때 발생한 error와 해결한 방법 : 발생된 Error변경전 코드 : function getCellData(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetName = e.parameter.sheetName || "Sheet1"; //
jkinvest1004.tistory.com
https://jkinvest1004.tistory.com/entry/TypeError-Cannot-read-properties-of-null-reading-getDataRange
TypeError: Cannot read properties of null (reading 'getDataRange')
주제: Apps Script에서 doGet으로 실행했을때 발생한 error와 해결한 방법 : 발생된 Error 변경전 코드 : function doGet(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("Sheet1"); // 실제 시트 이
jkinvest1004.tistory.com
일단은 여기까지만..휴~
'AI를 이용한 프로그램 만들기' 카테고리의 다른 글
파이썬 코드 실행 과정 (파이썬 기초) (2) | 2025.05.09 |
---|---|
AI를 활용한 파이썬 프로그래밍: 효과적인 질문법과 단계별 가이드 (예제 포함) (4) | 2025.05.09 |
파이썬 소스 코드, 어떻게 작동될까요? 자세히 알아봅시다! (2) | 2025.05.09 |
TypeError: Cannot read properties of null (reading 'getDataRange') (2) | 2025.04.17 |
TypeError: Cannot read properties of undefined (reading parameter')getCellData (0) | 2025.04.17 |