
GASとClaudeでGoogleドライブの素材フォルダをインデックス化した
課題
デザイナーという職業上、日々Googleドライブのフォルダに、素材や成果物が蓄積されていきます。しかし、長い時間溜め続けることで、何がどこにあるか把握しづらくなっていました。
そこで、ファイルを探すたびにフォルダを掘っていく状態を解消したく、GASで自動インデックス化の仕組みを作りました。コードの生成はClaudeに依頼し、自分ではコードを書いていません。
やったこと
Googleドライブの指定フォルダをサブフォルダまで再帰的にスキャンし、ファイル名・種類・追加日・フォルダパス・リンクをスプレッドシートに記録します。10分ごとに自動実行するトリガーを設定しているので、ファイルが追加されると次の実行タイミングで自動的に反映されます。
あわせて、ファイルの種類ごとの色分けと、画像ファイルのサムネイル表示も実装しました。

仕組み
ClaudeにGASのコードを生成してもらい、Google Apps Scriptに貼り付けて動かしています。
フォルダごとにシートが分かれる構成にしました。

色分けのルールはサービスのブランドカラーを参考に
● PNG→水色
● JPG→赤
● PDF→濃いオレンジ
● Illustrator→オレンジ
● Photoshop→青
● テキスト系→グレー
…などとしてみました。

手順
準備
監視したいフォルダとスプレッドシートのIDをURLから取得しておきます。
GASにコードを貼り付ける
スプレッドシートのメニューから「拡張機能」→「Apps Script」を開き、以下のコードを貼り付けます。冒頭2行のIDを書き換えてください。
const FOLDER_ID = '【フォルダID】';
const SHEET_ID = '【スプレッドシートID】';
const TYPE_COLORS = {
'jpeg': '#ffcccc', 'jpg': '#ffcccc',
'png': '#cce5ff',
'eps': '#ccffcc',
'illustrator': '#ffe0b2',
'x-photoshop': '#bdd7ee',
'pdf': '#f4a460',
'plain': '#e0e0e0', 'markdown': '#e0e0e0', 'text': '#e0e0e0',
'gif': '#d9ead3', 'webp': '#d9ead3',
'zip': '#ead1dc', 'x-rar': '#ead1dc',
};
function resetAndSync() {
const ss = SpreadsheetApp.openById(SHEET_ID);
const rootFolder = DriveApp.getFolderById(FOLDER_ID);
const subFolders = [];
const folderIter = rootFolder.getFolders();
while (folderIter.hasNext()) {
subFolders.push(folderIter.next());
}
processSheet(ss, 'ルート', rootFolder, false);
subFolders.forEach(folder => {
processSheet(ss, folder.getName(), folder, true);
});
}
function processSheet(ss, sheetName, folder, includeSubFolders) {
let sheet = ss.getSheetByName(sheetName);
if (sheet) {
sheet.clearContents();
sheet.clearFormats();
} else {
sheet = ss.insertSheet(sheetName);
}
const header = sheet.getRange(1, 1, 1, 6);
header.setValues([['サムネ', 'ファイル名', '種類', '追加日', 'フォルダ', 'リンク']]);
header.setBackground('#434343');
header.setFontColor('#ffffff');
header.setFontWeight('bold');
sheet.setRowHeight(1, 30);
const rows = [];
scanFolder(folder, rows, sheetName, includeSubFolders);
if (rows.length === 0) return;
sheet.getRange(2, 2, rows.length, 5).setValues(rows.map(r => [r[0], r[1], r[2], r[3], r[4]]));
rows.forEach((row, i) => {
const rowNum = i + 2;
sheet.setRowHeight(rowNum, 60);
const type = row[1];
const color = TYPE_COLORS[type] || '#f3f3f3';
sheet.getRange(rowNum, 1, 1, 6).setBackground(color);
sheet.getRange(rowNum, 1).setBackground('#ffffff');
if (['jpeg', 'jpg', 'png', 'gif', 'webp'].includes(type)) {
const fileUrl = row[4];
const fileId = fileUrl.replace('https://drive.google.com/file/d/', '').replace('/view?usp=drivesdk', '').replace('/view', '').trim();
if (fileId) {
const thumbUrl = `https://lh3.googleusercontent.com/d/${fileId}=w100`;
sheet.getRange(rowNum, 1).setFormula(`=IMAGE("${thumbUrl}")`);
}
}
});
}
function scanFolder(folder, rows, folderPath, includeSubFolders) {
const files = folder.getFiles();
while (files.hasNext()) {
const file = files.next();
rows.push([
file.getName(),
file.getMimeType().split('/').pop(),
Utilities.formatDate(file.getDateCreated(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm'),
folderPath,
file.getUrl()
]);
}
if (includeSubFolders) {
const subFolders = folder.getFolders();
while (subFolders.hasNext()) {
const sub = subFolders.next();
scanFolder(sub, rows, folderPath + ' > ' + sub.getName(), true);
}
}
}
function setTrigger() {
ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t));
ScriptApp.newTrigger('resetAndSync')
.timeBased()
.everyMinutes(10)
.create();
}
実行する
保存後、setTriggerを実行して自動実行の設定を行います。次にresetAndSyncを実行すると、スプレッドシートにファイル一覧が反映されます。初回実行時は権限の確認ダイアログが表示されるので許可します。

結果

フォルダごとにシートが分かれ、画像ファイルはサムネイル表示されます。これでファイルを開かなくても中身が確認できるようになりました。
おわりに
インデックスを作ってから、ファイル探しにかける時間がかなり減りました。
コードの生成はすべてClaudeに依頼し、エラーが出るたびにログを貼って修正を繰り返す形で進めました。GASのコードを自分で書く必要はなく、フォルダIDとスプレッドシートIDを差し替えるだけで動くので、同じ課題を持っている方は試してみてください。







