[Google Apps script] 구글 드라이브의 오래된 파일을 자동 삭제하기
구글 앱 스크립트(App Script) 를 사용해 구글 드라이브의 파일들을 관리할 수 있습니다.
특히 장기간 백업하고 있는 파일들인 경우, 불필요한 파일들이 많이 누적되게 되고 날짜와 파일명, 확장자 조건에 따라 자동으로 관리가 되도록 하면 구글 드라이브를 관리하는 시간이 많이 줄어듭니다.
예를 들어 DB 백업 파일을 구글 드라이브에 백업하는 경우 "1달 이상 경과한 "bak", "trn" 파일 중 "dbbackup_2020" 문자열을 가진 파일들을 매월 1일 오전 12시 ~ 1시 사이에 일괄 삭제한다" 와 같은 조건을 실행하는 스크립트를 작성해서 자동으로 구글 드라이브 파일을 관리할 수 있습니다.
완성된 코드는 다음과 같습니다.
//조건(날짜, 이름)에 맞는 파일 목록 얻는 함수
function GetFilesByDateName() {
var arrFileIDs = [];
// 1. 기준 날짜 얻기. 끝에 30은 이전 날짜 범위임 - 30일 이상 경과한 파일 얻기
var Threshold = new Date().getTime()-3600*1000*24*30;
//yyyy-mm-dd 날짜 문자열 얻기
var CullDate = new Date(Threshold);
var strCullDate = Utilities.formatDate(CullDate, "GMT", "yyyy-MM-dd");
console.info(strCullDate);
// 2. 검색 파일명 조건
var searchName = "dbbackup_2020";
var FileID = "";
var FileName = "";
//검색 조건 기준 날짜 이전이고, 파일명 조건이 포함된 파일만 검색
var files = DriveApp.searchFiles('modifiedDate < "' + strCullDate + '" and title contains "' + searchName + '"');
//루프 돌면서 파일 확장자 조건에 맞으면 배열에 넣음
while (files.hasNext()) {
var file = files.next();
var FileID = file.getId();
var FileName = file.getName();
// 3. 파일 확장자 조건에 맞는지 체크
if (FileName.indexOf('.bak') > -1 || FileName.indexOf('.trn') > -1 ) {
arrFileIDs.push(FileID);
console.info('FileID: ' + FileID);
console.info('Last Updated: ' + file.getLastUpdated());
console.info('Filename: ' + FileName);
}
}
//배열 반환
return arrFileIDs;
console.info('FileIDs Array: ' + arrFileIDs);
};
//파일 삭제 함수
function DeleteFilesByDateName() {
var arrayIDs = GetFilesByDateName();//파일 목록 얻기 호출
//루프돌면서 파일 삭제
for (var i=0; i < arrayIDs.length; i++) {
console.info('arrayIDs[i]: ' + arrayIDs[i]);
//휴지통으로 가지 않고 즉시 삭제됨
var DelResponse = Drive.Files.remove(arrayIDs[i]);
}
};
함수 2개로 이루어져 있고 "DeleteFilesByDateName()" 함수에서 "GetFilesByDateName()" 함수를 호출하는 간단한 구조입니다. 함수명에서 알 수 있듯이 "GetFilesByDateName()" 함수에서 조건에 맞는 파일목록을 배열로 받아서 "DeleteFilesByDateName()" 함수에서 삭제합니다.
삭제한 파일은 휴지통으로 가지 않고 즉시 삭제되므로, 삭제할 대상을 선택하는 필터링 조건 설정은 신중하게 해야하며, 잘못 설정하면, 구글 드라이브의 엉뚱한 파일들을 대량으로 삭제할 수도 있으므로 주의해서 사용해야 합니다.
자바스크립트 코드에 익숙하면 어렵지 않게 이해할 수 있으므로, 코멘트를 참조해서 필요한 부분을 수정해서 사용하면 됩니다.
코드의 코멘트에서 1, 2, 3이라고 표시한 부분이 검색 필터 조건을 설정하는 부분이므로 해당 부분은 주의해서 변경해야 합니다.
- 기준 날짜 계산 - new Date().getTime()-3600*1000*24*30;
- 검색 파일명 조건 - 파일명 일부 매치
- 파일 확장자 조건 체크
1. 앱스 스크립트(Apps Script) 작성
앞서의 스크립트 코드를 구글 서비스에 적용해서 사용하려면 먼저 구글 앱스 스크립트 사이트로 가서 스크립트를 작성해 등록해야 합니다.
www.google.com/script/start/
사이트를 가면 "Start Scripting" 버튼이 보입니다. 클릭해서 내 앱스 스크립트 메인 페이지로 이동합니다.
메인 페이지를 들어가면 왼쪽에 "새 프로젝트" 버튼이 보입니다. 이걸 클릭해서 새 프로젝트를 만든 후에 열리는 스크립트 입력창(기본으로 "코드.gs" 파일 명인 코드 편집기가 열립니다.)에 앞서의 코드를 복사&붙여넣기 하면 됩니다.
앱스 스크립트를 처음 들어갔으면, "비어있는 프로젝트"가 하나 데모용으로 만들어져 있습니다. 이 빈 프로젝트를 사용해서 스크립트를 작성해도 됩니다.
작성한 스크립트를 저장할 때 프로젝트 이름도 함께 바꿀 수 있으므로 우선 스크립트 작성부터 하면 됩니다. "비어있는 프로젝트" 를 클릭하면 바로 편집기 창이 열립니다.
미리 입력된 "myFunction()" 더미 코드를 모두 지우고 위의 완성된 코드를 모두 복사해서 붙여 넣은 후 수정할 부분을 수정합니다.
스크립트 파일을 저장합니다. 상단의 디스켓 모양 아이콘을 클릭(또는 단축키 "Ctrl+S")하면 됩니다.
파일 1개짜리 스크립트이므로 특별히 파일 이름을 관리할 필요는 없겠지만 스크립트 파일은 이름을 바꿀 수도 있습니다. 파일명 오른쪽의 작은 아래 펼침 화살표를 클릭해서 메뉴를 열면 메뉴 항목 중에 "Rename" 이 있습니다.
편집기 상단의 기능 버튼들은 다음과 같은 역할을 합니다.
처음 저장할 때 "비어있는 프로젝트" 프로젝트인 경우 새 프로젝트 파일을 입력하는 창이 표시됩니다.
적당한 프로젝트 이름을 입력해 저장합니다.
2. 접근 권한 인증
스크립트 파일을 저장한 후 처음 함수를 실행/디버그 하려고 하면 다음과 같은 권한 인증을 요구하는 알림이 표시됩니다. 구글 드라이브에 접근하려면 스크립트가 접근 권한이 설정되어 있어야만 접근이 가능하기 때문에 표시되는 메시지입니다.
"권한 검토" 버튼을 클릭합니다.
권한을 부여할 내 구글 계정을 확인하는 대화상자가 표시됩니다. 권한을 부여할 내 구글 계정을 선택합니다.
"확인되지 않은 앱" 이라는 경고 메시지가 뜹니다. 모든 앱스 스크립트 코드는 구글에서 리뷰를 거치게 됩니다.
자동 프로그램이 문제 없는 스크립트 인지를 확인하는 정도지만, 확인 과정이 며칠 걸리기도 하기 때문에, 그전에 디버그/실행, 또는 스케줄을 등록할 트리거를 추가하려면 기다려야 하는 번거로움이 있습니다.
경고는 경고일 뿐이므로 무시하고 계속 진행할 수 있습니다.
왼쪽의 "고급" 링크를 클릭합니다.
하단에 추가 내용이 표시됩니다. "[프로젝트 이름]로 이동(안전하지 않음)" 링크를 클릭하면 됩니다.
확인이 되고 나면 실행/디버그가 가능해지게 됩니다.
뒤에 스케줄을 등록하는 트리거를 처음 추가할 때도 같은 권한 확인 경고가 표시되므로 같은 과정으로 넘어가면 됩니다.
3. 디버깅
작성한 코드가 제대로 실해되는지 중간 중간 브레이크 포인트를 걸어서 변수 값을 확인해볼 필요가 있습니다.
앱스 스크립트는 아주 불편하고 원시적인 디버거 환경을 제공합니다.
먼저 디버깅 할 함수를 선택합니다.
대상이 되는 파일 목록을 가져오는 "" 함수를 먼저 실행해서 확인해보겠습니다.
함수의 변수를 확인하고 싶은 위치에 브레이크 포인트를 지정하고(줄번호를 클릭) 디버깅 버튼을 누르면 함수가 실행되다 디버깅 포인트에서 멈추게 됩니다.
코드를 보면 중간 중간 "console.info()" 메서드가 있는데, 콘솔에 메시지를 출력해주는 기능을 합니다.
디버거 환경에서 메서드를 출력해서 실시간으로 디버깅 진행 상태를 출력해볼 수 있으면 좋은데, 디버깅 상태에서는 콘솔 메시지 출력 결과를 볼 수 없고, "보기 > 로그" 메뉴를 선택하면 출력된 콘솔 리스트를 확인할 수 있습니다.
함수의 디버그/실행은 풀다운 메뉴 "실행 > 함수 실행/함수 디버그" 에서도 선택적으로 할 수 있습니다.
4. 스케줄 등록(트리거)
디버깅을 해서 잘 실행되는 코드임을 확인했으므로, 일정 간격으로 자동 실행되도록 등록을 해서 관리 스크립트가 자동으로 실행되도록 해야 합니다.
트리거 단축 버튼을 클릭해 트리거 추가 화면으로 이동합니다.
오른쪽 아래 "트리거 추가" 버튼을 클릭합니다.
트리거 추가 폼에서 실행할 함수(위 스크립트는 "DeleteFilesByDateName()" 함수를 선택해야 함), 이벤트 소스는 "시간 기반" 그리고 시간 유형과 타이머 시간/날짜를 선택한 후 "저장" 버튼을 눌러 새 트리거를 등록합니다.
트리거 실패 알림은 "즉시 알림"으로 설정하는 것이 좋습니다.
트리거를 새로 등록할 때도 2번의 접근 권한 확인 작업을 처음 한번 하게 됩니다. 2번에서 한 과정을 그대로 진행합니다.
마지막에는 스크립트가 정말 구글 드라이브에 접근하는 것을 허용할 것인지 확인합니다.
"허용" 버튼을 누르면 트리거 스케줄이 등록되고 정한 시간/날짜 간격으로 자동으로 실행되며, 구글 드라이브 파일을 관리하게 됩니다.
추가된 트리거는 오른쪽 3점 아이콘을 클릭해 메뉴에서 삭제, 실행 등의 관리 작업을 할 수 있습니다.