일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- list
- PySpark
- Java
- 파이썬
- dataframe
- Mac
- hive
- numpy
- SQL
- matplotlib
- array
- Redshift
- GIT
- PANDAS
- PostgreSQL
- Excel
- gas
- Google Spreadsheet
- Tkinter
- math
- Github
- Google Excel
- string
- Apache
- google apps script
- c#
- Python
- Kotlin
- django
- Today
- Total
달나라 노트
Google Apps Script : getFileById, getFilesByName (File 정보 얻기, File 객체 얻기) 본문
Google Apps Script : getFileById, getFilesByName (File 정보 얻기, File 객체 얻기)
CosmosProject 2022. 11. 21. 21:06
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를 이용하여 코드를 구성하는 것을 선호하긴 합니다.
'Google Apps Script' 카테고리의 다른 글
Google Apps Script : makeCopy (파일 복사하기) (0) | 2022.11.21 |
---|---|
Google Apps Script : sheet.copyTo (탭 복사, 시트 복사) (0) | 2022.11.21 |
Google Apps Script : replace, replaceAll (텍스트 바꾸기) (0) | 2022.11.21 |
Google Apps Script : getFolderById, getFoldersByName (Folder 정보 얻기, Folder 객체 얻기.) (0) | 2022.11.21 |
Google Apps Script : getFolders, getName, getId (Drive에 있는 folder list 얻기) (0) | 2022.11.21 |