【Tech】Google Drive のフォルダ内のファイルをリストアップしたい

srzsrni
·

Google Drive を整理しているときに「このフォルダの中どうなってるかパッと見たいな」と思った。

Google Spreadsheet で Google Apps Scripts をつくれば、そのままリストアップできて手軽で良さそう。

🔽 ---- main.gs

const FOLDER_ID = "{{ ここに Google Drive のフォルダのID }}";

function main() {

const folderExplorer = new GoogleDriveFolderExplorer(FOLDER_ID);

const list = folderExplorer.getContentsList();

const spreadsheetManager = new SpreadsheetManager('{{ ここに書き出すシート名');

spreadsheetManager.initSheet();

spreadsheetManager.appendRows(list);

}

🔽 ---- SpreadsheetManager.gs

/**

* Google スプレッドシートの管理をするクラス

*/

class SpreadsheetManager {

/**

* SpreadsheetManagerクラスのコンストラクタ

* @param {string} sheetName - 管理するスプレッドシートのシート名

*/

constructor(sheetName) {

this.sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);

}

/**

* スプレッドシートを初期化するメソッド

*/

initSheet() {

this.sheet.clearContents();

this.sheet.appendRow(['フォルダパス', 'ファイル名', 'タイプ', 'URL']);

}

/**

* スプレッドシートにフォルダとファイルの情報を追加するメソッド

* @param {Array.<{path: string, name: string, type: string, url: string}>} contents - 追加するフォルダとファイルの情報

*/

appendRows(contents) {

contents.forEach(content => {

this.sheet.appendRow([content.path, content.name, content.type, content.url]);

});

}

}

🔽 ---- GoogleDriveFolderExplorer.gs

/**

* Google Driveの指定されたフォルダ内を探索するクラス

*/

class GoogleDriveFolderExplorer {

/**

* GoogleDriveFolderExplorerクラスのコンストラクタ

* @param {string} folderId - リストアップするフォルダのID

*/

constructor(folderId) {

this.folder = DriveApp.getFolderById(folderId);

}

/**

* 指定されたフォルダとそのサブフォルダ内の内容をリストアップするメソッド

* @return {Array} フォルダとファイルの情報のリスト

*/

getContentsList() {

return this.listContents(this.folder, '');

}

/**

* 指定されたフォルダとそのサブフォルダの内容を再帰的にリストアップするメソッド

* @param {GoogleAppsScript.Drive.Folder} folder - 内容をリストアップするフォルダ

* @param {string} folderPath - 現在のフォルダパス

* @returns {Array.<{path: string, name: string, type: string, url: string}>} フォルダとファイルの情報のリスト

*/

listContents(folder = this.folder, folderPath = '') {

let contents = [];

const currentFolderPath = folderPath ? `${folderPath} / ${folder.getName()}` : folder.getName();

contents.push({path: currentFolderPath, name: '', type: 'Folder', url: folder.getUrl()});

const files = folder.getFiles();

while (files.hasNext()) {

const file = files.next();

contents.push({path: currentFolderPath, name: file.getName(), type: this.getFileType(file), url: file.getUrl()});

}

const subFolders = folder.getFolders();

while (subFolders.hasNext()) {

const subFolder = subFolders.next();

contents = contents.concat(this.listContents(subFolder, currentFolderPath));

}

return contents;

}

/**

* ファイルのタイプを取得するメソッド

*

* @param {GoogleAppsScript.Drive.File} file - ファイル

* @return {string} ファイルのタイプ

*/

getFileType(file) {

switch (file.getMimeType()) {

case MimeType.GOOGLE_SHEETS:

return 'Google スプレッドシート';

case MimeType.GOOGLE_DOCS:

return 'Google ドキュメント';

case MimeType.GOOGLE_SLIDES:

return 'Google スライド';

case MimeType.GOOGLE_FORMS:

return 'Google フォーム';

default:

const fileName = file.getName();

return fileName.includes('.') ? fileName.split('.').pop() : '';

}

}

}

📝 ----

これで main 関数を実行すれば、フォルダの中身を再帰的にリストアップしてくれる。

ChatGPTにリファクタリングをお願いしながら書いてみたけど、出てくるものが良いコードでも微妙なコードでも理解しながらだと学びになることが多い。最終系も綺麗かとか適切かとかはわからなけど、気軽な気持ちでコードを書いてみたかったので、今後もコードを書いてみようかなって。

※ コードエディタではないから、インデントを揃えるのだけがむずかしい

@srzsrni
心に移りゆくよしなし事を、そこはかとなく書きつくる設計人