달나라 노트

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

Google Apps Script

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

CosmosProject 2022. 11. 21. 20:27
728x90
반응형

 

 

 

GAS(Google Apps Script)는 Google Apps에서 제공하는 여러 App들을 조종할 수 있는 기능을 제공합니다.

이는 단순히 GAS로 spreadsheet를 조절하는 것 뿐 아니라 gmail, google drive 등 다른 여러 가지 app들에 대한 기능도 제공합니다.

 

이 중 Google Drive관련 내용을 알아봅시다.

 

Google Drive에는 파일 뿐 아니라 파일들을 담을 수 있는 폴더가 존재합니다.

이 폴더는 폴더별로 이름이 있으며, 각 폴더별로 고유의 ID가 존재합니다.

ID는 숫자와 알파벳 대/소문자의 조합으로 이뤄져있고 예를 들면 1A93JSOWM-3Mi1pd_ei10dkamfg 이런식으로 이뤄져있습니다.

 

 

 

 

 

 

 

 

function myFunction() {
  var folders = DriveApp.getFolders();
  
  while (folders.hasNext()) {
    var folder = folders.next();
    
    var folder_name = folder.getName();
    var folder_id = folder.getId();
    
    Logger.log(`${folder_id} __ ${folder_name}`);
  }
}


-- Result
1Ymeidle0dkj3nsk65k3-3kj562n1_39812 __ folder_1
1Y3mwoxi3k0dk-euwmnxkeltyos __ movies
1pwoxkIUemsld398Umne_euiso12UI920 __ documents

 

위 코드는 현재 내 계정의 Google Drive에 있는 모든 폴더들의 이름과 고유 ID를 출력하는 코드입니다.

 

- var folders = DriveApp.getFolders();

이 부분은 DriveApp.getFolders() method를 통해 모든 Folder 객체 collection을 얻어오는 부분입니다.

folder라고 하면 folder의 이름, ID 등 다양한 속성을 가질 수 있기에 하나하나의 folder는 folder 객체로 구성되어있습니다.

 

그리고 Google Drive에 존재하는 모든 folder들의 객체를 묶은 collection을 DriveApp.getFolders() method가 return해주는 것이죠.

 

따라서 folders 라는 변수에는 현재 제 계정의 Google Drive에 있는 모든 폴더들의 객체를 담고있게됩니다.

 

 

- while (folders.hasNext()) {

folder가 하나가 아니기 때문에 folder 하나하나의 정보를 꺼내보려면 반복문을 사용해야 합니다. 여기선 while loop를 사용합니다.

그리고 folders에서 hasNext()라는 method를 while loop의 조건으로 두었습니다.

 

hasNext() method는 구글 공식 문서에 따르면 'next()를 호출할 때 항목을 반환할지 여부를 결정합니다.' 라고 설명하고 있습니다. (참고 링크 = https://developers.google.com/apps-script/reference/drive/file-iterator#hasnext)

 

좀 더 간단하게 개념을 이해해보자면 folders 객체에는 수많은 폴더들에 대한 정보를 담은 객체들이 존재할겁니다.

따라서 처음 항목부터 시작해서 다음 항목이 있는지 아닌지를 true, false로 return해주는 것이 hasNext() method라고 이해하면 좀 더 편합니다.

즉, hasNext()가 true를 반환하면 다음 파일에 대한 객체가 남아있다는 의미이고,

hasNext()가 false를 반환하면 다음 파일에 대한 객체가 없다는 것이므로 더 반복문을 실행할 수 없다는 의미가 됩니다.

 

 

- var folder = folders.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()인 것이죠.

 

folders 변수에는 Google drive에 있는 모든 폴더들의 객체 정보가 담겨있습니다.

따라서 다수의 객체가 있을 것이며, 우리는 반복문을 통해 이 객체 하나하나에 접근할겁니다.

 

이때 사용하는 것이 바로 next() 입니다.

next()는 공식 문서에 따르면 '파일 또는 폴더 컬렉션의 다음 항목을 가져옵니다. 남은 항목이 없으면 예외가 발생합니다.' 라고 설명하고 있습니다. (링크 = https://developers.google.com/apps-script/reference/drive/file-iterator#next)

즉, 다수의 객체를 담고있는 folders에서 첫 번째 항목부터 하나씩 다음(next) 항목을 return하라는 의미입니다.

 

이렇게 처음부터 하나씩 다음번 객체로 접근하는 방식이며, 이렇게 다음 객체에 접근하라는 의미로 next() method를 이용한다는 것이죠.

 

var folder = folders.next(); 따라서 이 코드는 folders collection에 있는 다음 폴더 객체를 folder 변수에 저장하라는 것입니다.

 

 

- var folder_name = folder.getName();
- var folder_id = folder.getId();

 

이 부분은 알기 쉽습니다.

getName() method는 폴더의 이름을 return해줍니다.

getId() method는 폴더의 고유 ID를 return해줍니다.

 

folder 변수에는 바로 이전에  var file = folder.next(); 부분에 의해서 file 객체를 담고 있습니다.

즉, 폴더 객체에는 Name과 ID 정보가 있고, Name은 getName() method를 통해 얻을 수 있으며, ID는 getId() method를 통해서 얻을 수 있다는 것을 알 수 있습니다.

 

 

 

 

한 가지 추가로 말씀드릴 점은 위 방식은 단순히 제 Google Drive에서 제가 생성하고 제가 소유한 폴더만을 return하지 않습니다.

제가 직접 생성하고, 제가 소유권을 가지고 있는 폴더들은 물론이며 다른 사람이 저에게 공유한 '공유 문서함'에 있는 폴더들의 정보까지 모두 return합니다.

 

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

 

 

 

 

 

 

728x90
반응형
Comments