5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GASでGoogleDriveの特定のフォルダのサブフォルダ、ファイルを全て取得する(再帰でスッキリ)

Last updated at Posted at 2023-02-10

前書き

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}`);
    }
  }
}
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?