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

GASDriveメンテナンス
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ハッシュがないので除外するか、名前とサイズのみで判定するなど工夫が必要だ。

おじさんの提案は、以下の手順で処理すること:

  1. Drive内の全ファイル(または指定フォルダ内)を取得
  2. ファイル名・サイズ・MD5ハッシュをキーに重複判定用の辞書を作成
  3. 複数のファイルが同じキーにマップされているものを重複候補として抽出
  4. 新規に日時付きのスプレッドシートを作成し、重複リストを書き出す

コード例: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以上のツールが使い放題で、あなたの業務効率化を強力にサポートするぞ。

GASおじラボで500ツール使い放題 →