2022/09/15に更新

【GASで整理】ドライブ上の同名のファイルを検索する

ドライブスプレッドシート実験的

Googleドライブ上でファイル名が重複しているものを探すGoogle Apps Scriptです。同じ名前のファイルに苦しめられている方、いかがですか?

こんな悩みを解決します


  • Googleドライブの中で、ファイル名が被っているものを見つけたい!
  • 同じ名前が許されるからと、適当に命名していたらわけがわからなくなった・・・重複したファイル名を撲滅したい!

用意するもの


スプレッドシートがあればOKです。

このスクリプトで出来ること


  • 指定したフォルダ配下のすべてのファイルから、ファイル名が重複しているものをリストアップすることができます。
  • 起点となるフォルダはプロンプトで入力できるので分割実行がしやすいです。

使い方


1.スクリプトの実行

このスクリプトを実行すると、アクティブなシートのA1セルから結果を書き込みます。空白のシートで実行することをおすすめします。
上のメニューにある「スクリプト実行」から「ファイル名が重複しているものを調べる」を実行します。

プロンプトが表示されますので、ファイルを探す起点となるフォルダURLを入力してOKを押します。
キャンセルを押すと何もせずに終了します。

2.結果の確認

A列にファイル名が、B列にファイルのURLが書き出されます。
謎のファイルが結構ありますね・・・。

重複したファイル名が見つからない場合は「ファイル名の重複は見つかりませんでした」というメッセージを表示して終了します。

もしファイルが1個も見つからない場合は「ファイルが見つかりませんでした」というメッセージを表示して終了します。

3.注意点

ファイルのMIMEタイプは見ていませんので、スライドとスプレッドシートの2つが同名だったとしても結果に出力されます。

動作確認した範囲では問題なさそうですが、あんまり自信がないコードです。ご利用の際は色々とお気をつけください。
もっとキレイに書けそうですが、疲れたのでこれで・・・。

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00145/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  // UIの取得
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('ファイル名が重複しているものを調べる', 'check_duplicate_filename');

  // メニューを画面に追加する
  menu.addToUi();
}


function get_all_files(root_folder, file_list) {

  // 起点のフォルダ内にあるフォルダを取得する
  let folders = root_folder.getFolders();

  // 存在するフォルダの数だけループ
  while (folders.hasNext()) {

    // フォルダを取得
    let folder = folders.next();

    // フォルダ内のファイルを取得
    let files = folder.getFiles();

    // 存在するファイルの数だけループ
    while (files.hasNext()) {

      // ファイルを取得する
      let file = files.next();

      // ファイル名を取得する
      let file_name = file.getName();

      // ファイルURLを取得
      let file_url = file.getUrl();

      // 結果の配列に追加する
      file_list.push([file_name, file_url]);

    }

    // 再帰的にフォルダを探すため、自分自身を呼び出す
    get_all_files(folder, file_list);

  }

  // 指定フォルダ以下のすべてのファイル一覧を返す
  return file_list;
}


function check_duplicate_filename() {

  // プロンプトを表示するためUIオブジェクトを取得
  const ui = SpreadsheetApp.getUi();

  // ファイルを探す起点のフォルダを入力してもらう
  const response = ui.prompt('ファイルを探す起点のフォルダURLを入力してください', '例:https://drive.google.com/drive/folders/****************', ui.ButtonSet.OK_CANCEL);

  // キャンセルが押されたら何もせず終了
  if (response.getSelectedButton() == ui.Button.CANCEL) {
    return;
  }

  // 正規表現でフォルダのIDを取り出す
  const folder_id = response.getResponseText().match(/^.*\/folders\/(.*)$/)[1];

  // IDからフォルダを取得する
  const folder = DriveApp.getFolderById(folder_id);

  // 用意した関数を使い、フォルダに存在するファイルすべてを再帰的に取得する
  let  file_list = [];
  file_list = get_all_files(folder, file_list);

  // 起点のフォルダ内のファイルが含まれていなかったので追加する
  let root_files = folder.getFiles();

  // 存在するファイルの数だけループ
  while (root_files.hasNext()) {

    // ファイルを取得する
    let file = root_files.next();

    // ファイル名を取得する
    let file_name = file.getName();

    // ファイルURLを取得
    let file_url = file.getUrl();

    // 結果の配列に追加する
    file_list.push([file_name, file_url]);

  }

  // ファイルが1件もない場合は終了する
  if (file_list.length == 0) {
    ui.alert('ファイルが見つかりませんでした');
    return;
  }

  // ファイル名を一時的に格納する配列。
  const temp = [];

  // 重複したファイル名を格納する配列
  const duplicate_name = [];

  // ファイルの数だけループ
  for (let i = 0; i < file_list.length; i++) {

    // ファイル名がtempにすでにある = 2回目以降の出現。
    if (temp.includes(file_list[i][0])) {

      // 重複リストにまだなければ、リストに追加
      if (!duplicate_name.includes(file_list[i][0])) {
        duplicate_name.push(file_list[i][0]);
      } else {
        // リストにすでに入っていれば追加する必要がないのでcontinueする
        continue;
      }

    } else {
      // tempにまだ無い場合は名前を追加する
      temp.push(file_list[i][0]);
    }
  }

  // 重複したファイルを格納する配列
  const duplicate_files = [];

  // 重複しているファイル名リストをループ
  for (let i = 0; i < duplicate_name.length; i++) {

    // すべてのファイルリストをループ
    for (let j = 0; j < file_list.length; j++) {

      // 重複ファイル名とすべてのファイルリストの名前が一致したら
      if (duplicate_name[i] == file_list[j][0]) {

        // 重複ファイルとして配列に追加する
        duplicate_files.push(file_list[j]);

      }
    }
  }

  // 重複したファイル名が1件もない場合は終了する
  if (duplicate_files.length == 0) {
    ui.alert('ファイル名の重複は見つかりませんでした');
    return;
  }

  // 項目名を追加する
  duplicate_files.unshift(['ファイル名', 'ファイルURL']);

  // 開いているスプレッドシートのオブジェクトを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // アクティブなシートオブジェクトを取得
  const sheet = ss.getActiveSheet();

  // 書き込み範囲を取得。範囲は書き込むデータの行、列の数に合わせる
  const range = sheet.getRange(1, 1, duplicate_files.length, duplicate_files[0].length);

  // ファイル名とURLを書き込む
  range.setValues(duplicate_files);

}

関連するアプリ


【GASで時短】ファイル名に文字列を追加する

指定したフォルダ内のすべてのファイルに、プレフィックス(接頭辞)を付与するGoogle Apps Scriptです。例えばスマホで撮影した写真のファイル名に「yyyy/mm/dd 運動会_元のファイル名.jpg」のように変更することができます。

【GASで時短】ファイル名の一部を削除する

フォルダ内のすべてのファイルを対象に、ファイル名の一部を消すことが出来るGoogle Apps Scriptです。ドライブでファイルのコピーをすると「のコピー」が付与されますがこのような文字列を消すことができます。

【GASで時短】ファイル名に作成日を追加する

ファイル名の先頭にファイルの作成日を追加するGoogle Apps Scriptです。ドライブのファイル一覧で表示されるのは「最終更新日」だけで、作成日は各ファイルをクリックして右ペインを見ないとわかりません。わからないならファイル名に追加してしまおうというスクリプトです。「yyyy-mm-dd_元のファイル名」のように変えることができます。

【GASで時短】更新からN時間以上経過したファイルを削除する

最終更新日時からN時間以上経過したファイルを削除するGoogle Apps Scriptです。GASが自動的に吐き出すログファイルや、不要なファイルの一括削除に使えます。「削除」といってもゴミ箱へ移動する処理なので、誤って実行しても復元が可能です。

【GASで時短】ドライブのファイルリストをスプレッドシートに出力する

指定したGoogle ドライブのファイル一覧をスプレッドシートに出力するGoogle Apps Scriptです。最終更新日時やオーナー、URLも出力するのでフォルダ整理する時に使えるかも。

【GASで時短】ファイルを指定回数コピーする

指定したファイルを指定した回数だけコピーするGoogle Apps Scriptです。テンプレートを受講者分コピーしたいときなどに。

【GASで時短】ファイルの親フォルダを調べる

シートに記載したファイルURLを元に、親フォルダの名前とURLを出力するGoogle Apps Scriptです。

【GASで整理】URLリストを元にファイルをまとめて削除する

シートにGoogleドライブのファイル(URL)を記載すると、そのファイルを削除してくれるGoogle Apps Scriptです。

【GASで時短】再帰的にドライブフォルダ内のファイルリストを出力する

指定したGoogle ドライブのファイル一覧をスプレッドシートに出力するGoogle Apps Scriptです。子フォルダ(サブフォルダ)も再帰的に探して一覧を出力します。

タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp