Driveの重複候補を削除前に発見|GASでファイル名・種類・サイズをdry-run監査
ツールおじ|GoogleアカウントをAIエージェント化
Google Driveを整理するとき、同じ名前のファイルを見つけても、すぐ削除するのは危険です。名前が同じでも内容が違う場合があり、共有中のファイルを消すと業務へ影響するためです。
この記事では、指定したテスト用フォルダだけを読み取り、ファイル名・種類・サイズが一致する組み合わせを「重複候補」として数えるGASを紹介します。削除、移動、名前変更、共有設定の変更は行いません。
先に知っておきたいこと
- 対象は、コードに指定した1つのフォルダ直下だけです。サブフォルダは走査しません。
- 初期設定では最大500件まで確認し、上限を超えたら処理を止めます。
- ファイル名・MIMEタイプ・サイズの一致だけでは、内容が完全に同じとは断定できません。
- Googleドキュメント、スプレッドシート、スライドなど、サイズを取得できないファイルは誤判定防止のため除外します。
- 初期設定ではファイル名やIDをログへ出さず、候補グループ数と件数だけを表示します。
- このコードは候補抽出専用です。削除や移動は人が内容と共有状況を確認したあとに判断してください。
準備するテスト用フォルダ
まず、個人情報や機密情報を含まない検証用フォルダを用意します。
- 同じ名前・種類・サイズのテストファイルを2件
- 名前は同じでもサイズが違うテストファイルを1件
- 通常の別ファイルを1件
フォルダURLのfolders/以降にある文字列を、コードのFOLDER_IDへ設定します。共有ドライブや業務フォルダ全体ではなく、少量の検証用フォルダから始めてください。
コピーして使える最小コード
function auditDriveDuplicateCandidatesFree() {
const CONFIG = {
DRY_RUN: true,
FOLDER_ID: 'YOUR_TEST_FOLDER_ID',
MAX_FILES: 500,
LOG_FILE_NAMES: false
};
if (CONFIG.DRY_RUN !== true) {
throw new Error('この無料例はDRY_RUN=trueのまま使用してください。');
}
if (!/^[A-Za-z0-9_-]{10,}$/.test(CONFIG.FOLDER_ID) || CONFIG.FOLDER_ID === 'YOUR_TEST_FOLDER_ID') {
throw new Error('検証用フォルダのIDを設定してください。');
}
const folder = DriveApp.getFolderById(CONFIG.FOLDER_ID);
const files = folder.getFiles();
const groups = {};
let checkedFiles = 0;
let skippedGoogleFiles = 0;
while (files.hasNext()) {
const file = files.next();
checkedFiles += 1;
if (checkedFiles > CONFIG.MAX_FILES) {
throw new Error('確認上限を超えました。対象フォルダを分けて再実行してください。');
}
const size = file.getSize();
if (!Number.isFinite(size) || size <= 0) {
skippedGoogleFiles += 1;
continue;
}
const normalizedName = file.getName().normalize('NFKC').trim().toLowerCase();
const mimeType = file.getMimeType();
const key = [normalizedName, mimeType, String(size)].join('\u001f');
if (!groups[key]) groups[key] = [];
groups[key].push({
name: file.getName(),
mimeType: mimeType,
sizeBytes: size
});
}
const duplicateGroups = Object.keys(groups)
.map(function (key) {
return groups[key];
})
.filter(function (group) {
return group.length > 1;
});
const result = {
dryRun: true,
checkedFiles: checkedFiles,
skippedGoogleFiles: skippedGoogleFiles,
duplicateGroupCount: duplicateGroups.length,
duplicateCandidateCount: duplicateGroups.reduce(function (sum, group) {
return sum + group.length;
}, 0)
};
if (CONFIG.LOG_FILE_NAMES) {
result.candidates = duplicateGroups.slice(0, 20);
result.truncated = duplicateGroups.length > 20;
}
console.log(JSON.stringify(result));
return result;
}実行前の準備
1. 個人情報や機密情報を含まないテスト用フォルダを作ります。
2. スプレッドシートからApps Scriptを開き、コードを貼り付けます。
3. FOLDER_IDをテスト用フォルダのIDへ置き換えます。
4. DRY_RUNがtrue、LOG_FILE_NAMESがfalseであることを確認します。
5. auditDriveDuplicateCandidatesFreeを選び、手動で実行します。
6. 実行ログのduplicateGroupCountとduplicateCandidateCountを確認します。
7. 詳細確認が必要な場合だけ、機密性を確認したうえでLOG_FILE_NAMESをtrueにして再実行します。
ログの読み方
- checkedFiles: 対象フォルダ直下で確認したファイル数です。
- skippedGoogleFiles: サイズを取得できず、候補判定から除外したファイル数です。
- duplicateGroupCount: 名前・種類・サイズが一致した候補グループ数です。
- duplicateCandidateCount: 候補グループに含まれるファイル総数です。
- candidates: LOG_FILE_NAMESをtrueにした場合だけ表示される候補一覧です。
候補が出ても、同一内容とは限りません。各ファイルを開き、更新日時、所有者、共有先、保存場所、内容を人が確認してください。
削除前のチェックリスト
- 候補ファイルをそれぞれ開き、内容が同じか確認する。
- 所有者と共有先を確認し、他の人が利用中でないか確認する。
- ショートカット、テンプレート、世代管理用コピーではないか確認する。
- 削除せず、まず整理先フォルダへ移す運用が必要か検討する。
- 一度に処理せず、少量ずつ確認記録を残す。
- 自動削除や時間主導トリガーを追加しない。
停止条件
- 対象フォルダが想定と違う。
- 500件を超えて処理が停止した。
- 権限エラーが出た。
- ファイル名をログへ出してよいか判断できない。
- 共有中、所有者不明、内容未確認の候補がある。
これらに該当した場合は設定を変えて続行せず、対象範囲と権限を確認してください。
制限と安全上の注意
この判定はファイル名・MIMEタイプ・サイズが一致する「確認候補」です。MD5ハッシュやファイル本文を比較しないため、完全一致の証明にはなりません。また、Google形式のファイルはサイズ判定から除外します。
この無料例は削除、移動、ゴミ箱への移動、名前変更、共有設定変更、レポートファイル作成を行いません。候補を自動削除する処理へ変更せず、人による確認を必ず挟んでください。
まとめ
Drive整理では、重複らしいファイルを見つけることと、削除してよいと判断することを分ける必要があります。まずは指定フォルダだけを読み取り、候補数を確認するdry-runから始めてください。
Driveのファイル一覧を定期的に整理したい方へ
DriveFileList Proを見る

GasおじのTips商品一覧を見る
GasおじのTips商品一覧を見る

※このコードは学習・検証用の例です。実データへ適用する前にコピー環境で確認してください。Google公式・Google公認の商品ではありません。
