앱스 스크립트 (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 앱스 스크립트 활용 예시 모음

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

  1. 진짜 댓글을 안남길 수 없습니다. 항상 고맙습니다. ㅠㅠㅠㅠㅠㅠㅠ 진짜 폴더까지 리스팅 해야할 필요가 있었는데.

    좋아요

  2. 혹시 뎁스별로 헤더의 색상을 달리 지정할 수 있는 방법이 있을까요?
    아무래도 한 눈에 뎁스의 레벨이 보이면, 더 활용하기 좋을 것 같아서요!
    코드를 뜯어보는데, 색상 지정이 1줄이라 따로 지정은 안되는 모양이네요. ㅜㅜ

    좋아요

  3. 정말 좋은 정보 감사를 드립니다.
    혹시 리스트를 업데이트 해야 할 경우, 해당 스프레드 시트에서 스크립트 편집기 누르고 이미 저장되어있는 코드가 있으니, 실행만 누르면 될까요?
    아니면 기존 스프레드 시트에
    업데이트 된 부분을 추가 할 수 있는 다른 방법이 있나요?

    좋아요

    1. 리스트를 업데이트 하고 싶으실 때에는 스크립트 편집기에서 get_filelist_with_subfolder 함수를 실행하시면 최신 리스트로 새로 만들어줍니다.

      그리고 도구 > 매크로 > 가져오기 메뉴를 사용하여 get_filelist_with_subfolder 함수를 매크로에 추가하면 스크립트 편집기에 들어가지 않아도 함수를 실행할 수 있습니다.

      매크로에 함수 추가하는 자세한 방법은 아래 포스팅을 참고해주시기 바랍니다.
      앱스 스크립트 사용법 (6) 매크로에 함수 추가하기

      앱스 스크립트 사용법 (6) 매크로에 함수 추가하기

      좋아요

  4. 정말 좋은 정보 감사합니다.
    혹시 구글드라이브 문서들의 공유상태(예를들어 비공개/외부공개 등) 설정도 받아올수있을까요??

    좋아요

  5. 안녕하세요. 스마트요원님 덕분에 편리하게 작업하게 되어 정말 감사드립니다…! 이에 더해 작업하면서 추가적인 질문이 생겨서 여쭤보고 싶어서요. ㅎㅎ
    혹시 스크립트 실행 후, 한 개의 폴더 내에 여러 개의 파일에 대해서 각각 다른 셀에 출력하는 것이 아닌, 한 개의 폴더마다 한 개의 셀 안에 (쉼표를 구분기호로 하여) 파일리스트를 합쳐서 출력할 수 있을까요 ?

    ex. (파일001.jpg, 파일002.jpg, 파일003.jpg …)

    다시한번 정말 감사드립니다. 많이 배웠습니다…!

    좋아요

    1. 안녕하세요. 스마트요원입니다.

      스크립트 실행 후 결과 시트의 데이터에 몇가지 함수를 활용하면
      한개의 셀에 파일 리스트를 합치는 것이 가능합니다.

      결과 시트 옆에 새로운 시트를 만드시고,
      1. unique 함수를 사용하여 중복되지 않는 폴더 리스트를 만듭니다.
      2. textjoin 함수를 사용하여 쉼표”, “를 구분기호로 지정하고,
      filter함수를 사용하여 폴더 이름에 해당하는 파일 이름의 리스트를
      textjoin의 입력값으로 지정하면 됩니다.

      자세한 것은 예시 스프레드시트를 확인해주시기 바랍니다.
      https://docs.google.com/spreadsheets/d/1DaQKvW8i-TOnKaNv2_tZv8yU—VXnEHhT5Tf0wkTrQ/edit#gid=1294931540

      Liked by 1명

  6. 정말 감사합니다.
    구글 드라이브 내 ‘공유 드라이브’에서 실행해 보니 오류가 발생합니다.
    스마트요원님께서 한번 살펴봐 주시면 감사하겠습니다.

    좋아요

댓글 남기기