앱스 스크립트 (10) 구글 드라이브 폴더 내 파일리스트 추출 (확장판) 하위 폴더 포함

이번에는  앱스 스크립트 사용법 (9) 구글 드라이브 폴더 내 파일리스트 추출을 한번 더 확장해서 스프레드시트가 있는 구글 드라이브 폴더에 있는 하위 폴더를 포함한 파일 리스트를 만들어주는 시트를 만들어 보겠습니다.

개요

  1. 하위 폴더를 포함하는 파일 리스트를 만들고 싶은 구글 드라이브 특정 폴더에 스프레드시트를 만든다.
  2. 앱스 스크립트로 스프레드시트가 있는 폴더의 하위 폴더를 포함하는 파일 리스트 정보를 가져온다.
  3. 앱스 스크립트로 스프레드시트에 하위 폴더를 포함한 파일 리스트 정보를 출력한다.

★샘플 폴더
https://docs.google.com/spreadsheets/d/17sDmX40VDB-ua-qDzcYkKDvztAtm4AjmKTRdGD8rZyc/edit?usp=sharing

Google Apps Script 개발자 사이트에서 참고한 페이지

시트 준비하기

파일 리스트를 만들고 싶은 폴더에 새로운 스프레드시트를 만듭니다.

스프레드시트 이름이나 시트 이름은 달라도 상관없습니다.

앱스 스크립트를 작성

도구 > 스크립트 편집기 메뉴를 클릭합니다.

스크립트 편집 화면에 아래 코드를 넣고 저장합니다.

function get_filelist_with_subfolder() {
  
  // get This Folder 
  var thisFile = DriveApp.getFileById(SpreadsheetApp.getActive().getId());
  var folders = thisFile.getParents()
  var folderId;
  while (folders.hasNext()) {
    var folder = folders.next();
    folderId = folder.getId();
    break;
  }
  
  // get ID of This Folder 
  var daforder = DriveApp.getFolderById(folderId);
  
  // clear this sheet
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();

  var srow = 1;
  // Set Header
  sheet.getRange(srow, 1).setValue("폴더");
  sheet.getRange(srow, 2).setValue("파일");
  sheet.getRange(srow, 3).setValue("만들어진 날짜");
  sheet.getRange(srow, 4).setValue("마지막으로 수정한 날짜");
  sheet.getRange(srow, 5).setValue("소유자");
  sheet.getRange(srow, 6).setValue("file type");
  sheet.getRange(srow, 7).setValue("file size (Mb)");
  sheet.getRange(srow, 8).setValue("Link");
  // Set Header Color
  var range = sheet.getRange("A1:H1");
  range.setBackground("#d9d9d9");
  // Set Format of URL link
  range = sheet.getRange("H:H");
  range.setWrapStrategy(SpreadsheetApp.WrapStrategy.CLIP);

  // write file list from This Folder
  var name_thisfolder = daforder.getName();
  _write_file_from_folder(daforder, sheet, name_thisfolder);

  // sub folders
  var depth1_folders = daforder.getFolders();
  while(depth1_folders.hasNext()){
    var depth1_folder = depth1_folders.next();
    // Logger.log(" this: " + name_thisfolder + " sub: " + subfolder.getName());
    name_folder = name_thisfolder + ">" + depth1_folder.getName();
    _write_file_from_folder( depth1_folder, sheet, name_folder )

    var depth2_folders = depth1_folder.getFolders();
    while(depth2_folders.hasNext()){
      var depth2_folder = depth2_folders.next();
      name_folder = name_thisfolder + ">" + depth1_folder.getName() + ">" + depth2_folder.getName();
      _write_file_from_folder( depth2_folder, sheet, name_folder )

      var depth3_folders = depth2_folder.getFolders();
      while(depth3_folders.hasNext()){
        var depth3_folder = depth3_folders.next();
        name_folder = name_thisfolder + ">" + depth1_folder.getName() + ">" 
          + depth2_folder.getName() + ">" + depth3_folder.getName();
        _write_file_from_folder( depth3_folder, sheet, name_folder )
      } // end while depth3

    } // end while depth2

  } // end while depth1

}

/**
 * 폴더 내 파일 리스트를 시트에 쓰기
 */
function _write_file_from_folder(ifolder, isheet, ifolder_name){
  var dafiles = ifolder.getFiles();
 
  // write folder info
  var srow = isheet.getLastRow() + 1;
  isheet.getRange(srow, 1).setValue(ifolder_name);
  isheet.getRange(srow, 3).setValue(ifolder.getDateCreated());
  isheet.getRange(srow, 4).setValue(ifolder.getLastUpdated());
  isheet.getRange(srow, 6).setValue("FOLDER");
  isheet.getRange(srow, 8).setValue(ifolder.getUrl());
  
  var range = isheet.getRange("A"+srow+":H"+srow);
  range.setBackground("#f3f3f3");

  // write file list 파일 리스트 쓰기
  while(dafiles.hasNext()){
    var dafile = dafiles.next();
    var file_name = dafile.getName();
    
    srow = srow + 1;
    // Write file info
    isheet.getRange(srow, 1).setValue(ifolder_name); // 폴더 이름
    isheet.getRange(srow, 2).setValue(file_name); // 파일 이름
    isheet.getRange(srow, 3).setValue(dafile.getDateCreated()); // 만들어진 날짜
    isheet.getRange(srow, 4).setValue(dafile.getLastUpdated()); // 마지막으로 수정한 날짜
    isheet.getRange(srow, 5).setValue(dafile.getOwner().getName()); // 소유자
    isheet.getRange(srow, 6).setValue(dafile.getMimeType().replace('application/vnd.google-apps.', 'google ')); // 파일 종류
    isheet.getRange(srow, 7).setValue(dafile.getSize() / (1024 * 1024) ); // 파일 사이즈
    isheet.getRange(srow, 8).setValue(dafile.getUrl()); // 파일 url
  }
  
}

프로젝트 이름은 get_filelist_include_subFolder 라고 저장합니다.

디버그 옆에 함수 이름이 “get_filelist_with_subfolder”로 되어 있는 것을 확인한 후,
실행 버튼을 클릭합니다.

처음 실행하실 때, 권한 요청을 해옵니다. 실행을 허용해주세요.
(스크린샷은 생략합니다. 자세한 내용은 앱스 스크립트 사용법 (1) 메일 보내기 > 실행 권한 허용 을 확인해주세요.)

스크립트 실행

스크립트를 허용 후 실행하면 시트에 하위 폴더를 포함한 파일 리스트가 작성된 것을 확인할 수 있습니다. 단, 열의 너비는 리스트 추출 후에 데이터에 맞게 적절하게 조절하였습니다.

★샘플 스프레드시트

폴더 안에서 찾은 파일마다 폴더 이름, 파일 이름, 만들어진 날짜, 마지막으로 수정한 날짜, 소유자, file type, file size (단위 Mb), Link 정보를 출력합니다.

주의점

이번에 공개한 코드에서는 하위 폴더를 무제한으로 추출하지는 않습니다.
Depth(깊이)를 3까지만 가져옵니다.

  • 현재 폴더 >
    • 파일리스트 추출할 스프레드시트
    • 하위 폴더 Depth 1 >
      • 하위 폴더 Depth 2 >
        • 하위 폴더 Depth 3 > ←여기까지만 추출

Depth를 늘릴 수는 있습니다만, 코드가 너무 길어지기 때문에 Depth 3까지만 추출하도록 만들었습니다.



구글 앱스 스크립트의 다른 활용법
을 알고싶으시다면!
» G Suite 사용법 #5 앱스 스크립트 활용 예시 모음

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중