🐣
Gドライブのファイル内容をスプレッドシートに一括取得するGAS
概要
「Google Driveでファイル一覧を一括取得する」方法です。
- リスト用スプレッドシートのある階層のファイルとフォルダー
- フォルダーに含まれているファイル
をすべてリスト化します。
準備
- ファイル一覧を書き込むためのスプレッドシートを作成します。
- 1行目には目次を入力します。「パス ファイル名 更新日」
- Google Apps Scriptを作成します。
- ファイル > 新規作成 > スクリプトで、新しいスクリプトファイルを作成します。
- 以下のコードをスクリプトエディターに貼り付けます。
- 定期的に更新する場合は、トリガーを作成します。
カスタマイズ
- リストするディレクトリの範囲を指定
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);
}
}
}
Discussion