🐣

Gドライブのファイル内容をスプレッドシートに一括取得するGAS

2023/03/18に公開

概要

「Google Driveでファイル一覧を一括取得する」方法です。

  • リスト用スプレッドシートのある階層のファイルとフォルダー
  • フォルダーに含まれているファイル

をすべてリスト化します。

準備

  1. ファイル一覧を書き込むためのスプレッドシートを作成します。
  2. 1行目には目次を入力します。「パス ファイル名 更新日
  3. Google Apps Scriptを作成します。
  4. ファイル > 新規作成 > スクリプトで、新しいスクリプトファイルを作成します。
  5. 以下のコードをスクリプトエディターに貼り付けます。
  6. 定期的に更新する場合は、トリガーを作成します。

カスタマイズ

  • リストするディレクトリの範囲を指定

function getDriveList(depth = 2) {

  • シート名を指定

const sheet = spreadSheet.getSheetByName('シート1');

実行

  • スプレッドシートのメニューから実行します。「ファイル一覧取得実行
  • 最初は権限を付与してください。うまくいかない場合は、GASから直接実行してください。

GAS

/**
 * スプレッドシートのメニューから関数を実行できるように、メニューを追加します。
 */
function onOpen() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet();
  const entries = [{ name: "ファイル一覧取得実行", functionName: "getDriveList" }];
  sheet.addMenu("ファイル一覧取得", entries);
}

/**
 * スプレッドシートにGoogle Drive内のファイル一覧を表示する関数です。
 * @param {number} depth - 表示するファイルの階層の深さを指定します。
 */
function getDriveList(depth = 2) {
  // スプレッドシートにアクセス
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const id = spreadSheet.getId();
  // スプレッドシートが存在するフォルダを取得
  const folderRoot = DriveApp.getFileById(id).getParents().next();
  // デフォルトのシートを使用
  const sheet = spreadSheet.getSheetByName('シート1');

  // 既にデータが存在する場合はクリアする
  const lastRow = sheet.getLastRow();
  if (lastRow > 1) {
    sheet.getRange(2, 1, lastRow - 1, 100).clear();
  }

  // 指定した階層までフォルダを探索
  digFolders(folderRoot, sheet, depth, "");
}

/**
 * 指定したフォルダ内のファイル一覧を取得し、スプレッドシートに書き込みます。
 * @param {Folder} folder - ファイル一覧を取得するフォルダ
 * @param {Sheet} sheet - 書き込むスプレッドシートのシートオブジェクト
 * @param {string} currentPath - 現在のフォルダのパス
 */
function listFiles(folder, sheet, currentPath) {
  const files = folder.getFiles();
  let row = sheet.getLastRow() + 1;

  while (files.hasNext()) {
    const file = files.next();
    let folderValue = folder.getName();
    if (currentPath) {
      folderValue = `${currentPath}/${folderValue}`;
    }
    sheet.getRange(row, 1).setValue(folderValue);
    const fileValue = `=HYPERLINK("${file.getUrl()}","${file.getName()}")`;
    sheet.getRange(row, 2).setValue(fileValue);
    sheet.getRange(row, 3).setValue(file.getLastUpdated());

    row++;
  }

  const folders = folder.getFolders();
  while (folders.hasNext()) {
    const nextFolder = folders.next();
    let nextPath = folder.getName();
    if (currentPath) {
      nextPath = `${currentPath}/${nextPath}`;
    }
    listFiles(nextFolder, sheet, nextPath);
  }
}


/**
 * 指定したフォルダ内のファイル一覧を取得し、スプレッドシートに書き込みます。
 * 指定した階層まで再帰的に探索します。
 * @param {Folder} rootFolder - 探索を開始するフォルダ
 * @param {Sheet} sheet - 書き込むスプレッドシートのシートオブジェクト
 * @param {number} depth - 探索する深さ
 */
function digFolders(rootFolder, sheet, depth) {
  listFiles(rootFolder, sheet);

  // depthが0になるまで探索
  if (depth > 0) {
    const folders = rootFolder.getFolders();
    while (folders.hasNext()) {
      const folder = folders.next();
      // depthを1減らして、再帰的に探索
      digFolders(folder, sheet, depth - 1);
    }
  }
}


GitHubで編集を提案

Discussion