※本記事のスクリプトを実行したことによるいかなる損害についても責任を負いません。実行は自己責任でお願いします。テスト環境での事前確認を推奨します
※会社のアカウントで実行する場合は、事前に情シスや社内ルールを確認してください
ドライブの容量やばくね?
仕事でワークスペースアカウントを契約して、使い始めて半年、
10GBまで使用していました。
そして、ふとPCを覗かれた時に、「お前のマイドライブきったねえなあwwww」
と言われてしまい、わたくしは「ホアチャ!ホアチャ!」と奇声をあげて先輩をつつき返すことしかできませんでした。
少し冷静になって状況を考えてみますと、
Google Workspace(Businessプラン以上)の容量は、組織全体で共有されています。
・プラン別1人あたりの容量
| プラン | 容量 | 料金 | 所感 |
|---|---|---|---|
| Business Starter | 30 GB | ¥680 〜 ¥800 | メールとドキュメント中心なら十分 |
| Business Standard | 2 TB | ¥1,360 〜 ¥1,600 | ここが一番人気。容量が一気に60倍以上になります |
| Business Plus | 5 TB | ¥2,040 〜 ¥2,500 | さらに高度な管理機能が必要な場合 |
| Enterprise系 | 5 TB以上 | 要問い合わせ | 必要に応じて容量を無制限に拡張可能(要申請) |
ドライブの中身を見てみると...
〜〜〜テスト
無題のスプレッドシート
〜〜〜のコピー
無題のスプレッドシート
無題のスプレッドシート
無題のスプレッドシート
など、雑に増やしたスプレッドシートが大量に残っています。
このままでは会社のドライブを私が食い尽くす日も近いです。
ほな綺麗にしよか
方法
1、最初に自分のドライブ内の項目をリストアップ
2、特定のワードでチェック
3、削除処理
この順番で処理します。
手動での作業は嫌なので自動化で抽出しましょう。
ツールはGASを使います。
Googleのシステムに干渉するなら親和性の高いGASがいいに決まっています。
脳死で決めるな?異論は認めません。
そして異論がないのであれば問題がないのと同じことです。
問題はないのです。
実装
まずはスプレッドシートを開きます。
https://docs.google.com/spreadsheets
ここからは、先ほどのGAS(Google Apps Script)を使って、実際にドライブの断捨離システムを構築していく手順を解説します。
実装方法
-
Apps Scriptを開く
新しく開いた無題のスプレッドシートの上部メニューから、
拡張機能 > Apps Script をクリックします。 -
コードをコピペする
「無題のプロジェクト」という画面が開いたら、最初から入力されている function myFunction() { ... } を全て消して、下記のコードをそのままドーンと貼り付けます。 -
保存する
画面上部のフロッピーディスクのアイコン(プロジェクトを保存)をクリックします。
これで実装は完了です。
貼り付けるコード
// 設定: 何ヶ月以上前のファイルを「古い」とみなすか
const MONTHS_THRESHOLD = 12;
//ここでシート側にメニュー表示させる
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('断捨離メニュー')
.addItem('1. 全スプレッドシートをリストアップ', 'listAllSpreadsheets')
.addItem('2. チェックしたファイルをゴミ箱へ', 'deleteMarkedFiles')
.addToUi();
}
function listAllSpreadsheets() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.clear();
sheet.appendRow(['ファイル名', 'フォルダ名', 'URL', '最終更新日', 'オーナー', '判定用メモ', '削除(チェック)']);
sheet.setFrozenRows(1);
console.log("検索を開始します(自分のファイルのみ)...");
const query = "mimeType = '" + MimeType.GOOGLE_SHEETS + "' and trashed = false and 'me' in owners";
try {
const files = DriveApp.searchFiles(query);
let rows = [];
let totalCount = 0;
const thresholdDate = new Date();
thresholdDate.setMonth(thresholdDate.getMonth() - MONTHS_THRESHOLD);
if (!files.hasNext()) {
Browser.msgBox("自分がオーナーのスプレッドシートは見つかりませんでした。");
return;
}
while (files.hasNext()) {
const file = files.next();
const fileName = file.getName(); // 名前を変数に入れておく
// ログ出力
if (totalCount % 50 === 0) {
console.log(`処理中(${totalCount}件目〜): ${fileName}`);
}
const lastUpdated = file.getLastUpdated();
// 親フォルダ名の取得処理
let folderName = "マイドライブ(直下)";
const parents = file.getParents();
if (parents.hasNext()) {
folderName = parents.next().getName();
}
let owner = "自分";
let memo = "";
if (lastUpdated < thresholdDate) memo += "★1年以上更新なし ";
// 無題・Untitled(部分一致)
if (fileName.includes("無題") || fileName.includes("Untitled")) memo += "★名前がデフォルト ";
// コピー(部分一致に変更:startsWith -> includes)
if (fileName.includes("コピー")) memo += "★コピーファイル ";
// テスト(追加:部分一致)
if (fileName.includes("テスト")) memo += "★テストファイル ";
rows.push([
fileName,
folderName,
file.getUrl(),
lastUpdated,
owner,
memo,
false
]);
totalCount++;
// 50件ごとに書き込み
if (rows.length >= 50) {
const lastRow = sheet.getLastRow();
sheet.getRange(lastRow + 1, 1, rows.length, rows[0].length).setValues(rows);
sheet.getRange(lastRow + 1, 7, rows.length, 1).insertCheckboxes();
SpreadsheetApp.flush();
rows = [];
}
}
// 残りの書き込み
if (rows.length > 0) {
const lastRow = sheet.getLastRow();
sheet.getRange(lastRow + 1, 1, rows.length, rows[0].length).setValues(rows);
sheet.getRange(lastRow + 1, 7, rows.length, 1).insertCheckboxes();
}
console.log(`全処理完了: 合計 ${totalCount} 件`);
Browser.msgBox(`完了: あなたが管理している ${totalCount}個のファイルが見つかりました。`);
} catch (e) {
console.error("エラー: " + e.toString());
Browser.msgBox("エラーが発生しました。ログを確認してください。");
}
}
// 削除関数は前回のままでOKです
/**
* チェックボックスがONのファイルをゴミ箱に移動する関数
* (フォルダ名列追加版に対応)
*/
function deleteMarkedFiles() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const data = sheet.getDataRange().getValues();
let deleteCount = 0;
let errorCount = 0;
// 2行目からループ(ヘッダーを除く)
for (let i = 1; i < data.length; i++) {
// 【修正】列が増えたのでインデックスを調整
// A=0, B(フォルダ)=1, C(URL)=2, D=3, E=4, F(メモ)=5, G(チェック)=6
const isMarked = data[i][6]; // G列(インデックス6)がチェックボックス
const fileUrl = data[i][2]; // 【重要】URLはC列(インデックス2)になりました(前は1でした)
if (isMarked) { // チェックがONの場合のみ実行
try {
const fileId = fileUrl.match(/[-\w]{25,}/); // URLからID抽出
if (fileId) {
DriveApp.getFileById(fileId).setTrashed(true); // ゴミ箱へ移動
sheet.getRange(i + 1, 6).setValue("ゴミ箱へ移動済み");
deleteCount++;
}
} catch (e) {
console.error(e);
sheet.getRange(i + 1, 6).setValue("エラー: " + e.message);
errorCount++;
}
}
}
// 最後にチェックボックスを外す処理を入れると親切ですが、今回はそのままにします
Browser.msgBox(`処理完了: ${deleteCount}個をゴミ箱へ移動しました。(エラー: ${errorCount}個)`);
}
仕様と動かし方
コードを保存したら、スプレッドシートの画面に戻ります。
-
メニューの表示
スプレッドシートを一度再読み込みしてください。
すると、上部のメニューバーの右端あたりに「断捨離メニュー」という新しい項目が爆誕しているはずです。 -
スプレッドシートをリストアップ
断捨離メニュー > 全スプレッドシートをリストアップ をクリックします。
※初回実行時は「承認が必要です」という警告が出ます。
「続行」→自分のGoogleアカウントを選択→「詳細を表示」→「(安全ではないページ)へ移動」→「許可」の順に進めてください。 -
抽出結果の確認と選別
スクリプトが走り終わると、シート上にあなたがオーナーとなっているスプレッドシートがズラッと一覧で出力されます。
ここで注目すべきはF列の「判定用メモ」です。
★1年以上更新なし
★名前がデフォルト(無題、Untitled)
★コピーファイル
★テストファイル
これらの条件に引っかかったファイルには、自動で目印がついています。
消していいファイル名のG列(削除チェック)のチェックボックスをポチポチとONにしていきましょう。
4.いざ、ゴミ箱へ
消したいファイルにチェックを入れ終わったら、再度メニューから
断捨離メニュー > チェックしたファイルをゴミ箱へ を実行します。
結果
処理が完了すると、「〇〇個をゴミ箱へ移動しました」というメッセージが表示されます。
シート上の判定用メモの欄にも「ゴミ箱へ移動済み」と上書きされ、どのファイルを処理したかが一目でわかるようになっています。
数分で大量のゴミ(もとい、過去の遺産)を一掃することができました。
ちなみに、このスクリプトは「完全に削除」するのではなく「ゴミ箱に移動」するだけです。
「あ!あのテストファイル、実はめちゃくちゃ重要なマクロ組んでたんだった!」と思い出しても、30日以内ならゴミ箱から救出できる親切設計となっています。問題はないのです。
ですが焦ってゴミ箱漁りしているところを目撃された翌日には”ゴミ漁りの〇〇”というあだ名がつくことは間違いないので、怪しいスプシは消さないほうがいいでしょう
結論
日頃から綺麗にしとけや
注意
※本記事のスクリプトを実行したことによるいかなる損害についても責任を負いません。実行は自己責任でお願いします。テスト環境での事前確認を推奨します
※会社のアカウントで実行する場合は、事前に情シスや社内ルールを確認してください