Googleドライブにあるファイルを移動するので、ファイルリストを作成しようと思ったのですが、階層が深すぎて手動で取得するのは大変だったので、プログラムで取得しました。

親フォルダ、子フォルダからファイルを一括取得するコードは検索できるのですが、階層が深いフォルダに対し再帰的に取得するコードがなかったので、上げておきます。

自分を自分で呼び出している関数なので、作りとしてプログラミングのお作法から外れてるのが反省点。

 

 

function main() {
  // 書き出しシート取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("フォルダ一括取得");
  // 書き出しシートクリア
  const lastRow = sheet.getLastRow();
  const lastCol = sheet.getLastColumn();
  let rangeList = sheet.getRange(2, 1, lastRow, lastCol);
  rangeList.clearContent();

  // 取得したフォルダ名とIDを格納
  let list = [];

  // 最上位のフォルダを指定
  const folder_id = 'xxxxxxxxxxxxxxxxxxxxxxx'; // フォルダIDを指定
  let base_folder = DriveApp.getFolderById(folder_id);
  // 最上位フォルダのファイルを取得
  let files = base_folder.getFiles();
  while (files.hasNext()) {
    //1つ取り出し
    const file = files.next();
    // ファイル名、IDを取得
    list.push(["ファイル", file.getName(), file.getUrl()]);
  }

  // 子フォルダ取得
  const folders = base_folder.getFolders();
  if (folders.hasNext()) {
    list = getFoldersRecursive(folders, list);
  }

  // 書き出しシートの書き出し開始位置
  const row_idx = 2;
  const col_idx = 1;
  let range = sheet.getRange(row_idx, col_idx, list.length, list[0].length);
  // 対象の範囲にまとめて書き出し
  range.setValues(list);
}

function getFoldersRecursive(folders, list) {
  while (folders.hasNext()) {
    //1つ取り出し
    const folder = folders.next();
    // フォルダ名、URLを取得
    list.push(["フォルダ", folder.getName(), folder.getUrl()]);
    // 指定フォルダのファイル一括取得
    let files = folder.getFiles();
    while (files.hasNext()) {
      //1つ取り出し
      const file = files.next();
      // ファイル名、IDを取得
      list.push(["ファイル", file.getName(), file.getUrl()]);
    }
    const child_folders = folder.getFolders();
    // 再帰的に実行
    list = getFoldersRecursive(child_folders, list);
  }
  return list;
}