달나라 노트

Google Apps Script : getFileById, getFilesByName (File 정보 얻기, File 객체 얻기) 본문

Google Apps Script

Google Apps Script : getFileById, getFilesByName (File 정보 얻기, File 객체 얻기)

CosmosProject 2022. 11. 21. 21:06
728x90
반응형

 

 

 

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

 

getFileById()와 getFilesByName() 입니다.

 

 

Syntax

DriveApp.getFileById(file_id)
DriveApp.getFilesByName(file_name)

 

 

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

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

 

이 둘은 같을까요?

정답은 같지만 다릅니다.

 

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

 

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

 

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

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

 

 

제 Google Drive의 일부입니다.

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

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

 

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

 

바로 ID 덕분입니다.

 

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

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

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

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

 

 

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

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

 

이제 위 말을 다시 봅시다.

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

 

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

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

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

 

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

 

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

https://cosmosproject.tistory.com/703

 

 

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

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

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

 

 

 

 

 

 

 

function myFunction() {
  var file = DriveApp.getFileById('1rT_O6RP8aZaHEFtdC-zL6lMh3NviN2Nsh3UdB7_0');
  
  Logger.log(file.getName());
  Logger.log(file.getId());
}



-- Result
my_test
1rT_O6RP8aZaHEFtdC-zL6lMh3NviN2Nsh3UdB7_0

 

getFileById() method를 통해 ID가 1rT_O6RP8aZaHEFtdC-zL6lMh3NviN2Nsh3UdB7_0 이고 이름이 my_test인 파일의 객체를 얻어오는 예시입니다.

 

- var file = DriveApp.getFileById('1rT_O6RP8aZaHEFtdC-zL6lMh3NviN2Nsh3UdB7_0');

ID가 1rT_O6RP8aZaHEFtdC-zL6lMh3NviN2Nsh3UdB7_0 인 파일에 대한 객체를 얻어옵니다.

 

 

- Logger.log(file.getName());

- Logger.log(file.getId());

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

 

 

위 결과를 보면 file 정보가 잘 출력된 것을 알 수 있죠.

 

 

 

 

 

 

function myFunction() {
  var files = DriveApp.getFilesByName('my_test');
  
  while (files.hasNext()) {
    var file = files.next();

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


-- Result
my_test
1rT_O6RP8aZaHEFtdC-zL6lMh3NviN2Nsh3UdB7_0
my_test
1bDUkEvOdvOgAGfla2E3d_y3v5z_x_RWGcEsshKEgjtk

 

 

getFilesByName() method를 이용해서 폴더 이름이 my_test인 파일들의 객체를 얻어오는 예시입니다.

 

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

 

 

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

 

 

- var files = DriveApp.getFilesByName('my_test');

getFilesByName() method를 이용해 my_test라는 이름을 가진 모든 파일에 대한 객체를 모은 collection을 return합니다.

 

 

- while (files.hasNext()) {

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

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

 

 

- var file = files.next();

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

 

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

 

my_test
1rT_O6RP8aZaHEFtdC-zL6lMh3NviN2Nsh3UdB7_0
my_test
1bDUkEvOdvOgAGfla2E3d_y3v5z_x_RWGcEsshKEgjtk

 

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

 

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

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

 

 

 

 

 

 

728x90
반응형
Comments