일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- array
- dataframe
- Google Spreadsheet
- numpy
- GIT
- Mac
- math
- PostgreSQL
- hive
- PySpark
- google apps script
- 파이썬
- Excel
- SQL
- c#
- Redshift
- Google Excel
- gas
- Kotlin
- PANDAS
- Tkinter
- django
- Python
- Java
- list
- string
- Apache
- Github
- matplotlib
- Today
- Total
달나라 노트
Google Apps Script : getFiles, getName, getId (Drive에 있는 file list 얻기) 본문
Google Apps Script : getFiles, getName, getId (Drive에 있는 file list 얻기)
CosmosProject 2022. 11. 21. 19:53
GAS(Google Apps Script)는 Google Apps에서 제공하는 여러 App들을 조종할 수 있는 기능을 제공합니다.
이는 단순히 GAS로 spreadsheet를 조절하는 것 뿐 아니라 gmail, google drive 등 다른 여러 가지 app들에 대한 기능도 제공합니다.
오늘은 그 중에서 Google Drive 관련 기능을 알아봅시다.
Google Drive에는 여러 파일들이 있을겁니다.
그 파일이 mp4 같은 동영상 파일이 될수도있고, spreadsheet일 수도 있고, 문서일 수도 있고, 외부 pdf 파일일 수도 있습니다. 거의 모든 파일이 있을 수 있죠.
GAS에선 현재 내 계정에 있는 모든 파일에 접근할 수 있습니다.
본격적으로 들어가기 전에 한가지 개념을 알고갑시다.
Google Drive에서는 모든 폴더와 파일에 대해서 각각에 대한 이름을 가지고 있습니다.
그리고 이름 뿐 아니라 각 폴더와 파일은 서로 겹치지 않는 고유한 ID를 가지고 있습니다.
ID는 숫자와 알파벳 대/소문자의 조합으로 이뤄져있고 예를 들면 1A93JSOWM-3Mi1pd_ei10dkamfg 이런식으로 이뤄져있습니다.
function myFunction() {
var files = DriveApp.getFiles();
while (files.hasNext()) {
var file = files.next();
var file_name = file.getName();
var file_id = file.getId();
Logger.log(`${file_id} __ ${file_name}`);
}
}
-- Result
2n12oxI3em1A_ikeop-eiw38n9xss04m __ item_list.xlsx
1Ymdi2odlzxieIEmd934AMco_do9-wo1J92M __ books.xlsx
1mxk-39Miel1OIE23mUJdmw9 __ game.mp4
위 코드는 현재 내 계정의 Google Drive에 있는 모든 파일들의 이름과 고유 ID를 출력하는 코드입니다.
- var files = DriveApp.getFiles();
이 부분은 DriveApp.getFiles() method를 통해 모든 File 객체 collection을 얻어오는 부분입니다.
file이라고 하면 file의 이름, ID, 크기 등 다양한 속성을 가질 수 있기에 하나하나의 파일은 file 객체로 구성되어있습니다.
그리고 Google Drive에 존재하는 모든 file들의 객체를 묶은 collection을 DriveApp.getFiles() method가 return해주는 것이죠.
따라서 files라는 변수에는 현재 제 계정의 Google Drive에 있는 모든 파일들의 객체를 담고있게됩니다.
- while (files.hasNext()) {
file이 하나가 아니기에 file 하나하나의 정보를 꺼내보려면 반복문을 사용해야 합니다. 여기선 while 반복문을 사용합니다.
그리고 files에서 hasNext()라는 method를 while의 조건으로 두었습니다.
haxNext() method는 구글 공식 문서에 따르면 'next()를 호출할 때 항목을 반환할지 여부를 결정합니다.' 라고 설명하고 있습니다. (참고 = https://developers.google.com/apps-script/reference/drive/file-iterator#hasnext)
좀 더 간단하게 개념을 이해해보면 files 객체에는 수많은 파일들에 대한 객체 정보가 담겨있습니다.
따라서 처음 항목부터 시작해서 다음 항목이 있는지 아닌지를 true, false로 return해주는 것이 hasNext() method라고 이해하면 좀 더 편합니다.
즉, hasNext()가 true를 반환하면 다음 파일에 대한 객체가 남아있다는 것이고,
hasNext()가 false를 반환하면 다음 파일에 대한 객체가 없다는 것이므로 더 반복문을 실행할 수 없다는 의미가 됩니다.
- var file = files.next();
이번에는 next() method를 썼습니다.
next()라는 의미가 좀 생소하실 분들도 있을겁니다.
이것은 다수의 객체를 담고있는 collection을 참조할 때 종종 사용되는 방법입니다.
python에서 list를 for loop로 참조할 때 아래처럼 참조하곤하죠.
for i in range(len(list_test)):
print(list_test[i])
python의 list에는 index가 있어서 index를 통해 list라는 collection에 속한 각 요소에 접근합니다.
물론 GAS의 array도 python과 동일하지만, file 객체처럼 특정 객체는 좀 다르게 접근해야합니다.
그 방법이 바로 next()인 것이죠.
files 변수에는 Google drive에 있는 모든 파일들의 객체 정보가 담겨있습니다.
따라서 다수의 객체가 있을 것이며, 우리는 반복문을 통해 이 객체 하나하나에 접근할겁니다.
이때 사용하는 것이 바로 next() 입니다.
next()는 공식 문서에 따르면 '파일 또는 폴더 컬렉션의 다음 항목을 가져옵니다. 남은 항목이 없으면 예외가 발생합니다.' 라고 설명하고 있습니다. (링크 = https://developers.google.com/apps-script/reference/drive/file-iterator#next)
즉, 다수의 객체를 담은 files에서 첫 번째 항목부터 하나씩 다음(next) 항목을 return하라는 의미입니다.
이렇게 처음부터 하나씩 다음번 객체로 접근하는 방식이며, 이를 위해서 next() method를 이용한다는 것이죠.
var file = files.next(); 따라서 이 코드는 files collection에 있는 다음 파일 객체를 file 변수에 저장하는 것입니다.
- var file_name = file.getName();
- var file_id = file.getId();
이 부분은 알기 쉽습니다.
getName() method는 파일의 이름을 return해줍니다.
getId() method는 파일의 고유 ID를 return해줍니다.
file 변수에는 바로 이전에 var file = files.next(); 부분에 의해서 file 객체를 담고 있습니다.
즉, 파일 객체에는 Name과 ID 정보가 있는 것을 알 수 있죠.
한 가지 추가로 말씀드릴 점은 위 방식은 단순히 제 Google Drive에서 제가 생성하고 제가 소유한 파일만을 return하지 않습니다.
제가 직접 생성하고, 제가 소유권을 가지고있는 파일들은 물론이고 다른 사람이 저에게 공유한 '공유 문서함'에 있는 파일들의 정보까지 모두 return해줍니다.
위 코드를 직접 실행해보시면 무슨 의미인지 알기 더 쉬울겁니다.