Drive内の重複ファイルをGASで検出・整理

Drive内の重複ファイルをGASで検出・整理
中小企業の経営者やフリーランスの皆さん、こんにちは。GASおじです。今日はGoogle Drive内の重複ファイルをGoogle Apps Script(GAS)で効率よく検出し、整理する方法について解説するぜ。ファイルが重複するとストレージ容量が無駄になり、SaaS課金の厳しいおじさんとしては見逃せない問題だ。
この記事では「既存のファイルを削除しない」「安全に処理を行う」ことを重視しつつ、重複検出のロジックから結果を新しい日時付きのスプレッドシートに出力するコード例も紹介する。Googleアカウントの利用枠内で追加の専用SaaS料金なしで運用できるので安心してほしい。
初期設定と必要権限
まずはスクリプトを走らせるために必要な権限を確認しよう。Drive APIを使うので、
- Google Driveのファイル一覧取得権限(
https://www.googleapis.com/auth/drive.metadata.readonly) - スプレッドシートの作成・編集権限(
https://www.googleapis.com/auth/spreadsheets)
が最低限必要だ。GASのプロジェクトにこれらのスコープを設定し、初回実行時に許可を得る形になる。
また、個人情報や機密情報を扱う場合は、スクリプトの実行環境やアクセス権限をしっかり管理してほしい。スクリプトはGoogleアカウントの利用枠内で動くが、Quotaや実行時間制限もあるため、過度に大量のファイルを処理する際は注意が必要だ。
重複ファイル検出の仕組み
重複ファイルを見つけるにはシンプルにファイル名だけでなく、ファイルサイズやMD5ハッシュ(Drive APIのmd5Checksum)を使うのが効果的だ。これらの情報が一致していれば、ほぼ同一ファイルと判断できる。
ただし、Google Docs形式のファイルはMD5ハッシュがないので除外するか、名前とサイズのみで判定するなど工夫が必要だ。
おじさんの提案は、以下の手順で処理すること:
- Drive内の全ファイル(または指定フォルダ内)を取得
- ファイル名・サイズ・MD5ハッシュをキーに重複判定用の辞書を作成
- 複数のファイルが同じキーにマップされているものを重複候補として抽出
- 新規に日時付きのスプレッドシートを作成し、重複リストを書き出す
コード例:Drive内の重複ファイル検出スクリプト
以下はDriveのルートフォルダ(全Drive)を対象に重複ファイルを検出し、結果を新しいスプレッドシートに書き出すサンプルだ。ファイルを削除・移動は一切せず、安全第一で運用できる。
function findDuplicateFiles() {
// 出力用スプレッドシートを作成
const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
const ss = SpreadsheetApp.create(`Drive重複ファイルリスト_${timestamp}`);
const sheet = ss.getActiveSheet();
sheet.appendRow(['ファイル名', 'サイズ(bytes)', 'MD5ハッシュ', 'ファイルID', 'ファイルURL']);
// Driveファイル一覧を取得(ページネーション対応)
const files = [];
let pageToken = null;
do {
const response = Drive.Files.list({
q: "trashed = false and mimeType != 'application/vnd.google-apps.folder'",
fields: "nextPageToken, items(id, title, fileSize, md5Checksum, mimeType)",
maxResults: 1000,
pageToken: pageToken,
});
if (response.items) {
files.push(...response.items);
}
pageToken = response.nextPageToken;
} while (pageToken);
// 重複判定用マップ
// キーは「ファイル名 + サイズ + md5Checksum」
// Google Docs系はmd5Checksumがnullなので名前+サイズだけで判定
const fileMap = {};
files.forEach(file => {
const size = file.fileSize || '0';
const md5 = file.md5Checksum || '';
const key = `${file.title}::${size}::${md5}`;
if (!fileMap[key]) fileMap[key] = [];
fileMap[key].push(file);
});
// 重複ファイルのみ抽出してスプレッドシートに書き込み
Object.values(fileMap).forEach(group => {
if (group.length > 1) {
group.forEach(file => {
const url = `https://drive.google.com/file/d/${file.id}/view`;
sheet.appendRow([file.title, file.fileSize || '', file.md5Checksum || '', file.id, url]);
});
// 空行でグルーピングを視認性アップ
sheet.appendRow([]);
}
});
Logger.log(`重複ファイルリストを作成しました: ${ss.getUrl()}`);
}
ポイント解説
Drive.Files.listはDrive APIのAdvancedサービスを有効にして使う(GASエディタの左メニュー「サービス」から追加)。- ファイル削除等のAPIは使わず、既存データへの影響はなし。
- 処理結果は新規スプレッドシートに書き出すため安全。
- 大量ファイルの場合は実行時間制限に注意し、必要に応じて分割実行を検討。
バックアップ・ロールバックと復元手順
今回のスクリプトは既存ファイルを操作しないため、大きなリスクはないが、もし運用でファイルを移動・整理する処理を追加する場合は必ずバックアップを取ってほしい。
DriveのファイルはGoogleドライブのゴミ箱から30日以内なら復元可能だが、誤操作を防ぐためにも以下が望ましい:
- 処理前に対象フォルダの共有設定やファイルリストをエクスポートしておく
- 影響の大きい操作はinstallable triggerや承認フローを設けて段階的に実行
- 万が一の削除や移動時はGoogleドライブの「ゴミ箱」から復元可能だが、運用上は慎重に
コスト削減イメージ(仮定)
重複ファイルを削除または整理することで、ストレージ容量を削減できる。例えば、
- 1GBあたりGoogle Workspaceの追加ストレージ料金が月500円と仮定
- 重複ファイルで10GBの無駄がある場合、年間で約6,000円のコスト削減になる計算
(計算式)
月額料金 × 削減容量(GB) × 12ヶ月 = 年間コスト削減額
500円 × 10GB × 12 = 60,000円
もちろん実際の使用状況や契約プランによって異なるため、あくまで参考値として捉えてほしい。
おわりに
Driveの重複ファイルは気づかないうちに容量を圧迫し、コスト増加につながる。GASおじラボのこのスクリプトを使って、安全に重複検出してみてくれ。削除や整理は慎重に、バックアップを忘れずに。
Googleアカウントの利用枠内で追加の専用SaaS料金なしで使えて、Apps ScriptのQuota・実行上限はあることに留意しよう。
もっと便利なツールやスクリプトを試したいなら、GASおじラボのメンバーシップもおすすめだ。500以上のツールが使い放題で、あなたの業務効率化を強力にサポートするぞ。