안녕하세요.
오늘은 코딩초보자가 오랜만에 chatGPT를 활용해 보겠습니다.
이번에는 한국석유공사의 OPEN API를 활용해 유가정보를 구글시트로 불러오는 작업을 자동화 해볼 예정입니다.

오픈 API를 활용하려면, 우선 회원가입한 후 이용신청을 한 후 KEY를 부여 받아야 합니다.
오피넷 홈페이지 : https://www.opinet.co.kr/user/main/mainView.do
유가정보 오픈 API를 이용하려면 아래의 절차를 참고하시면 됩니다.

다음은 활용가능한 API 리스트 입니다.

우선 현재시점의 주유소 전국 평균가격을 대상으로 데이터를 불러오는 코드를 만들어 보겠습니다.
한국석유공사에서 제공하는 오피넷 유가정보 무료API 이용 가이드를 참고했습니다.
가이드를 참고해서 질문할때 상세하게 질문하는 것이 좋습니다.

1. chatGPT에 요청한 내용
오피넷 유가정보의 오픈 API 를 활용해서 구글시트에서 데이터를 불러올 예정이다.
무료 오픈 API 중 순차적으로 처리할 예정임.
인증키는 F25062XXXX 이다. 시트명은 '전국평균' 으로 해줘
제시한 인증키와 아래의 정보를 바탕으로 전국주유소 평균 가격을 가져오는 코드를 짜줘.
출력은 반환값 모두 출력해줘.
1. 기본정보 : https://www.opinet.co.kr/api/avgAllPrice.do
기본정보 설명 : 현재 오피넷에 게시되고 있는 전국 주유소 평균가격
2. 요청파라미터
code : F25062XXXX
out : 정보 노출 형식을 정의 한다.(xml/json)
3. 반환값
TRADE_DT 해당일자
PRODCD 제품구분코드
PRODNM 제품명
PRICE 평균가격
DIFF 전일대비 등락값
4. 예시
https://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=F25062XXXX
{"RESULT": {"OIL":[ {"TRADE_DT":"20250727","PRODCD":"B034","PRODNM":"고급휘발유","PRICE":"1916.84", "DIFF":"-0.05" }, {"TRADE_DT":"20250727","PRODCD":"B027","PRODNM":"휘발유","PRICE":"1667.08", "DIFF":"+0.43" }, {"TRADE_DT":"20250727","PRODCD":"D047","PRODNM":"자동차용경유","PRICE":"1532.87", "DIFF":"-0.04" }, {"TRADE_DT":"20250727","PRODCD":"C004","PRODNM":"실내등유","PRICE":"1295.27", "DIFF":"+0.50" }, {"TRADE_DT":"20250727","PRODCD":"K015","PRODNM":"자동차용부탄","PRICE":"1052.54", "DIFF":"-0.12" } ]} }
ChatGPT의 말:
다음은 오피넷 유가정보 오픈 API(https://www.opinet.co.kr/api/avgAllPrice.do)를 활용하여 구글시트에서 전국 평균 유가 정보를 가져오는 Google Apps Script 코드입니다.
✅ 사용법 요약:
- 구글시트 메뉴에서 확장 프로그램 > Apps Script 열기
- 아래 코드를 붙여넣기
- 저장 후 함수 getAvgAllPrice 실행
- 시트에 '전국평균'이라는 이름의 시트가 없으면 자동 생성됨
✅ Google Apps Script 코드
function getAvgAllPrice() {
const sheetName = '전국평균';
const apiKey = 'F25062XXXX';
const url = `https://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=${apiKey}`;
// 시트가 없으면 생성
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName(sheetName);
if (!sheet) {
sheet = ss.insertSheet(sheetName);
} else {
sheet.clear(); // 기존 데이터 초기화
}
// API 호출
const response = UrlFetchApp.fetch(url);
const json = JSON.parse(response.getContentText());
const data = json.RESULT.OIL;
// 헤더 작성
const headers = ['TRADE_DT', 'PRODCD', 'PRODNM', 'PRICE', 'DIFF'];
sheet.appendRow(headers);
// 데이터 작성
data.forEach(oil => {
sheet.appendRow([
oil.TRADE_DT,
oil.PRODCD,
oil.PRODNM,
parseFloat(oil.PRICE),
oil.DIFF
]);
});
// 자동 너비 조정
sheet.autoResizeColumns(1, headers.length);
}
✅ 실행 예시 (시트에 입력될 값)
| TRADE_DT | PRODCD | PRODNM | PRICE | DIFF |
| 20250727 | B034 | 고급휘발유 | 1916.84 | -0.05 |
| 20250727 | B027 | 휘발유 | 1667.08 | +0.43 |
| 20250727 | D047 | 자동차용경유 | 1532.87 | -0.04 |
| 20250727 | C004 | 실내등유 | 1295.27 | +0.50 |
| 20250727 | K015 | 자동차용부탄 | 1052.54 | -0.12 |
2 chatGPT에 요청한 내용
실행후 칼럼이 좁아져서 불편해 원래 칼럼 크기를 유지해 줘. 그리고 헤더는 한글로만 나오게 해줘

ChatGPT의 말:
좋습니다. 업로드된 두 이미지를 기준으로 실행 전후를 비교해보면 아래와 같은 변화가 있습니다:
✅ 문제 요약
- 실행 전: 칼럼 너비가 넉넉하게 설정되어 있으며, 제품코드, 제품명, 평균가격, 전일대비 등락 항목이 각각의 열에 나뉘어 있음.
- 실행 후: 제품코드~평균가격 값이 하나의 셀에 합쳐지고, 칼럼 폭이 좁아져서 가독성이 떨어짐.
- 또한: 헤더가 한글 + 영어 혼용 상태에서 한글만 유지되길 원함.
🔧 개선 방향
- 칼럼 너비 고정 유지
- 매크로 실행 후 Columns("A:F").AutoFit 같은 명령이 있다면 제거.
- 혹은 ColumnWidth를 강제로 지정하는 방식 도입.
- 헤더 수정
- “제품코 제품명 평균가격 전일대비 등락” ← 이렇게 한글만 나오도록 코드 수정.
✅ 예시 VBA 코드 수정안
원하는 동작이 “세로로 정렬된 상태를 유지하고, 각 열이 따로 표시되며 너비가 고정된 상태로 유지되는 것”이라면 위처럼 ColumnWidth를 지정하고, 기존 열을 병합하지 않는 방식이 좋습니다.
실제 사용 중인 VBA 코드를 올려주시면 더 정확하게 수정해드릴 수 있어요. 필요하시면 다시 공유해 주세요!
3 chatGPT에 요청 응답으로 기존 코드 제시함.
function getAvgAllPrice() {
const sheetName = '전국평균';
const apiKey = 'F25062XXXX';
const url = https://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=${apiKey};
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName(sheetName);
if (!sheet) {
sheet = ss.insertSheet(sheetName);
} else {
sheet.clear(); // 기존 데이터 초기화
}
const response = UrlFetchApp.fetch(url);
const json = JSON.parse(response.getContentText());
const data = json.RESULT.OIL;
// 헤더 작성 (설명 포함)
const headers = [
'해당일자',
'제품코드',
'제품명',
'평균가격',
'전일대비 등락'
];
sheet.appendRow(headers);
// 데이터 입력
data.forEach(oil => {
sheet.appendRow([
oil.TRADE_DT,
oil.PRODCD,
oil.PRODNM,
parseFloat(oil.PRICE),
oil.DIFF
]);
});
'sheet.autoResizeColumns(1, headers.length);
}
chatGPT 답변
감사합니다! 올려주신 GAS(Google Apps Script) 코드에서는 다음 두 가지 문제를 확인할 수 있습니다:
🔍 1. 칼럼 너비가 자동으로 줄어드는 문제
현재 코드 마지막 줄:
- 문제점: 주석 처리되어 있지만, 활성화하면 autoResizeColumns()가 칼럼을 자동 폭 조정해서 좁아질 수 있음.
- 해결 방법: 자동 너비 조정을 없애고, 원하는 고정 너비를 수동 설정하면 됩니다.
🔍 2. 헤더가 한글만 나오도록 처리됨 (OK)
- 현재 헤더는 전부 한글로 "해당일자", "제품코드", ..." 설정되어 있고, 이는 요청대로 잘 구현되어 있습니다.
✅ 수정된 최종 코드 제안
function getAvgAllPrice() {
const sheetName = '전국평균';
const apiKey = 'F25062XXXX';
const url = `https://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=${apiKey}`;
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName(sheetName);
if (!sheet) {
sheet = ss.insertSheet(sheetName);
} else {
sheet.clear(); // 기존 데이터 초기화
}
const response = UrlFetchApp.fetch(url);
const json = JSON.parse(response.getContentText());
const data = json.RESULT.OIL;
// 헤더 작성 (한글만)
const headers = ['해당일자', '제품코드', '제품명', '평균가격', '전일대비 등락'];
sheet.appendRow(headers);
// 데이터 입력
data.forEach(oil => {
sheet.appendRow([
oil.TRADE_DT,
oil.PRODCD,
oil.PRODNM,
parseFloat(oil.PRICE),
oil.DIFF
]);
});
// 칼럼 폭 고정 설정
const widths = [12, 10, 20, 12, 14]; // 원하는 폭으로 조정
for (let i = 0; i < widths.length; i++) {
sheet.setColumnWidth(i + 1, widths[i] * 7); // 약간 넓게 보기 좋게
}
// 그 외 서식 (중앙 정렬 등) 적용 가능
sheet.getRange(1, 1, sheet.getLastRow(), headers.length).setHorizontalAlignment("center");
}
📝 보충 설명
- setColumnWidth(col, px)는 픽셀 단위이므로 폭 * 7 정도가 일반적인 문자 너비로 적당합니다.
- 정렬이나 서식도 필요하시면 추가 가능해요 (예: 가격에 천단위 쉼표 등).
필요 시 버튼과 연동하거나, 자동화 시간트리거도 함께 안내해드릴 수 있습니다.
4 chatGPT에 요청
ChatGPT의 말:
좋습니다! GAS(Google Apps Script)에서 자동화 시간 트리거를 설정하면 getAvgAllPrice() 함수를 매일 자동으로 실행해 전국 평균 유가 데이터를 시트에 갱신할 수 있습니다.
✅ 1. 시간 기반 트리거 설정 방법
① 스크립트 편집기 열기
- 구글시트에서 확장 프로그램 → Apps Script 클릭
② 트리거 메뉴 열기
- 상단 메뉴에서 시계 아이콘 🕒 클릭 (또는 좌측 메뉴 > 트리거 클릭)
③ 새 트리거 추가
- 오른쪽 아래의 + 버튼 (트리거 추가) 클릭
④ 트리거 설정
| 실행할 함수 선택 | getAvgAllPrice |
| 실행할 이벤트 소스 | 시간 기반 트리거 |
| 시간 기반 트리거 유형 | 일별 타이머 |
| 시간 선택 | 오전 6시~7시 사이 등 적절한 시간 선택 |
✅ 2. 시간 트리거 예시 코드로 추가 (프로그래밍 방식)
다음 코드를 한 번 실행하면 트리거가 자동으로 등록됩니다:
- everyDays(1) → 매일 실행
- atHour(6) → 오전 6시 실행 (0~23 기준)
✅ 3. 등록된 트리거 확인 및 삭제
등록된 트리거 보기
- Apps Script 에서 왼쪽 메뉴 "트리거" 클릭
트리거 삭제 코드 예시
✅ 팁: 실패 대비 이메일 알림
트리거 실행 중 오류가 발생하면 연결된 구글 계정 이메일로 자동 알림이 가니 안심하세요.
필요하시면 매일 정해진 셀에 최종 업데이트 시간 기록하는 기능도 추가해드릴 수 있습니다.
5 chatGPT에 요청
ChatGPT의 말:
좋습니다! getAvgAllPrice() 함수가 실행될 때마다 지정한 셀에 최종 업데이트 시간을 기록하도록 기능을 추가해드리겠습니다.
✅ 목표
- 예: '전국평균' 시트의 G1 셀에 "최종 업데이트: 2025-07-27 06:01" 형식으로 기록
function getAvgAllPrice() {
const sheetName = '전국평균';
const apiKey = 'F25062XXXX';
const url = `https://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=${apiKey}`;
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName(sheetName);
if (!sheet) {
sheet = ss.insertSheet(sheetName);
} else {
sheet.clear(); // 기존 데이터 초기화
}
const response = UrlFetchApp.fetch(url);
const json = JSON.parse(response.getContentText());
const data = json.RESULT.OIL;
// 헤더 작성 (한글)
const headers = ['해당일자', '제품코드', '제품명', '평균가격', '전일대비 등락'];
sheet.appendRow(headers);
// 데이터 입력
data.forEach(oil => {
sheet.appendRow([
oil.TRADE_DT,
oil.PRODCD,
oil.PRODNM,
parseFloat(oil.PRICE),
oil.DIFF
]);
});
// 칼럼 폭 고정 설정
const widths = [12, 10, 20, 12, 14];
for (let i = 0; i < widths.length; i++) {
sheet.setColumnWidth(i + 1, widths[i] * 7);
}
// 가운데 정렬
sheet.getRange(1, 1, sheet.getLastRow(), headers.length).setHorizontalAlignment("center");
// ✅ 최종 업데이트 시간 기록
const now = new Date();
const formatted = Utilities.formatDate(now, "Asia/Seoul", "yyyy-MM-dd HH:mm");
sheet.getRange("G1").setValue("최종 업데이트: " + formatted);
}
📝 결과
- G1 셀에는 실행 시마다 "최종 업데이트: 2025-07-27 06:03" 같은 텍스트가 갱신됩니다.
- 타임존은 Asia/Seoul (KST) 기준으로 설정되어 한국 시간에 맞게 기록됩니다.
최종 작성된 코드를 구글시트 확장프로그램에서 Apps Script 메뉴에서 코드를 저장하신 다음 도형 버튼에 할당하면 됩니다.

다음은 구글시트에 적용한 모습입니다.
버튼을 누를때마다 데이터를 가져오고 업데이트 일시를 기록합니다.

'인공지능 (AI) 따라잡기' 카테고리의 다른 글
| AI 시대, 초보자도 앱을 만드는 혁명: Lovable 바이브 코딩의 놀라운 여정 (4) | 2025.08.08 |
|---|---|
| [AI야 놀자] <2> 챗GPT + 구글시트로 주유비 절약!!...최저가 주유소는 어디? (7) | 2025.07.28 |
| [목동아파트 재건축] 목동신가지아파트 7월 거래대금 800억 돌파 (7) | 2025.07.17 |
| [재건축 유망주] 목동신시가지아파트 1단지~14단지, 누적 매매대금 1조2330억 (6) | 2025.07.15 |
| [서울_아파트매매_실거래분석] 7월1일~7월 12일, 강남구 매매대금 합계 압도적 1위 (6) | 2025.07.14 |