달나라 노트

Google Apps Script : getFiles, getName, getId (Drive에 있는 file list 얻기) 본문

Google Apps Script

Google Apps Script : getFiles, getName, getId (Drive에 있는 file list 얻기)

CosmosProject 2022. 11. 21. 19:53
728x90
반응형

 

 

 

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해줍니다.

 

위 코드를 직접 실행해보시면 무슨 의미인지 알기 더 쉬울겁니다.

 

 

 

 

 

 

728x90
반응형
Comments