달나라 노트

Google Apps Script : getFolderById, getFoldersByName (Folder 정보 얻기, Folder 객체 얻기.) 본문

Google Apps Script

Google Apps Script : getFolderById, getFoldersByName (Folder 정보 얻기, Folder 객체 얻기.)

CosmosProject 2022. 11. 21. 20:48
728x90
반응형

 

 

 

Google Apps Script에서 폴더 정보를 얻어주는 method는 두 가지가 있습니다.

 

getFolderById()와 getFoldersByName() 입니다.

 

 

Syntax

DriveApp.getFolderById(folder_id)
DriveApp.getFoldersByName(folder_name)

 

getFolderById()는 말그대로 folder의 고유 ID를 통해 해당 folder의 객체를 얻어옵니다.

getFoldersByName()은 folder의 이름을 통해 folder의 객체들을 얻어옵니다.

 

이 둘은 같을까요?

정답은 같지만 다릅니다.

 

위 method를 본격적으로 알아보기 전에 알아둬야 할 배경 지식이 있습니다.

 

Google Drive에서는 폴더이건 파일이건 중복 이름이 있을 수 있습니다.

보통 컴퓨터에선 중복된 파일 이름이나 중복된 폴더 이름이 동일한 위치에 있는 것은 허용되지 않습니다.

근데 Google Drive에서는 가능합니다.

 

 

제 Google Drive의 일부입니다.

보면 folder_1이라는 이름을 가진 폴더가 2개 존재합니다. 그것도 같은 위치예요.

my_test 라는 spreadsheet도 2개가 존재합니다. 물론 같은 위치예요.

 

어떻게 이게 가능한 것일까요?

 

바로 ID 덕분입니다.

 

Google Drive는 파일이나 폴더를 관리할 때 단순히 파일이나 폴더의 이름만 고려하는게 아닙니다.

각각의 파일이나 폴더는 숫자, 알파벳 대소문자, -, _ 로 구성된 ID를 가집니다.

따라서 폴더나 파일의 이름이 완전히 동일해보여도 실제로 이 ID로 구분되고있기 때문에 동일한 이름을 가진 폴더를 생성하는 것이 가능한 것이죠.

(반대로 말하면 폴더나 파일의 이름은 동일할 수 있지만 폴더나 파일의 ID는 겹칠 수 없고 모두 다르다고 할 수 있습니다.)

 

 

getFolderById()는 말그대로 folder의 고유 ID를 통해 해당 folder의 객체를 얻어옵니다.

getFoldersByName()은 folder의 이름을 통해 folder의 객체들을 얻어옵니다.

 

이제 위 말을 다시 봅시다.

getFolderById() method는 ID를 통해 Folder 객체를 얻어옵니다. 위에서 ID라는 속성은 그 어떤 다른 폴더나 파일과도 동일할 수 없으므로 getFolderById() method는 주어진 ID를 가진 딱 하나의 folder에 대한 객체만을 return합니다.

 

getFoldersByName() method는 folder의 이름을 통해 해당 이름을 가진 folder들의 객체를 얻어옵니다.

Google Drive에는 동일한 이름을 가진 folder가 존재할 수 있다고 했으므로 getFoldersByName()으로 return되는 folder 객체는 하나가 아닐 수 있죠.

따라서 getFoldersByName() method는 folder 객체를 묶어놓은 collection을 return합니다.

 

그렇기 때문에 hasNext(), next() method를 사용해서 접근해야 합니다.

 

hasNext(), next() method에 대한 개념을 잘 알지 못한다면 다음 링크를 참고하면 좋습니다.

https://cosmosproject.tistory.com/703

 

 

여기서 method이름을 잘 보면 ID는 고유하기 때문에 특정 ID를 가진 folder는 딱 하나이며 따라서 method의 이름이getFolderById() 입니다.

반대로 동일한 이름을 가진 folder가 여러 개 일 수 있기 때문에 method 이름이 getFoldersByName() 인 것을 알 수 있습니다.

Folder에 s가 붙고 안붙고의 차이가 있죠.

 

 

 

 

 

 

 

 

 

 

function myFunction() {
  var folder = DriveApp.getFolderById('1BW1T6m0qFsaOoNyZlZXR1vl_JRy6JB2K');
  
  Logger.log(folder.getName());
  Logger.log(folder.getId());
}


-- Result
folder_1
1BW1T6m0qFsaOoNyZlZXR1vl_JRy6JB2K

 

getFolderById() method를 통해 ID가 1BW1T6m0qFsaOoNyZlZXR1vl_JRy6JB2K 이고 이름이 folder_1인 폴더의 객체를 얻어오는 예시입니다.

 

- var folder = DriveApp.getFolderById('1BW1T6m0qFsaOoNyZlZXR1vl_JRy6JB2K');

ID가 1BW1T6m0qFsaOoNyZlZXR1vl_JRy6JB2K 인 folder에 대한 객체를 얻어옵니다.

 

 

- Logger.log(folder.getName());
- Logger.log(folder.getId());

folder 객체에 대해 getName() method로 폴더의 이름을 얻어오고, getId() method를 통해 폴더의 ID를 얻어옵니다.

 

 

위 결과를 보면 잘 얻어와진 것을 알 수 있죠.

 

 

 

 

 

 

function myFunction() {
  var folders = DriveApp.getFoldersByName('folder_1');
  
  while (folders.hasNext()) {
    var folder = folders.next();

    Logger.log(folder.getName());
    Logger.log(folder.getId());
  }
}


-- Result
folder_1
1BW1T6m0qFsaOoNyZlZXR1vl_JRy6JB2K
folder_1
1NWZTYm0qKsAogyulVYRdvl_JRy2JU8

 

getFoldersByName() method를 이용해서 폴더 이름이 folder_1인 폴더 객체를 얻어오는 예시입니다.

 

위에서 설명할 때 Google에서는 동일한 이름을 가진 folder나 file이 존재할 수 있다고 했으므로 folder_1이라는 이름을 가진 폴더가 여러 개 일 수 있습니다.

 

 

실제로 저는 위처럼 folder_1이라는 이름의 폴더를 2개 생성해두고 위 코드를 실행했습니다.

 

 

- var folders = DriveApp.getFoldersByName('folder_1');

getFolderByName() method를 이용해 folder_1이라는 이름을 가진 모든 폴더에 대한 객체를 모은 collection을 return합니다.

 

 

- while (folders.hasNext()) {

folders 변수는 여러 개의 folder 객체가 모여있는 collection이 담겨있기 때문에 while loop로 진입해야 합니다.

while loop와 hasNext()를 이용하는 것이죠.

 

 

- var folder = folders.next();

그리고 next() method를 이용해 collection에 있던 folder 객체 하나에 접근하는 것입니다.

 

출력된 결과를 보면 아래와 같고, 총 2개의 폴더 정보가 출력되었습니다.

 

folder_1
1BW1T6m0qFsaOoNyZlZXR1vl_JRy6JB2K
folder_1
1NWZTYm0qKsAogyulVYRdvl_JRy2JU8

 

보시면 둘 다 folder_1이라는 이름을 가지고 있지만 ID는 다른 것을 확인할 수 있죠.

 

이렇게 getByName류의 method를 사용하면 여러 개의 결과가 합쳐진 collection을 얻게되므로 while loop를 써야하는 등의 문제가 있습니다.

따라서 개인적으로는 특정 폴더나 파일을 다룰 때 getByName method를 사용하여 원하는 폴더나 파일의 ID를 파악한 후 getById method를 사용해서 파악한 ID를 이용하여 코드를 구성하는 것을 선호하긴 합니다.

 

 

 

 

 

 

728x90
반응형
Comments