일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Python
- GIT
- SQL
- Github
- gas
- PANDAS
- Tkinter
- Google Spreadsheet
- matplotlib
- Kotlin
- Google Excel
- django
- array
- Excel
- hive
- Mac
- list
- Redshift
- google apps script
- PySpark
- numpy
- 파이썬
- Java
- math
- PostgreSQL
- Apache
- string
- dataframe
- c#
- Today
- Total
달나라 노트
Google Apps Script : getFolderById, getFoldersByName (Folder 정보 얻기, Folder 객체 얻기.) 본문
Google Apps Script : getFolderById, getFoldersByName (Folder 정보 얻기, Folder 객체 얻기.)
CosmosProject 2022. 11. 21. 20:48
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를 이용하여 코드를 구성하는 것을 선호하긴 합니다.