はじめに
Google Drive上の重複したファイルを検出して削除します.
削除条件は任意に決めることができます.
最初に言うのもあれですが,大量のファイルがあると実行時間が上限を超えてしまうため,あまり実用的ではないです.
素直に謹製同期ソフトでダウンロードしたあと適当なフリーソフトで重複ファイルを削除する方がいいと思います.
利用するのであればファイルの数がコントロールできる特定のフォルダで定期的に実行するとかですかね.
※本ソースコードによって大切なファイルが削除され,復旧できなくなっても当方では一切の責任は負いません.
ソース
function main() {
//削除条件.上からサイズが同じ,ファイルのタイプが同じ,更新日時が古い,サイズが0以外
const detectCondition = function(x, y) {
return x.getSize() == y.getSize() &&
x.getMimeType() == y.getMimeType() &&
x.getLastUpdated() <= y.getLastUpdated() &&
x.getSize() != 0;
};
//ファイルの数によっては大変時間がかかる.最大実行時間を超えるとプログラムが強制終了する.
//const folderID = '特定のフォルダのID';
//const files = iteratorToArray(getAllFiles(folderID));//特定のフォルダのファイルの取得
const files = iteratorToArray(DriveApp.getFiles());//すべてのファイルの取得
const dupulicateFiles = detectDuplicateFiles(files, detectCondition);
Logger.log(dupulicateFiles);
dupulicateFiles.map(function(x) {
//x.setTrashed(true); ファイルを削除する.Logを見てからすること
})
}
//条件に合致したファイルの取得
function detectDuplicateFiles(files, detectCondition) {
return files.pullIf(function(file1) {
return files.some(function(file2) {
return file1.getId() != file2.getId() && detectCondition(file1, file2);
});
});
}
function getAllFiles(folderID) {
return DriveApp.getFolderById(folderID).getFiles();
}
//イテレータを配列に変換
function iteratorToArray(iterator) {
var array = [];
while(iterator.hasNext()) {
array.push(iterator.next());
}
return array;
}
//プロトタイプに直接書くのは良くない.
Array.prototype.pullIf = function(fn) {
var array = [];
this.map(function(x){
if(fn(x)) {
array.push(x);
}
});
return array;
}
あとがき
たまに書かないと文法とか忘れてしまいますね.Web上の開発環境が以前より充実していて書きやすかったです.
プログラムの実行時間が長いのは毎回APIに問い合わせているためだと思われるのでまとめて取得できる方法があれば実用的になるかもしれない.
参考資料
公式リファレンスです.ファイルのプロパティの取得などあります.
Class File | Apps Script | Google Developers
https://developers.google.com/apps-script/reference/drive/file