【GAS】カレントフォルダ以下のファイル一覧をスプレッドシートに書き出す

'24/04/16更新:メニューバーから実行できるボタン追加のコードを追記しました。
 本記事では、スプレッドシートを置いたカレントフォルダ以下を再帰的に探索して、ファイル一覧を書き出すGoogel App Script(GAS)の雛形コードを載せました。
下図は、本プログラムをApps Scriptに記載したスプレッドシートです。メニューバーの赤枠に「Custum Menu」が出現しているのがわかります。

 下図は、上記ボタンを実行した結果です。A列にファイルパス、B列にそのタイプ(フォルダ or ファイル)、C列から右側の列には各ファイルパスの各階層を入力する仕様です。

 これにて、フォルダ内のファイル一覧が見やすくなります。また、A列にはリンクを貼っているので、所望のフォルダやファイルを見つければそこへ飛ぶことが容易にできます。

■本プログラム

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  // カスタムメニューを作成
  var menu = ui.createMenu('Custom Menu');
  // メニューに実行ボタンを追加
  menu.addItem('実行', 'listFolderAndFileHierarchyFromSheetFolder');
  // スプレッドシートの UI にメニューを追加
  menu.addToUi();
}

function listFolderAndFileHierarchyFromSheetFolder() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clear(); // Clear existing data
  // Write headers
  sheet.appendRow(["フォルダパス", "タイプ"]); // ファイルまたはフォルダかを示す列を追加
  // Get the parent folder of the script
  var scriptFile = DriveApp.getFileById(SpreadsheetApp.getActiveSpreadsheet().getId());
  var parentFolder = scriptFile.getParents().next();
  // List the folder and file hierarchy recursively starting from the parent folder of the script
  listFolderAndFileHierarchyRecursive(parentFolder, "", sheet);
}

function listFolderAndFileHierarchyRecursive(folder, parentPath, sheet) {
  // フォルダのパスを書き出す
  var folders = folder.getFolders();
  while (folders.hasNext()) {
    var subFolder = folders.next();
    var folderPath = parentPath + "/" + subFolder.getName();
    sheet.appendRow([folderPath, "Folder"]); // フォルダであることを示す
    var row = sheet.getLastRow();
    var col = 1;
    // ハイパーリンクを設定
    sheet.getRange(row, col).setFormula('=HYPERLINK("' + encodeURI("https://drive.google.com/drive/folders/" + subFolder.getId()) + '","' + folderPath + '")');
    
    // バックスラッシュで分割して、右側のセルに書き出す
    var pathParts = folderPath.split("/");
    for (var i = 1; i < pathParts.length; i++) {
      if (!sheet.getRange(row, i + 2).getValue()) {
        sheet.getRange(1, i + 2).setValue("階層" + i); // 列名を設定
      }
      sheet.getRange(row, i + 2).setValue(pathParts[i]); // 右側のセルに書き出す
    }
    
    listFolderAndFileHierarchyRecursive(subFolder, folderPath, sheet);
  }
  // ファイルのパスを書き出す
  var files = folder.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    var filePath = parentPath + "/" + file.getName();
    sheet.appendRow([filePath, "File"]); // ファイルであることを示す
    var row = sheet.getLastRow();
    var col = 1;
    // ハイパーリンクを設定
    sheet.getRange(row, col).setFormula('=HYPERLINK("' + encodeURI(file.getUrl()) + '","' + filePath + '")');
    
    // バックスラッシュで分割して、右側のセルに書き出す
    var pathParts = filePath.split("/");
    for (var i = 1; i < pathParts.length; i++) {
      if (!sheet.getRange(row, i + 2).getValue()) {
        sheet.getRange(1, i + 2).setValue("階層" + i); // 列名を設定
      }
      sheet.getRange(row, i + 2).setValue(pathParts[i]); // 右側のセルに書き出す
    }
  }
}

以上

 

<広告>