
9차시: 구글 드라이브와 외부 API
파일 관리 자동화와 외부 데이터 연동하기
📚 학습 목표
- DriveApp으로 파일과 폴더 관리하기
- 스프레드시트를 PDF로 변환하고 저장하기
- UrlFetchApp으로 외부 API 데이터 가져오기
- 실전 예제: 자동 백업 시스템과 날씨 정보 연동
📁 구글 드라이브 제어하기
1
DriveApp의 개념
DriveApp은 구글 드라이브의 파일과 폴더를 관리할 수 있는 서비스입니다. 파일 생성, 이동, 복사, 삭제 등의 작업을 자동화할 수 있습니다.
주요 기능:
• getFolderById(): ID로 폴더 가져오기
• createFolder(): 새 폴더 만들기
• getFilesByName(): 이름으로 파일 검색
• createFile(): 파일 생성하기
• getFolderById(): ID로 폴더 가져오기
• createFolder(): 새 폴더 만들기
• getFilesByName(): 이름으로 파일 검색
• createFile(): 파일 생성하기
🚀 실습 1: 드라이브 파일 관리
2
폴더 생성 및 관리
드라이브에 폴더를 만들고 관리해봅시다:
실행하면 구글 드라이브에 새 폴더가 생성됩니다!
function 폴더관리() {
// 루트 폴더에 새 폴더 생성
let 루트 = DriveApp.getRootFolder();
let 새폴더 = 루트.createFolder("업무자료_" + new Date().getTime());
Logger.log("폴더가 생성되었습니다: " + 새폴더.getName());
Logger.log("폴더 ID: " + 새폴더.getId());
Logger.log("폴더 URL: " + 새폴더.getUrl());
// 하위 폴더 만들기
let 보고서폴더 = 새폴더.createFolder("보고서");
let 데이터폴더 = 새폴더.createFolder("원본데이터");
// 폴더 목록 가져오기
let 하위폴더들 = 새폴더.getFolders();
Logger.log("=== 하위 폴더 목록 ===");
while (하위폴더들.hasNext()) {
let 폴더 = 하위폴더들.next();
Logger.log("- " + 폴더.getName());
}
SpreadsheetApp.getActiveSpreadsheet().toast(
"폴더 생성 완료: " + 새폴더.getName(),
"완료",
3
);
}
3
파일 검색 및 정보 확인
드라이브에서 파일을 찾고 정보를 확인합니다:
실행하면 파일 정보가 로그에 표시됩니다.
function 파일검색() {
// 현재 스프레드시트 파일 정보
let 현재파일 = SpreadsheetApp.getActiveSpreadsheet();
let 파일 = DriveApp.getFileById(현재파일.getId());
Logger.log("=== 현재 파일 정보 ===");
Logger.log("파일명: " + 파일.getName());
Logger.log("파일 크기: " + 파일.getSize() + " bytes");
Logger.log("생성일: " + 파일.getDateCreated());
Logger.log("수정일: " + 파일.getLastUpdated());
Logger.log("소유자: " + 파일.getOwner().getName());
Logger.log("URL: " + 파일.getUrl());
// 이름으로 파일 검색
let 검색결과 = DriveApp.getFilesByName("앱스크립트 연습");
Logger.log("=== '앱스크립트 연습' 검색 결과 ===");
let 개수 = 0;
while (검색결과.hasNext()) {
let 찾은파일 = 검색결과.next();
Logger.log("- " + 찾은파일.getName() + " (" + 찾은파일.getId() + ")");
개수++;
}
Logger.log("총 " + 개수 + "개 파일 발견");
}
4
스프레드시트를 PDF로 저장
현재 스프레드시트를 PDF로 변환하여 드라이브에 저장합니다:
실행하면 현재 시트가 PDF로 변환되어 드라이브에 저장됩니다!
function PDF로저장() {
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getActiveSheet();
// PDF 변환 URL
let url = "https://docs.google.com/spreadsheets/d/" + ss.getId() +
"/export?format=pdf&gid=" + sheet.getSheetId();
// PDF 파일 생성
let 응답 = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
}
});
let PDF데이터 = 응답.getBlob();
let 날짜 = Utilities.formatDate(new Date(), "Asia/Seoul", "yyyyMMdd_HHmmss");
let PDF파일명 = sheet.getName() + "_" + 날짜 + ".pdf";
// 드라이브에 저장
let 저장된파일 = DriveApp.createFile(PDF데이터.setName(PDF파일명));
Logger.log("PDF 저장 완료!");
Logger.log("파일명: " + PDF파일명);
Logger.log("URL: " + 저장된파일.getUrl());
SpreadsheetApp.getUi().alert(
'PDF 저장 완료',
'PDF가 드라이브에 저장되었습니다.\n\n' +
'파일명: ' + PDF파일명 + '\n\n' +
'드라이브에서 확인하세요.',
SpreadsheetApp.getUi().ButtonSet.OK
);
}
5
파일 백업 시스템
스프레드시트를 자동으로 백업하는 시스템을 만듭니다:
실행하면 백업 폴더에 현재 파일이 복사되고, 오래된 백업은 자동 삭제됩니다!
function 자동백업() {
let ss = SpreadsheetApp.getActiveSpreadsheet();
let 원본파일 = DriveApp.getFileById(ss.getId());
// 백업 폴더 찾기 또는 생성
let 백업폴더;
let 폴더검색 = DriveApp.getFoldersByName("스프레드시트_백업");
if (폴더검색.hasNext()) {
백업폴더 = 폴더검색.next();
} else {
백업폴더 = DriveApp.createFolder("스프레드시트_백업");
}
// 백업 파일명 (날짜_시간 포함)
let 날짜시간 = Utilities.formatDate(new Date(), "Asia/Seoul", "yyyyMMdd_HHmmss");
let 백업파일명 = 원본파일.getName() + "_백업_" + 날짜시간;
// 파일 복사
let 백업파일 = 원본파일.makeCopy(백업파일명, 백업폴더);
Logger.log("백업 완료!");
Logger.log("백업 파일: " + 백업파일명);
Logger.log("백업 폴더: " + 백업폴더.getName());
// 오래된 백업 삭제 (5개 이상이면 가장 오래된 것 삭제)
let 백업파일들 = 백업폴더.getFiles();
let 파일배열 = [];
while (백업파일들.hasNext()) {
파일배열.push(백업파일들.next());
}
// 생성일 기준 정렬
파일배열.sort(function(a, b) {
return a.getDateCreated() - b.getDateCreated();
});
// 5개 초과 시 오래된 파일 삭제
if (파일배열.length > 5) {
let 삭제개수 = 파일배열.length - 5;
for (let i = 0; i < 삭제개수; i++) {
Logger.log("오래된 백업 삭제: " + 파일배열[i].getName());
파일배열[i].setTrashed(true);
}
}
SpreadsheetApp.getActiveSpreadsheet().toast(
"백업이 완료되었습니다! (최근 5개 유지)",
"백업 완료",
5
);
}🌐 외부 API 연동하기
6
UrlFetchApp으로 웹 데이터 가져오기
외부 API에서 데이터를 가져와 스프레드시트에 저장합니다:
실행하면 외부 API에서 데이터를 가져와 시트에 표시합니다!
function 공공API테스트() {
// 공공데이터 API 예제 (실제 사용시 API 키 필요)
// 여기서는 무료 JSON 테스트 API 사용
let url = "https://jsonplaceholder.typicode.com/users";
try {
// API 호출
let 응답 = UrlFetchApp.fetch(url);
let 데이터 = JSON.parse(응답.getContentText());
Logger.log("=== API 응답 데이터 ===");
Logger.log("총 " + 데이터.length + "개 데이터");
// 스프레드시트에 데이터 쓰기
let sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
// 헤더
sheet.getRange("A1:D1").setValues([["ID", "이름", "사용자명", "이메일"]]);
sheet.getRange("A1:D1")
.setBackground("#4285f4")
.setFontColor("#ffffff")
.setFontWeight("bold");
// 데이터 입력
for (let i = 0; i < 데이터.length; i++) {
let 사용자 = 데이터[i];
let 행 = i + 2;
sheet.getRange(행, 1).setValue(사용자.id);
sheet.getRange(행, 2).setValue(사용자.name);
sheet.getRange(행, 3).setValue(사용자.username);
sheet.getRange(행, 4).setValue(사용자.email);
}
Logger.log("API 데이터 저장 완료!");
SpreadsheetApp.getActiveSpreadsheet().toast(
데이터.length + "개 데이터 가져오기 완료!",
"완료",
3
);
} catch (e) {
Logger.log("오류 발생: " + e.message);
SpreadsheetApp.getUi().alert("API 호출 실패", e.message,
SpreadsheetApp.getUi().ButtonSet.OK);
}
}
7
POST 요청으로 데이터 전송
외부 API로 데이터를 전송할 수 있습니다:
POST 요청으로 외부 서버에 데이터를 전송할 수 있습니다.
function POST요청테스트() {
// 테스트용 API 엔드포인트
let url = "https://jsonplaceholder.typicode.com/posts";
// 전송할 데이터
let 데이터 = {
title: "구글 앱스크립트 테스트",
body: "POST 요청 테스트입니다.",
userId: 1
};
// POST 요청 옵션
let 옵션 = {
method: "post",
contentType: "application/json",
payload: JSON.stringify(데이터)
};
try {
let 응답 = UrlFetchApp.fetch(url, 옵션);
let 결과 = JSON.parse(응답.getContentText());
Logger.log("=== POST 응답 ===");
Logger.log("상태 코드: " + 응답.getResponseCode());
Logger.log("생성된 ID: " + 결과.id);
Logger.log("제목: " + 결과.title);
SpreadsheetApp.getActiveSpreadsheet().toast(
"데이터 전송 완료! ID: " + 결과.id,
"완료",
3
);
} catch (e) {
Logger.log("오류: " + e.message);
}
}🎯 실습 2: 종합 자동화 시스템
8
자동 보고서 생성 및 백업 시스템
모든 기능을 통합한 완전한 자동화 시스템을 만듭니다:
시스템트리거설정() 함수를 실행하면 완전 자동화 시스템이 가동됩니다!
/**
* 매일 자동 실행되는 종합 시스템
* (트리거로 설정하여 사용)
*/
function 일일자동화시스템() {
let 시작시간 = new Date();
Logger.log("=== 자동화 시스템 시작 ===");
Logger.log("시작 시간: " + 시작시간);
try {
// 1단계: 외부 데이터 가져오기
Logger.log("1단계: 외부 데이터 수집 중...");
외부데이터수집();
// 2단계: 데이터 분석 및 보고서 생성
Logger.log("2단계: 보고서 생성 중...");
let 보고서내용 = 보고서생성();
// 3단계: PDF 백업
Logger.log("3단계: PDF 백업 중...");
PDF백업생성();
// 4단계: 파일 백업
Logger.log("4단계: 파일 백업 중...");
자동백업();
// 5단계: 이메일 발송
Logger.log("5단계: 이메일 발송 중...");
보고서이메일발송(보고서내용);
let 종료시간 = new Date();
let 소요시간 = (종료시간 - 시작시간) / 1000;
Logger.log("=== 자동화 완료 ===");
Logger.log("종료 시간: " + 종료시간);
Logger.log("소요 시간: " + 소요시간 + "초");
} catch (e) {
Logger.log("오류 발생: " + e.message);
// 오류 알림 이메일
GmailApp.sendEmail(
Session.getActiveUser().getEmail(),
"⚠️ 자동화 시스템 오류",
"오류가 발생했습니다:\n\n" + e.message + "\n\n" + e.stack
);
}
}
function 외부데이터수집() {
// API에서 데이터 가져오기 (6단계 함수 활용)
공공API테스트();
}
function 보고서생성() {
let sheet = SpreadsheetApp.getActiveSheet();
let 마지막행 = sheet.getLastRow();
if (마지막행 < 2) {
return "데이터가 없습니다.";
}
let 데이터개수 = 마지막행 - 1;
let 보고서 = "오늘의 데이터: " + 데이터개수 + "건";
return 보고서;
}
function PDF백업생성() {
// 4단계 함수 활용
PDF로저장();
}
function 보고서이메일발송(내용) {
let 받는사람 = Session.getActiveUser().getEmail();
let 날짜 = Utilities.formatDate(new Date(), "Asia/Seoul", "yyyy년 MM월 dd일");
let HTML = `
📊 일일 자동 보고서
${날짜}
처리 내용
- ✅ 외부 데이터 수집 완료
- ✅ 보고서 생성 완료
- ✅ PDF 백업 완료
- ✅ 파일 백업 완료
요약
${내용}
이 보고서는 자동으로 생성되었습니다.
`;
GmailApp.sendEmail(받는사람, "📊 일일 자동 보고서 - " + 날짜,
"일일 보고서입니다.", { htmlBody: HTML });
}
/**
* 자동화 시스템 트리거 설정
*/
function 시스템트리거설정() {
// 기존 트리거 삭제
let 트리거들 = ScriptApp.getProjectTriggers();
for (let i = 0; i < 트리거들.length; i++) {
if (트리거들[i].getHandlerFunction() === '일일자동화시스템') {
ScriptApp.deleteTrigger(트리거들[i]);
}
}
// 매일 오전 8시 실행 트리거 생성
ScriptApp.newTrigger('일일자동화시스템')
.timeBased()
.atHour(8)
.everyDays(1)
.create();
SpreadsheetApp.getUi().alert(
'트리거 설정 완료',
'매일 오전 8시에 자동으로 실행됩니다.\n\n' +
'• 외부 데이터 수집\n' +
'• 보고서 생성\n' +
'• PDF 및 파일 백업\n' +
'• 이메일 발송',
SpreadsheetApp.getUi().ButtonSet.OK
);
}💡 드라이브 및 API 활용 팁
- 파일 ID 확인: 파일 URL에서 /d/ 다음에 오는 긴 문자열이 파일 ID입니다
- API 키 관리: 스크립트 속성(PropertiesService)에 안전하게 저장하세요
- 에러 처리: try-catch로 API 호출 실패를 대비하세요
- Rate Limit: API 호출 횟수 제한에 주의하고 적절한 sleep을 사용하세요
⚠️ 주의사항
- DriveApp으로 파일을 삭제할 때는 setTrashed(true)를 사용하여 휴지통으로 이동시키세요
- 대용량 파일 처리 시 실행 시간 제한(6분)에 주의하세요
- 외부 API 사용 시 API 키나 토큰은 절대 코드에 직접 노출하지 마세요
- CORS 제한이 있는 API는 Apps Script에서 우회 가능합니다
🎯 9차시 정리
이번 시간에는 구글 드라이브를 제어하여 파일과 폴더를 관리하고,외부 API와 연동하여 데이터를 가져오는 방법을 배웠습니다.
자동 백업 시스템과 종합 자동화 시스템으로 실무 활용 능력을 키웠습니다.
다음 마지막 10차시에서는 실전 프로젝트와 배포, 보안 관리를 배워보겠습니다.
'AppSheet' 카테고리의 다른 글
| 구글 앱스크립트 11차시 - 통합 메뉴와 최종 마무리 (4) | 2025.12.21 |
|---|---|
| 구글 앱스크립트 10차시 - 실전 프로젝트와 배포 (1) | 2025.12.20 |
| 구글 앱스크립트 8차시 - 이메일 자동화와 트리거 (1) | 2025.12.20 |
| 구글 앱스크립트 7차시 - 사용자 정의 함수와 메뉴 (2) | 2025.12.20 |
| 구글 앱스크립트 6차시 - 시트 관리와 데이터 정렬 (1) | 2025.12.20 |