GASを使ったGoogleドライブ内のファイル一括削除|スプレッドシートを活用したドライブ整理

これまでに、GASを使ったアクセス権限の変更フォルダ内のファイルを一括コピーする方法をご紹介してきましたが、今回はGoogleドライブ内のファイル一括削除をご紹介します。

GASを用いたスクリプトを2つ使って、フォルダ内やドライブ全体のファイルをリスト化し、不要なものを一括削除する方法となります。

Googleドライブ内にたまったファイルを手動で一つずつ削除するのは時間がかかりますが、今回の方法なら効率的に削除できます。

目次

完成イメージ

ドライブ内のファイルをリスト化(GAS①)

選択したファイルの一括削除(GAS②)

  • フォルダ名またはIDを指定し、対象のファイルをスプレッドシートにリストアップ
  • 削除対象をチェックボックスで選択し、一括削除を実行
  • 削除されたファイルの履歴を記録

本スクリプトは、Google ドライブ上のファイルを「ゴミ箱」に移動するため、完全には削除されません。
ファイルの完全な削除には、必要に応じて Google ドライブのゴミ箱を手動で操作する必要があります。

手順

スクリプト1:ファイルのリスト化

削除したいファイルをリスト化し、どのファイルを削除するか選択できるようにします。

STEP
スプレッドシートを開く

スプレッドシートを開きます。

(既存 or 新規ファイルのどちらも可)

項目も含めてGASで作成されるため、手入力は不要です。

  • シート名「ファイル一括削除」として新規作成されます
STEP
GASエディタを開く

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。

STEP
GASスクリプトの作成

function myFunction(){

}

が最初から入っているため、消去して以下のスクリプトを貼り付けます。

function listFilesForDeletion() {
  const ui = SpreadsheetApp.getUi();
  const response = ui.prompt(
    'フォルダを指定',
    '「ドライブ内すべて」と入力するか、フォルダ名またはフォルダIDを入力してください:',
    ui.ButtonSet.OK_CANCEL
  );

  if (response.getSelectedButton() == ui.Button.CANCEL) {
    ui.alert('操作がキャンセルされました。');
    return;
  }

  const input = response.getResponseText().trim();

  // 入力値が「ドライブ内すべて」の場合は全ファイルをリスト、それ以外はフォルダを指定
  if (input === 'ドライブ内すべて') {
    listAllFilesForDeletion();
  } else {
    listFilesInFolderForDeletion(input);
  }
}

function listAllFilesForDeletion() {
  const sheet = setupDeletionSheet();
  const files = DriveApp.getFiles();
  let row = 2;

  while (files.hasNext()) {
    const file = files.next();
    appendFileDataForDeletionToSheet(sheet, file, row);
    row++;
  }
}

function listFilesInFolderForDeletion(folderNameOrId) {
  const sheet = setupDeletionSheet();
  let folder;

  try {
    folder = DriveApp.getFolderById(folderNameOrId);
  } catch (e) {
    const folders = DriveApp.getFoldersByName(folderNameOrId);
    if (folders.hasNext()) {
      folder = folders.next();
    } else {
      SpreadsheetApp.getUi().alert('フォルダが見つかりません。');
      return;
    }
  }

  const files = folder.getFiles();
  let row = 2;

  while (files.hasNext()) {
    const file = files.next();
    appendFileDataForDeletionToSheet(sheet, file, row);
    row++;
  }
}

function setupDeletionSheet() {
  const sheetName = 'ファイル一括削除';
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName) || SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);
  
  // シートを初期化
  sheet.clear();
  
  // ヘッダーを設定
  const headers = [
    'フォルダ名', 
    'ファイル名', 
    'オーナー', 
    '最終更新日', 
    '削除対象'
  ];
  
  sheet.appendRow(headers);
  const headerRange = sheet.getRange(1, 1, 1, headers.length);
  headerRange.setHorizontalAlignment('center');
  headerRange.setVerticalAlignment('middle');
  
  // ヘッダーの背景色を設定(明るい緑3)
  headerRange.setBackground('#B7E1CD');
  
  return sheet;
}

function appendFileDataForDeletionToSheet(sheet, file, row) {
  const folderName = getFolderName(file);
  const fileName = file.getName();
  const fileLink = file.getUrl();
  const owner = file.getOwner() ? file.getOwner().getEmail() : 'オーナーなし';
  const lastUpdated = file.getLastUpdated();
  
  // データを追加(ファイル名にハイパーリンクを設定)
  sheet.getRange(row, 1).setValue(folderName);
  sheet.getRange(row, 2).setFormula(`=HYPERLINK("${fileLink}", "${fileName}")`);
  sheet.getRange(row, 3).setValue(owner);
  sheet.getRange(row, 4).setValue(lastUpdated);
  sheet.getRange(row, 5).insertCheckboxes(); // 削除対象チェックボックス
}

function getFolderName(file) {
  const parents = file.getParents();
  return parents.hasNext() ? parents.next().getName() : 'ルート';
}
スクリプト1の説明
listFilesForDeletion関数

ユーザーにフォルダ名または「ドライブ内すべて」を指定するように促し、指定されたフォルダ内またはドライブ全体のファイルをリスト化します。

function listFilesForDeletion() {
  const ui = SpreadsheetApp.getUi();
  const response = ui.prompt(
    'フォルダを指定',
    '「ドライブ内すべて」と入力するか、フォルダ名またはフォルダIDを入力してください:',
    ui.ButtonSet.OK_CANCEL
  );

  if (response.getSelectedButton() == ui.Button.CANCEL) {
    ui.alert('操作がキャンセルされました。');
    return;
  }

  const input = response.getResponseText().trim();

  // 入力値が「ドライブ内すべて」の場合は全ファイルをリスト、それ以外はフォルダを指定
  if (input === 'ドライブ内すべて') {
    listAllFilesForDeletion();
  } else {
    listFilesInFolderForDeletion(input);
  }
}
  • ui.prompt() を使用してユーザーに入力を求め、フォルダ名やフォルダIDを入力することでリスト化の範囲を決定します。
  • 入力が「ドライブ内すべて」の場合、ドライブ内の全ファイルをリスト化する listAllFilesForDeletion() 関数が呼ばれます。
  • それ以外の場合、指定したフォルダ内のファイルをリスト化する listFilesInFolderForDeletion() 関数が呼ばれます。
listAllFilesForDeletion関数

Google Drive内のすべてのファイルをリスト化します。

function listAllFilesForDeletion() {
  const sheet = setupDeletionSheet();
  const files = DriveApp.getFiles();
  let row = 2;

  while (files.hasNext()) {
    const file = files.next();
    appendFileDataForDeletionToSheet(sheet, file, row);
    row++;
  }
}
  • DriveApp.getFiles() を使用してドライブ内のすべてのファイルを取得し、それらをスプレッドシートに追加します。
listFilesInFolderForDeletion関数

指定されたフォルダ内のファイルをリスト化します。

function listFilesInFolderForDeletion(folderNameOrId) {
  const sheet = setupDeletionSheet();
  let folder;

  try {
    folder = DriveApp.getFolderById(folderNameOrId);
  } catch (e) {
    const folders = DriveApp.getFoldersByName(folderNameOrId);
    if (folders.hasNext()) {
      folder = folders.next();
    } else {
      SpreadsheetApp.getUi().alert('フォルダが見つかりません。');
      return;
    }
  }

  const files = folder.getFiles();
  let row = 2;

  while (files.hasNext()) {
    const file = files.next();
    appendFileDataForDeletionToSheet(sheet, file, row);
    row++;
  }
}
  • ユーザーが入力したフォルダIDまたはフォルダ名を元に、該当するフォルダを取得します。
  • 指定したフォルダ内のファイルを getFiles() メソッドで取得し、スプレッドシートにリストアップします。
setupDeletionSheet関数

リスト化に使用するスプレッドシートをセットアップします。

function setupDeletionSheet() {
  const sheetName = 'ファイル一括削除';
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName) || SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);
  
  // シートを初期化
  sheet.clear();
  
  // ヘッダーを設定
  const headers = [
    'フォルダ名', 
    'ファイル名', 
    'オーナー', 
    '最終更新日', 
    '削除対象'
  ];
  
  sheet.appendRow(headers);
  const headerRange = sheet.getRange(1, 1, 1, headers.length);
  headerRange.setHorizontalAlignment('center');
  headerRange.setVerticalAlignment('middle');
  
  // ヘッダーの背景色を設定(明るい緑3)
  headerRange.setBackground('#B7E1CD');
  
  return sheet;
}
  • シート名「ファイル一括削除」を持つシートを取得または新規作成し、初期化します。
  • ヘッダー行(フォルダ名、ファイル名、オーナー、最終更新日、削除対象)を設定し、視覚的に見やすくするために背景色を設定します。
appendFileDataForDeletionToSheet関数

各ファイルの情報をスプレッドシートに追加します。

function appendFileDataForDeletionToSheet(sheet, file, row) {
  const folderName = getFolderName(file);
  const fileName = file.getName();
  const fileLink = file.getUrl();
  const owner = file.getOwner() ? file.getOwner().getEmail() : 'オーナーなし';
  const lastUpdated = file.getLastUpdated();
  
  // データを追加(ファイル名にハイパーリンクを設定)
  sheet.getRange(row, 1).setValue(folderName);
  sheet.getRange(row, 2).setFormula(`=HYPERLINK("${fileLink}", "${fileName}")`);
  sheet.getRange(row, 3).setValue(owner);
  sheet.getRange(row, 4).setValue(lastUpdated);
  sheet.getRange(row, 5).insertCheckboxes(); // 削除対象チェックボックス
}
  • ファイルのフォルダ名、ファイル名(リンク付き)、オーナー、最終更新日をスプレッドシートに記載し、削除対象としてチェックボックスを追加します。
getFolderName関数

ファイルが所属するフォルダ名を取得します。

function getFolderName(file) {
  const parents = file.getParents();
  return parents.hasNext() ? parents.next().getName() : 'ルート';
}
  • ファイルの親フォルダが存在する場合はその名前を返し、存在しない場合は「ルート」として表示します。
STEP
スクリプトを保存

スクリプトを書いたら、名前を付けて保存します。

(例:「ファイル削除選択」)

STEP
スクリプトを実行

スクリプトを実行します。

初めてそのスクリプトを実行する場合は権限の確認が必要です。

そのため、『権限を確認』を押します。

許可の詳細手順

「詳細」をクリックします。

無題のプロジェクト(安全ではないページ)に移動」をクリックします。

許可」をクリックします。

STEP
ドライブ内すべて or フォルダを指定

スクリプトを実行すると、最初にポップアップが表示されます。

ここで、ドライブ内すべてもしくは特定のフォルダ名またはフォルダIDを入力します。

STEP
新しいシートが作成されファイルをリスト化

ファイルを実行するとシートが新たに作成されます。

シート名:「ファイル一括削除」

作成されたシートには以下内容がリスト化されます

項目
A列フォルダ名
B列ファイル名
C列オーナー
D列最終更新日
E列削除対象

スクリプト2: 選択したファイルを削除

このスクリプトで、リスト化したファイルの中から削除したいものを選択して一括削除します。

STEP
削除するファイルを選択

削除したいファイルのチェックボックスにチェックを入れます。

STEP
GASエディタを開く
スクリプト1と同様の手順です。

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。

STEP
GASスクリプトの作成
以下のスクリプトを貼り付けます。

function myFunction(){

}

が最初から入っているため、消去して以下のスクリプトを貼り付けます。

function deleteSelectedFiles() {
  const sheetName = 'ファイル一括削除';
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  if (!sheet) {
    SpreadsheetApp.getUi().alert('シート「ファイル選択削除」が見つかりません。');
    return;
  }
  
  // ヘッダーの設定
  const headers = [
    'フォルダ名', 
    'ファイル名', 
    'オーナー', 
    '最終更新日', 
    '削除対象', 
    '削除済み'
  ];
  
  sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
  
  const headerRange = sheet.getRange(1, 1, 1, headers.length);
  headerRange.setHorizontalAlignment('center');
  headerRange.setVerticalAlignment('middle');
  headerRange.setBackground('#B7E1CD'); // 明るい緑3
  
  const lastRow = sheet.getLastRow();
  for (let i = 2; i <= lastRow; i++) {
    const checkbox = sheet.getRange(i, 5).getValue();
    
    if (checkbox) { // E列にチェックが入っている場合
      const fileLink = sheet.getRange(i, 2).getFormula();
      const fileIdMatch = fileLink.match(/\/d\/([a-zA-Z0-9-_]+)/);
      
      if (fileIdMatch) {
        try {
          const fileId = fileIdMatch[1];
          const file = DriveApp.getFileById(fileId);
          
          // ファイルを削除
          file.setTrashed(true);
          
          // タイムスタンプをF列に追加
          sheet.getRange(i, 6).setValue(new Date());
          
          // フォルダ名を「ゴミ箱」に変更
          sheet.getRange(i, 1).setValue('ゴミ箱');
          
          // E列のチェックボックスをリセット
          sheet.getRange(i, 5).setValue(false);
        } catch (e) {
          console.error('ファイルの削除中にエラーが発生しました:', e.message);
        }
      } else {
        console.warn('ファイルリンクからIDを抽出できませんでした:', fileLink);
      }
    }
  }
}
スクリプトの説明
deleteSelectedFiles関数

スプレッドシート内のチェックボックスにチェックが入ったファイルを削除します。

function deleteSelectedFiles() {
  const sheetName = 'ファイル一括削除';
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  if (!sheet) {
    SpreadsheetApp.getUi().alert('シート「ファイル選択削除」が見つかりません。');
    return;
  }
  
  // ヘッダーの設定
  const headers = [
    'フォルダ名', 
    'ファイル名', 
    'オーナー', 
    '最終更新日', 
    '削除対象', 
    '削除済み'
  ];
  
  sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
  
  • シート「ファイル一括削除」を取得し、リスト化されたファイルの情報を確認します。
  • 削除対象となるファイルを getRange() メソッドで取得し、チェックが入っている場合に処理を進めます。
削除処理

チェックボックスが選択されているファイルを削除します。

  const lastRow = sheet.getLastRow();
  for (let i = 2; i <= lastRow; i++) {
    const checkbox = sheet.getRange(i, 5).getValue();
    
    if (checkbox) { // E列にチェックが入っている場合
      const fileLink = sheet.getRange(i, 2).getFormula();
      const fileIdMatch = fileLink.match(/\/d\/([a-zA-Z0-9-_]+)/);
      
      if (fileIdMatch) {
        try {
          const fileId = fileIdMatch[1];
          const file = DriveApp.getFileById(fileId);
          
          // ファイルを削除
          file.setTrashed(true);
  • 各ファイルのリンクからファイルIDを抽出し、 DriveApp.getFileById() を使用して該当ファイルを取得します。
  • setTrashed(true) メソッドを使ってファイルをゴミ箱に移動します。
削除済みの記録

削除が完了したファイルには削除のタイムスタンプを追加します。

          // タイムスタンプをF列に追加
          sheet.getRange(i, 6).setValue(new Date());
          
          // フォルダ名を「ゴミ箱」に変更
          sheet.getRange(i, 1).setValue('ゴミ箱');
          
          // E列のチェックボックスをリセット
          sheet.getRange(i, 5).setValue(false);
        } catch (e) {
          console.error('ファイルの削除中にエラーが発生しました:', e.message);
        }
  • 削除日時をスプレッドシートの「削除済み」列に記録し、削除履歴として残します。
  • 削除対象のチェックボックスはリセットされ、フォルダ名は「ゴミ箱」に変更されます。
STEP
スクリプトを保存
スクリプト1と同様の手順です。

スクリプトを書いたら、名前を付けて保存します。

(例:「ファイル一括削除」)

STEP
スクリプトを実行
スクリプト1と同様の手順です。

スクリプトを実行します。

初めてそのスクリプトを実行する場合は権限の確認が必要です。

そのため、『権限を確認』を押します。

許可の詳細手順

「詳細」をクリックします。

無題のプロジェクト(安全ではないページ)に移動」をクリックします。

許可」をクリックします。

STEP
選択したファイルが削除される

スクリプトを実行すると、チェックを入れたファイルが削除されます。

  • A列のフォルダ名が「ゴミ箱」に変更されます。
  • E列の削除対象のチェックボックスはリセットされます。
  • F列の削除済み欄にタイムスタンプ(削除した日付)が押されます。

注意事項

ファイルのアクセス権限

スクリプト実行には十分な権限が必要です。

ファイルのオーナーでない場合は削除できません。

完全削除の前に確認

スクリプトによって削除されたファイルは「ゴミ箱」に移動されます。

完全削除する前に最終チェックをおすすめします。

まとめ

GASを使ってGoogleドライブ内のファイルを効率的に整理することで、時間を節約できます。

GASで自動化できる業務フローがあれば、どんどん活用していきましょう!

弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。

GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。

また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。

貴方の業務改善を全力でサポートいたします。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次