• 티스토리 홈
  • 프로필사진
    유니얼
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
유니얼
  • 프로필사진
    유니얼
    • 분류 전체보기 (295)
      • Unity (17)
        • 게임 개발 (5)
      • Unreal (24)
        • 게임 개발 (20)
      • DirectX (36)
      • 코딩테스트 (91)
        • 프로그래머스 (25)
        • 백준 (66)
      • Google Workspace (1)
      • Programing (102)
        • C# (68)
        • C++ (24)
        • JavaScript (10)
      • 게임 서버 프로그래밍 (17)
      • Web (6)
        • 슈퍼코딩 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
    등록된 댓글이 없습니다.
  • 최근 공지
    등록된 공지가 없습니다.
# Home
# 공지사항
#
# 태그
# 검색결과
# 방명록
  • [Google WorkSpace] 구글 드라이브 내 파일 리스트 만들기
    2024년 02월 08일
    • 유니얼
    • 작성자
    • 2024.02.08.:56
    728x90

    Google Apps Script를 사용하면 Google 스프레드시트에서 구글 드라이브 내 파일 및 폴더의 목록을 가져와서 편리하게 관리할 수 있습니다. 이를 통해 파일 및 폴더의 속성과 함께 구글 드라이브의 내용을 분석하고 시각화할 수 있습니다. 맨 아래에 있는 전체코드를 Apps Scripts에 복사 붙혀넣기하시면 됩니다.

     

    Result

    Apps Scripts 시작하기

    Google Apps Script는 JavaScript 기반의 클라우드 기반 스크립팅 언어로, Google 서비스와 상호작용할 수 있는 강력한 기능을 제공합니다. 먼저 구글 스프레드시트를 만들고, 확장 프로그램-> Apps Script를 통해서 Apps Script를 작성할 수 있습니다.

     

    Apps_Script_StartAppsScripts

    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의 더 많은 기능을 탐구하여 업무 효율성을 높이고 생산성을 향상시킬 수 있습니다.

    반응형
    다음글
    다음 글이 없습니다.
    이전글
    이전 글이 없습니다.
    댓글
조회된 결과가 없습니다.
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
목차
표시할 목차가 없습니다.
    • 안녕하세요
    • 감사해요
    • 잘있어요

    티스토리툴바