前書き
Googleドライブで、特定のフォルダ以下にあるサブフォルダ、ファイルをまとめて取得できたら便利だなーと思ってまとめました。
既存の記事もいくつかあったのですが、結構パワープレイなコードが多く、理解が大変な感じだったので、再帰を使用してスッキリ書くことに挑戦します。
とりあえずコード
function main(){
const folderId = "xxxxxxxxxxxxxxxxxxxx";
const targetFolder = DriveApp.getFolderById(folderId);
const subFolders = getAllSubfolders(folderId);
const folders = [targetFolder].concat(subFolders);
const files = getAllFiles(folders);
for(folder of folders){
const name = folder.getName();
try{
//フォルダごとに実行したい処理をここに記載
console.log(`${name}:成功時のメッセージ`);
} catch(e){
console.log(`${name}:失敗時のメッセージ\nエラー内容:${e.message}`);
}
}
for(file of files){
const name = file.getName();
try{
//ファイルごとに実行したい処理をここに記載
console.log(`${name}:成功時のメッセージ`);
} catch(e){
console.log(`${name}:失敗時のメッセージ\nエラー内容:${e.message}`);
}
}
}
function getAllSubfolders(folderId, retArray=[]){
const targetFolder = DriveApp.getFolderById(folderId);
const folders = targetFolder.getFolders();
while(folders.hasNext()){
const folder = folders.next();
const id = folder.getId();
retArray.push(folder)
getAllSubfolders(id, retArray);
}
return retArray;
}
//引数にはフォルダイテレータの配列を用いる
function getAllFiles(folders){
let allFiles = [];
for(folder of folders){
const files = folder.getFiles();
while(files.hasNext()){
allFiles.push(files.next());
}
}
return allFiles;
}
解説
ポイントはこの関数です。直下のフォルダ一覧を取得し、そのそれぞれのフォルダに対して、関数を再帰的に呼び出しています。
function getAllSubfolders(folderId, retArray=[]){
const targetFolder = DriveApp.getFolderById(folderId);
const folders = targetFolder.getFolders();
while(folders.hasNext()){
const folder = folders.next();
const id = folder.getId();
retArray.push(folder)
getAllSubfolders(id, retArray);
}
return retArray;
}
使用例
指定したフォルダ、およびそのサブフォルダ、ファイルの権限を一括でプライベート(共有されている人のみアクセス可能)に変更します。
function setPrivate(){
const folderId = "xxxxxxxxxxxxxxxxxxxx";
const targetFolder = DriveApp.getFolderById(folderId);
const subFolders = getAllSubfolders(folderId);
const folders = [targetFolder].concat(subFolders);
const files = getAllFiles(folders);
const access = DriveApp.Access.PRIVATE;
const permission = DriveApp.Permission.NONE;
for(folder of folders){
const name = folder.getName();
try{
folder.setSharing(access, permission);
console.log(`${name}:フォルダの権限設定に成功しました`);
} catch(e){
console.log(`${name}:フォルダの権限設定に失敗しました\nエラー内容:${e.message}`);
}
}
for(file of files){
const name = file.getName();
try{
file.setSharing(access, permission);
console.log(`${name}:ファイルの権限設定に成功しました`);
} catch(e){
console.log(`${name}:ファイルの権限設定に失敗しました\nエラー内容:${e.message}`);
}
}
}