2015年7月30日木曜日

Googleドライブの不要なファイルを自動で削除してみる 【リストアップ編】

こんにちは、井下です。

いよいよ高校野球の甲子園出場校が揃ってきましたね。
野球をやっていたわけではありませんが、一発勝負ならではの真剣みが伝わってきて、毎年時間があれば何となく見てしまいます。


ところで、みなさんはGoogleドライブはご利用でしょうか? "とりあえずのファイル共有"くらいの意識から手軽に使えるストレージサービスです。スプレッドシートを作成したり、保存されているスプレッドを開く場所と言えば、もっと分かりやすいかもしれませんね。

Googleドライブには容量制限がありますが、スプレッドシートやGoogleドキュメントなど、Googleの提供するサービスであれば、容量制限に関係なく、いくらでも作成することができます。

そのため、気が付いたら不要なファイルが大量に作成されている… なんてことも出てきます。(Googleの提供するサービスであれば)容量制限には関係ないとはいえ、不要なファイルがいくつもあるのはあまり良い気持ちにはなりません。


そこで、今回と次回はGoogle Apps Scriptを使って、不要なファイルを削除(※)してみようと思います。
なお、"不要なファイル"かの判断を自動で行うことは難しいので、"最終更新日から一定の日付が経過しているファイル"を"不要かもしれないファイル"とします。"不要かもしれないファイル"から人が見て確認したうえで、本当に"不要なファイル"だけを削除します。

(※)厳密にはゴミ箱への移動を行い、完全に削除はしません。Google Apps Scriptの仕様上、完全に削除することができないためです。また、オーナーが自分でない場合はゴミ箱への移動もできないため、厳密に言えば"オーナーが自分で、不要なファイルをゴミ箱へ移動する"となります。

方法としては、次の手順を踏みます。

  1. "最終更新日から一定の日付が経過しているファイル"をスプレッドシートにリストアップする(不要かもしれないファイルの一覧作成)
  2. リストアップされたファイル名から、不要なファイルのみを削除する

今回は手順の1を実装・説明します。
手順の2は次回実装・説明する予定です。


まず、Google Apps Scriptのプロジェクトをスプレッドシートから作成してください。
参考:Google Apps Scriptを使う準備

Google Apps Scriptのプロジェクトを作成したら、下記のコードをコピー&ペーストで貼り付けた後、"listup"メソッドを実行してください。
NAME_COLUMN = 1
OWNER_COLUMN = 2;
LAST_UPDATED_COLUMN = 3;
ID_COLUMN = 4;

HEADER_ROW = 1
WRITE_START_ROW = 2

function listup() {
  var DATE_OFFSET = 90;
  var sheet = SpreadsheetApp.getActiveSheet();

  var nowDate = new Date();
  var baseDate = dateFormat(new Date(nowDate.getFullYear(), nowDate.getMonth(), nowDate.getDate() - DATE_OFFSET));

  var files = DriveApp.searchFiles('modifiedDate <= "' + baseDate + '"');
  var row = WRITE_START_ROW;

  writeHeader(sheet)

  while(files.hasNext()){
    var file = files.next();
    sheet.getRange(row, NAME_COLUMN).setValue("=HYPERLINK(\"" + file.getUrl() + "\",\"" + file.getName() + "\")");
    sheet.getRange(row, OWNER_COLUMN).setValue(file.getOwner().getName());
    sheet.getRange(row, LAST_UPDATED_COLUMN).setValue(file.getLastUpdated());
    sheet.getRange(row, ID_COLUMN).setValue(file.getId());
    row++;
  }
}

function writeHeader(sheet) {
  sheet.getRange(HEADER_ROW, NAME_COLUMN).setValue('ファイル名');
  sheet.getRange(HEADER_ROW, OWNER_COLUMN).setValue('オーナー');
  sheet.getRange(HEADER_ROW, LAST_UPDATED_COLUMN).setValue('最終更新日');
  sheet.getRange(HEADER_ROW, ID_COLUMN).setValue('ファイルID');
}

function dateFormat(date) {
  return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1) ).slice(-2) + '-' + ('0' + date.getDate()).slice(-2);
}

実行すると、スプレッドシートにファイルの情報が出力されます。

A列はファイル名(リンク付き)、B列にはオーナー、C列には最終更新日、D列にはファイルIDとなっています。ファイルIDは人が見た際は要不要の判断に関係しませんが、次回のファイル削除を行う際、一意にどのファイルを指しているのかを識別するために利用します。


もしもスプレッドシートにファイルの情報が出力されていない場合、"DATE_OFFSET"の値(青字になっている値)を小さくしてから、再度実行してみてください。
"DATE_OFFSET"の値は実行日から何日前のファイル情報を出力するかの条件設定です。デフォルトでは90としていますが、必要に応じてこの値は変更してください。

コードの中の核となる処理はシンプルで、"DriveApp.searchFiles"を利用して最終更新日が"実行日 - DATE_OFFSET"より古いファイルの情報を取得し、後はwhile(files.hasNext())内でループさせ、ファイルの情報をスプレッドシートに書き込んでいます。

リストアップするファイルの条件を追加・変更したい場合は、"DriveApp.searchFiles"で指定している引数を、用途に応じて変更します。

ここまでで"不要かもしれないファイル"のリストアップができました。ファイル数が少なければ、手動で不要なファイルを削除することもできますが、やはりここまで来たら自動で削除も行いたいところですね。
次回は今回リストアップしたファイルの情報を元に、不要なファイルを自動で削除します。

0 件のコメント:

コメントを投稿