-
[Google WorkSpace] 구글 드라이브 내 파일 리스트 만들기2024년 02월 08일
- 유니얼
-
작성자
-
2024.02.08.:56
728x90Google Apps Script를 사용하면 Google 스프레드시트에서 구글 드라이브 내 파일 및 폴더의 목록을 가져와서 편리하게 관리할 수 있습니다. 이를 통해 파일 및 폴더의 속성과 함께 구글 드라이브의 내용을 분석하고 시각화할 수 있습니다. 맨 아래에 있는 전체코드를 Apps Scripts에 복사 붙혀넣기하시면 됩니다.
Apps Scripts 시작하기
Google Apps Script는 JavaScript 기반의 클라우드 기반 스크립팅 언어로, Google 서비스와 상호작용할 수 있는 강력한 기능을 제공합니다. 먼저 구글 스프레드시트를 만들고, 확장 프로그램-> Apps Script를 통해서 Apps Script를 작성할 수 있습니다.
1. 초기 설정
먼저 Google Apps Script를 사용하여 구글 드라이브 내 파일 목록을 가져오기 위해 초기 설정을 진행해야 합니다.
/** * 메인 함수: 스프레드시트를 초기화하고, 현재 폴더에서부터 파일 리스트를 가져오는 작업을 시작합니다. */ function getFilesListIncludingSubfolders() { const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 현재 활성 스프레드시트를 가져옴 const sheet = spreadsheet.getActiveSheet(); // 현재 활성 시트를 가져옴 sheet.clear(); // 시트를 클리어함 setSpreadsheetHeaders(sheet); // 헤더 설정 함수 호출 const file = DriveApp.getFileById(spreadsheet.getId()); // 현재 스프레드시트 파일을 가져옴 const folders = file.getParents(); // 현재 스프레드시트의 상위 폴더를 가져옴 if (!folders.hasNext()) return; // 상위 폴더가 없다면 함수 종료 const parentFolder = folders.next(); // 상위 폴더를 가져옴 writeFolderContentsRecursive(parentFolder, sheet, parentFolder.getName(), ""); // 상위 폴더의 내용을 재귀적으로 작성하는 함수 호출 }
2. 헤더 설정
스프레드시트에는 파일 및 폴더의 속성을 표시하기 위해 헤더가 필요합니다. 아래 함수는 스프레드시트의 헤더를 설정합니다.
/** * 스프레드시트 헤더를 설정합니다. * @param {object} sheet - 현재 작업중인 시트 객체입니다. */ function setSpreadsheetHeaders(sheet) { const headersBackgroundColor = "#4A86E8"; // 헤더 배경색 설정 const headersFontColor = "#FFFFFF"; // 헤더 글꼴 색상 설정 const headers = ["폴더", "파일", "만들어진 날짜", "마지막으로 수정한 날짜", "소유자", "파일 유형", "파일 크기 (Mb)", "링크", "이미지 미리보기"]; // 헤더 제목 설정 const range = sheet.getRange("A1:I1"); // 헤더가 될 범위 설정 range.setValues([headers]); // 헤더 제목을 셀에 설정 range.setBackground(headersBackgroundColor); // 헤더 배경색 적용 range.setFontColor(headersFontColor); // 헤더 글꼴 색상 적용 range.setFontWeight("bold"); // 헤더 글꼴을 굵게 설정 }
3. 파일 및 폴더 내용 작성
아래 함수는 주어진 폴더 및 하위 폴더의 파일을 재귀적으로 스프레드시트에 작성합니다.
/** * 지정된 폴더와 그 하위 폴더의 모든 파일을 재귀적으로 스프레드시트에 기록합니다. * @param {object} folder - 탐색할 폴더 객체입니다. * @param {object} sheet - 데이터를 기록할 시트 객체입니다. * @param {string} folderName - 현재 탐색 중인 폴더의 이름입니다. * @param {string} prefix - 현재 폴더의 경로 접두사입니다. */ // 폴더 내용을 재귀적으로 작성하는 함수 function writeFolderContentsRecursive(folder, sheet, folderName, prefix) { const folderPath = prefix + folderName; // 폴더 경로 생성 const files = folder.getFiles(); // 폴더 내 파일 가져오기 const subfolders = folder.getFolders(); // 폴더 내 하위 폴더 가져오기 var folderWritten = false; // 폴더가 기록되었는지 여부를 추적하는 플래그 // 폴더 내 파일 정보 기록 while (files.hasNext()) { if (!folderWritten) { // 폴더 정보를 아직 기록하지 않았다면 기록 const row = sheet.getLastRow() + 1; // 새 행 위치 계산 const folderData = [folderPath, "", "", "", "", "FOLDER", "", folder.getUrl(), ""]; // 폴더 데이터 배열 생성 sheet.getRange(row, 1, 1, folderData.length).setValues([folderData]).setBackground("#c9daf8"); // 폴더 데이터를 시트에 기록하고 배경색 설정 folderWritten = true; // 폴더 정보가 기록되었다고 플래그 설정 } const file = files.next(); // 다음 파일 가져오기 writeFileRow(sheet, file, folderPath); // 파일 정보를 시트에 기록하는 함수 호출 } // 하위 폴더 탐색 while (subfolders.hasNext()) { const subfolder = subfolders.next(); // 다음 하위 폴더 가져오기 writeFolderContentsRecursive(subfolder, sheet, subfolder.getName(), folderPath + " > "); // 하위 폴더 내용을 재귀적으로 작성하는 함수 호출 } } /** * 주어진 폴더 정보를 스프레드시트에 기록합니다. * @param {object} sheet - 데이터를 기록할 시트 객체입니다. * @param {object} folder - 정보를 기록할 폴더 객체입니다. * @param {string} folderPath - 폴더의 경로입니다. */ function writeFolderInfo(sheet, folder, folderPath) { const folderBackgroundColor = "#D9EAD3"; // 폴더 배경색 설정 const row = sheet.getLastRow() + 1; // 새 행 위치 계산 const data = [folderPath, "", "", "", "", "FOLDER", "", folder.getUrl(), ""]; // 폴더 데이터 배열 생성 const range = sheet.getRange(row, 1, 1, data.length); // 데이터가 기록될 범위 설정 range.setValues([data]); // 데이터를 시트에 기록 range.setBackground(folderBackgroundColor); // 배경색 설정 sheet.setRowHeight(row, 30); // 행 높이 설정 }
4. 파일 유형 그룹화
파일의 MIME 타입을 기반으로 파일 유형을 그룹화합니다.
/** * 파일의 MIME 타입에 따라 파일 유형 그룹을 반환합니다. * @param {string} mimeType - 파일의 MIME 타입입니다. * @returns {string} - 파일 유형 그룹 이름을 반환합니다. */ function getFileTypeGroup(mimeType) { if (mimeType.startsWith('image/')) { return '이미지'; } else if (mimeType.startsWith('video/')) { return '비디오'; } else if (mimeType.startsWith('audio/')) { return '오디오'; } else if (mimeType.includes('document') || mimeType.includes('text') || mimeType.includes('pdf')) { return '문서'; } else if (mimeType.includes('spreadsheet')) { return '스프레드시트'; } else if (mimeType.includes('presentation')) { return '프레젠테이션'; } else { return '기타'; } } /** * 스프레드시트에 파일 정보를 새로운 행으로 기록합니다. * @param {object} sheet - 데이터를 기록할 시트 객체입니다. * @param {object} file - 정보를 기록할 파일 객체입니다. * @param {string} folderPath - 파일이 위치한 폴더의 경로입니다. */ function writeFileRow(sheet, file, folderPath) { // 파일 배경색을 흰색으로 설정합니다. const fileBackgroundColor = "#FFFFFF"; // 새로운 데이터를 기록할 행 번호를 계산합니다. const row = sheet.getLastRow() + 1; // 파일 크기를 메가바이트 단위로 변환하고 소수점 둘째 자리까지 표시합니다. const fileSizeMb = (file.getSize() / 1048576).toFixed(2); // 파일 유형을 분류합니다. (예: '이미지', '문서' 등) const fileTypeGroup = getFileTypeGroup(file.getMimeType()); // 스프레드시트에 기록할 데이터 배열을 준비합니다. const data = [ folderPath, // 파일이 위치한 폴더 경로 file.getName(), // 파일 이름 file.getDateCreated(), // 파일 생성 날짜 file.getLastUpdated(), // 파일이 마지막으로 수정된 날짜 file.getOwner().getEmail(), // 파일 소유자의 이메일 fileTypeGroup, // 파일 유형 그룹 fileSizeMb, // 파일 크기 (MB) file.getUrl(), // 파일 URL " " // 이미지 미리보기를 위한 공간 (초기값은 공백) ]; // 스프레드시트에 데이터를 기록할 범위를 지정하고 데이터를 기록합니다. const range = sheet.getRange(row, 1, 1, data.length); range.setValues([data]); range.setBackground(fileBackgroundColor); // 배경색을 설정합니다. // 파일 유형이 이미지인 경우 썸네일 이미지 미리보기를 삽입합니다. if (fileTypeGroup === '이미지') { var thumbnailUrl = getFileThumbnailUrl(file.getId()); if (thumbnailUrl) { insertImageFromUrl(thumbnailUrl, row, 9, sheet); } sheet.setRowHeight(row, 200); // 이미지 미리보기를 위해 행 높이를 조정합니다. } else { sheet.setRowHeight(row, 20); // 이미지가 아닌 경우 표준 행 높이를 설정합니다. } } // Google Drive API를 사용하여 파일의 썸네일 URL을 가져옵니다. function getFileThumbnailUrl(fileId) { // 파일의 썸네일을 가져오기 위한 Google Drive API URL을 구성합니다. var url = "https://www.googleapis.com/drive/v3/files/" + fileId + "?fields=thumbnailLink&key=" + API_KEY; // API 요청을 수행합니다. 인증 토큰을 헤더에 포함시킵니다. var response = UrlFetchApp.fetch(url, {headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}}); // 응답 데이터를 JSON 형태로 파싱합니다. var data = JSON.parse(response.getContentText()); // 썸네일 링크를 반환합니다. return data.thumbnailLink; } // 주어진 URL에서 이미지를 가져와서 스프레드시트의 지정된 셀에 삽입합니다. function insertImageFromUrl(imageUrl, rowIndex, colIndex, sheet) { // 이미지 URL이 유효한지 확인합니다. if (!imageUrl || imageUrl === "") { console.error("이미지 URL이 유효하지 않습니다."); return; } // 삽입하려는 셀의 위치가 시트의 범위 내에 있는지 확인합니다. if (rowIndex < 1 || colIndex < 1 || rowIndex > sheet.getMaxRows() || colIndex > sheet.getMaxColumns()) { console.error("이미지를 삽입하려는 셀이 시트의 범위를 벗어났습니다."); return; } // `=image` 수식을 사용하여 셀에 이미지 URL을 삽입합니다. sheet.getRange(rowIndex, colIndex).setFormula('=image("' + imageUrl + '", 2)'); }
5. 마무리-전체코드
Google Apps Script를 사용하여 구글 드라이브의 파일 및 폴더 목록을 스프레드시트에 효과적으로 작성하는 방법에 대해 알아보았습니다. 이를 통해 구글 드라이브의 내용을 분석하고 시각화하여 효율적으로 관리할 수 있습니다.
// Replace 'YOUR_API_KEY' with your actual API key var API_KEY = 'YOUR_API_KEY'; /** * 메인 함수: 스프레드시트를 초기화하고, 현재 폴더에서부터 파일 리스트를 가져오는 작업을 시작합니다. */ function getFilesListIncludingSubfolders() { const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 현재 활성 스프레드시트를 가져옴 const sheet = spreadsheet.getActiveSheet(); // 현재 활성 시트를 가져옴 sheet.clear(); // 시트를 클리어함 setSpreadsheetHeaders(sheet); // 헤더 설정 함수 호출 const file = DriveApp.getFileById(spreadsheet.getId()); // 현재 스프레드시트 파일을 가져옴 const folders = file.getParents(); // 현재 스프레드시트의 상위 폴더를 가져옴 if (!folders.hasNext()) return; // 상위 폴더가 없다면 함수 종료 const parentFolder = folders.next(); // 상위 폴더를 가져옴 writeFolderContentsRecursive(parentFolder, sheet, parentFolder.getName(), ""); // 상위 폴더의 내용을 재귀적으로 작성하는 함수 호출 } /** * 스프레드시트 헤더를 설정합니다. * @param {object} sheet - 현재 작업중인 시트 객체입니다. */ function setSpreadsheetHeaders(sheet) { const headersBackgroundColor = "#4A86E8"; // 헤더 배경색 설정 const headersFontColor = "#FFFFFF"; // 헤더 글꼴 색상 설정 const headers = ["폴더", "파일", "만들어진 날짜", "마지막으로 수정한 날짜", "소유자", "파일 유형", "파일 크기 (Mb)", "링크", "이미지 미리보기"]; // 헤더 제목 설정 const range = sheet.getRange("A1:I1"); // 헤더가 될 범위 설정 range.setValues([headers]); // 헤더 제목을 셀에 설정 range.setBackground(headersBackgroundColor); // 헤더 배경색 적용 range.setFontColor(headersFontColor); // 헤더 글꼴 색상 적용 range.setFontWeight("bold"); // 헤더 글꼴을 굵게 설정 } /** * 지정된 폴더와 그 하위 폴더의 모든 파일을 재귀적으로 스프레드시트에 기록합니다. * @param {object} folder - 탐색할 폴더 객체입니다. * @param {object} sheet - 데이터를 기록할 시트 객체입니다. * @param {string} folderName - 현재 탐색 중인 폴더의 이름입니다. * @param {string} prefix - 현재 폴더의 경로 접두사입니다. */ // 폴더 내용을 재귀적으로 작성하는 함수 function writeFolderContentsRecursive(folder, sheet, folderName, prefix) { const folderPath = prefix + folderName; // 폴더 경로 생성 const files = folder.getFiles(); // 폴더 내 파일 가져오기 const subfolders = folder.getFolders(); // 폴더 내 하위 폴더 가져오기 var folderWritten = false; // 폴더가 기록되었는지 여부를 추적하는 플래그 // 폴더 내 파일 정보 기록 while (files.hasNext()) { if (!folderWritten) { // 폴더 정보를 아직 기록하지 않았다면 기록 const row = sheet.getLastRow() + 1; // 새 행 위치 계산 const folderData = [folderPath, "", "", "", "", "FOLDER", "", folder.getUrl(), ""]; // 폴더 데이터 배열 생성 sheet.getRange(row, 1, 1, folderData.length).setValues([folderData]).setBackground("#c9daf8"); // 폴더 데이터를 시트에 기록하고 배경색 설정 folderWritten = true; // 폴더 정보가 기록되었다고 플래그 설정 } const file = files.next(); // 다음 파일 가져오기 writeFileRow(sheet, file, folderPath); // 파일 정보를 시트에 기록하는 함수 호출 } // 하위 폴더 탐색 while (subfolders.hasNext()) { const subfolder = subfolders.next(); // 다음 하위 폴더 가져오기 writeFolderContentsRecursive(subfolder, sheet, subfolder.getName(), folderPath + " > "); // 하위 폴더 내용을 재귀적으로 작성하는 함수 호출 } } /** * 주어진 폴더 정보를 스프레드시트에 기록합니다. * @param {object} sheet - 데이터를 기록할 시트 객체입니다. * @param {object} folder - 정보를 기록할 폴더 객체입니다. * @param {string} folderPath - 폴더의 경로입니다. */ function writeFolderInfo(sheet, folder, folderPath) { const folderBackgroundColor = "#D9EAD3"; // 폴더 배경색 설정 const row = sheet.getLastRow() + 1; // 새 행 위치 계산 const data = [folderPath, "", "", "", "", "FOLDER", "", folder.getUrl(), ""]; // 폴더 데이터 배열 생성 const range = sheet.getRange(row, 1, 1, data.length); // 데이터가 기록될 범위 설정 range.setValues([data]); // 데이터를 시트에 기록 range.setBackground(folderBackgroundColor); // 배경색 설정 sheet.setRowHeight(row, 30); // 행 높이 설정 } /** * 파일의 MIME 타입에 따라 파일 유형 그룹을 반환합니다. * @param {string} mimeType - 파일의 MIME 타입입니다. * @returns {string} - 파일 유형 그룹 이름을 반환합니다. */ function getFileTypeGroup(mimeType) { if (mimeType.startsWith('image/')) { return '이미지'; } else if (mimeType.startsWith('video/')) { return '비디오'; } else if (mimeType.startsWith('audio/')) { return '오디오'; } else if (mimeType.includes('document') || mimeType.includes('text') || mimeType.includes('pdf')) { return '문서'; } else if (mimeType.includes('spreadsheet')) { return '스프레드시트'; } else if (mimeType.includes('presentation')) { return '프레젠테이션'; } else { return '기타'; } } /** * 스프레드시트에 파일 정보를 새로운 행으로 기록합니다. * @param {object} sheet - 데이터를 기록할 시트 객체입니다. * @param {object} file - 정보를 기록할 파일 객체입니다. * @param {string} folderPath - 파일이 위치한 폴더의 경로입니다. */ function writeFileRow(sheet, file, folderPath) { // 파일 배경색을 흰색으로 설정합니다. const fileBackgroundColor = "#FFFFFF"; // 새로운 데이터를 기록할 행 번호를 계산합니다. const row = sheet.getLastRow() + 1; // 파일 크기를 메가바이트 단위로 변환하고 소수점 둘째 자리까지 표시합니다. const fileSizeMb = (file.getSize() / 1048576).toFixed(2); // 파일 유형을 분류합니다. (예: '이미지', '문서' 등) const fileTypeGroup = getFileTypeGroup(file.getMimeType()); // 스프레드시트에 기록할 데이터 배열을 준비합니다. const data = [ folderPath, // 파일이 위치한 폴더 경로 file.getName(), // 파일 이름 file.getDateCreated(), // 파일 생성 날짜 file.getLastUpdated(), // 파일이 마지막으로 수정된 날짜 file.getOwner().getEmail(), // 파일 소유자의 이메일 fileTypeGroup, // 파일 유형 그룹 fileSizeMb, // 파일 크기 (MB) file.getUrl(), // 파일 URL " " // 이미지 미리보기를 위한 공간 (초기값은 공백) ]; // 스프레드시트에 데이터를 기록할 범위를 지정하고 데이터를 기록합니다. const range = sheet.getRange(row, 1, 1, data.length); range.setValues([data]); range.setBackground(fileBackgroundColor); // 배경색을 설정합니다. // 파일 유형이 이미지인 경우 썸네일 이미지 미리보기를 삽입합니다. if (fileTypeGroup === '이미지') { var thumbnailUrl = getFileThumbnailUrl(file.getId()); if (thumbnailUrl) { insertImageFromUrl(thumbnailUrl, row, 9, sheet); } sheet.setRowHeight(row, 200); // 이미지 미리보기를 위해 행 높이를 조정합니다. } else { sheet.setRowHeight(row, 20); // 이미지가 아닌 경우 표준 행 높이를 설정합니다. } } // Google Drive API를 사용하여 파일의 썸네일 URL을 가져옵니다. function getFileThumbnailUrl(fileId) { // 파일의 썸네일을 가져오기 위한 Google Drive API URL을 구성합니다. var url = "https://www.googleapis.com/drive/v3/files/" + fileId + "?fields=thumbnailLink&key=" + API_KEY; // API 요청을 수행합니다. 인증 토큰을 헤더에 포함시킵니다. var response = UrlFetchApp.fetch(url, {headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}}); // 응답 데이터를 JSON 형태로 파싱합니다. var data = JSON.parse(response.getContentText()); // 썸네일 링크를 반환합니다. return data.thumbnailLink; } // 주어진 URL에서 이미지를 가져와서 스프레드시트의 지정된 셀에 삽입합니다. function insertImageFromUrl(imageUrl, rowIndex, colIndex, sheet) { // 이미지 URL이 유효한지 확인합니다. if (!imageUrl || imageUrl === "") { console.error("이미지 URL이 유효하지 않습니다."); return; } // 삽입하려는 셀의 위치가 시트의 범위 내에 있는지 확인합니다. if (rowIndex < 1 || colIndex < 1 || rowIndex > sheet.getMaxRows() || colIndex > sheet.getMaxColumns()) { console.error("이미지를 삽입하려는 셀이 시트의 범위를 벗어났습니다."); return; } // `=image` 수식을 사용하여 셀에 이미지 URL을 삽입합니다. sheet.getRange(rowIndex, colIndex).setFormula('=image("' + imageUrl + '", 2)'); }
결론
Google Apps Script를 사용하여 Google 드라이브 내 파일 및 폴더 목록을 스프레드시트에 효과적으로 작성하는 방법에 대해 알게 되었습니다. 이를 통해 파일 및 폴더의 속성과 함께 구글 드라이브의 내용을 분석하고 시각화할 수 있습니다. Google Apps Script의 더 많은 기능을 탐구하여 업무 효율성을 높이고 생산성을 향상시킬 수 있습니다.
반응형다음글이전글이전 글이 없습니다.댓글