GASでGoogleドライブ自動バックアップ 中小企業のファイル消失リスクをゼロに
Googleドライブは便利ですが、標準機能だけでは「フォルダごと誤って削除された」「共同編集者が上書きしてしまった」という事故に弱い面があります。Google Apps Script(以下 GAS)で毎日フォルダを複製し、世代管理まで行う仕組みを、追加ツールなし・月額¥0で構築する方法をコードごと公開します。
- 指定フォルダの中身を毎日自動でまるごと複製(人の操作ゼロ)
- 世代管理付き: 古いバックアップは指定件数を超えたら自動で削除、ドライブ容量を圧迫しない
- 外部の自動化サービスやバックアップ製品は不要。Google 標準機能だけで月¥0
- 本記事のコードはそのままコピーして動く(フォルダ複製+世代管理+日次トリガー)
- 設定は約30分、必要なのは Googleアカウントの編集権限のみ
編集長の見解:Google ドライブの「ファイルの復元」は、あくまで個々のファイルの変更履歴やゴミ箱を対象にした仕組みです。フォルダ単位で「昨日の状態にまるごと戻す」ことは想定されていません。ここで重要なのは、高価なバックアップ専用製品を導入する前に、Google が無料で配っている実行環境で最低限の世代バックアップを自前で持っておくことです。
🔍 なぜ Google ドライブ標準機能だけでは足りないのか
Google ドライブには、ファイルの変更履歴(バージョン管理)とゴミ箱という 2 つの復元手段が備わっています。どちらも便利ですが、限界があります。
- ゴミ箱の保持期間は30日: ゴミ箱に移動したファイルは、30日経過すると自動的に完全削除されます(Google Developers 公式ドキュメント)。30日を超えて気づいた消失は復元できません
- フォルダ単位の「まるごと復元」は非対応: 変更履歴はファイル単位のため、フォルダ内の複数ファイルが同時に消えた・壊れたケースを一括で戻す機能ではありません
- 共同編集者の上書きは検知されない: 誰かが誤って別ファイルを上書き保存しても、通知は届きません
これらのすき間を埋めるのが「毎日、別の場所へフォルダごと複製しておく」という古典的だが確実な対策です。次のセクションで、その全体像を図にします。
🗺 全体フロー — 3ステップで完結
仕組みは単純です。毎日決まった時刻に GAS が起動し、対象フォルダの中身をタイムスタンプ付きの新しいフォルダへ複製したうえで、古い世代を自動整理します。
毎日決まった時刻に自動実行、人の操作はゼロ
登場する部品は 2 つだけです。役割を整理します。
| 部品 | 役割 | 公式ドキュメント |
|---|---|---|
| DriveApp サービス | フォルダ・ファイルの複製と削除を操作 | DriveApp リファレンス |
| 時間主導型トリガー | 毎日決まった時刻に関数を自動実行 | インストール型トリガー |
この 2 つをつなぐのが、次のセクションで示すコードです。コピーして貼り付けるだけで済みます。
💰 必要なものと費用の目安
このレシピは、追加の支出が一切発生しない構成です。用意するものを表で確認してください。
| 必要なもの | 役割 | 費用の目安 |
|---|---|---|
| Googleアカウント(無料 or Workspace) | バックアップ対象フォルダと保存先フォルダの用意 | 無料(Workspace は既存契約で可) |
| Google Apps Script | 複製・世代管理・トリガー実行の実行環境 | 無料 |
| Google ドライブの空き容量 | 複製先の保存領域(世代数 × フォルダ容量分) | 既存プランの容量内(無料15GB〜) |
複製のたびに元フォルダと同じ容量を消費するため、世代数を増やすほどドライブ容量を使います。容量が気になる場合は保持する世代数を減らすか、Google One の有料プランで容量追加を検討してください。
💡 編集部の判断材料:すでに専用バックアップ製品を契約中なら、無理に乗り換える必要はありません。GAS が向くのは「まずは無料で最低限の世代バックアップを持ちたい」「特定の重要フォルダだけ守りたい」ケースです。フォルダ更新をチームに通知したい場合はZapierでGoogleドライブ新ファイル→Slack自動共有するレシピもあわせて検討してください。
判断がついたら、実際の構築に進みます。
🛠 設定手順 — 約30分で完成
作業は「複製元と複製先のフォルダを用意する」「GAS 側でコードを貼る」「日次トリガーを設定する」の3段階です。プログラミングの知識は不要で、コードは本記事のものをそのまま貼り付ければ動きます。
/folders/ の後ろ)の文字列を控えます。dailyBackup を一度手動実行し、複製先フォルダに日付付きフォルダができているか確認します。貼り付けるコード(そのまま動きます)
以下を Apps Script エディタの コード.gs に貼り付けてください。日次トリガーから呼ばれる dailyBackup が本体です。
/**
* Googleドライブ フォルダの自動バックアップ(世代管理付き)
* トリガー: 時間主導型(日タイマー)で dailyBackup を実行
*/
function dailyBackup() {
const props = PropertiesService.getScriptProperties();
const sourceFolderId = props.getProperty('SOURCE_FOLDER_ID');
const backupParentId = props.getProperty('BACKUP_PARENT_FOLDER_ID');
const keepGenerations = Number(props.getProperty('KEEP_GENERATIONS') || '7');
if (!sourceFolderId || !backupParentId) {
throw new Error('SOURCE_FOLDER_ID / BACKUP_PARENT_FOLDER_ID がスクリプトプロパティに未設定です');
}
const sourceFolder = DriveApp.getFolderById(sourceFolderId);
const backupParent = DriveApp.getFolderById(backupParentId);
const timestamp = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMdd_HHmm');
const backupFolderName = sourceFolder.getName() + '_backup_' + timestamp;
const newBackupFolder = backupParent.createFolder(backupFolderName);
copyFolderContents_(sourceFolder, newBackupFolder);
pruneOldBackups_(backupParent, sourceFolder.getName(), keepGenerations);
console.log('バックアップ完了: ' + backupFolderName);
}
/**
* フォルダ配下のファイル・サブフォルダを再帰的に複製
*/
function copyFolderContents_(source, destination) {
const files = source.getFiles();
while (files.hasNext()) {
const file = files.next();
file.makeCopy(file.getName(), destination);
}
const folders = source.getFolders();
while (folders.hasNext()) {
const folder = folders.next();
const newSubFolder = destination.createFolder(folder.getName());
copyFolderContents_(folder, newSubFolder);
}
}
/**
* 世代管理: 指定件数を超えた古いバックアップフォルダをゴミ箱へ移動
*/
function pruneOldBackups_(backupParent, sourceName, keepGenerations) {
const prefix = sourceName + '_backup_';
const backups = [];
const folders = backupParent.getFolders();
while (folders.hasNext()) {
const folder = folders.next();
if (folder.getName().indexOf(prefix) === 0) {
backups.push(folder);
}
}
backups.sort(function (a, b) {
return b.getDateCreated().getTime() - a.getDateCreated().getTime();
});
for (let i = keepGenerations; i < backups.length; i++) {
backups[i].setTrashed(true);
}
}
スクリプトプロパティの登録(コードに直書きしない)
STEP 1〜2 で控えた 2 つの ID は、コードに直接書かず「スクリプトプロパティ」に保存します。コードを他の担当者と共有する際にフォルダ ID が漏れるのを防ぐためです。
- Apps Script エディタ左の**歯車アイコン(プロジェクトの設定)**を開く
- 最下部の「スクリプト プロパティ」で「スクリプト プロパティを追加」をクリック
SOURCE_FOLDER_ID(複製元フォルダ ID)、BACKUP_PARENT_FOLDER_ID(複製先フォルダ ID)、KEEP_GENERATIONS(保持する世代数、未設定なら既定7)をそれぞれ登録して保存
💡 編集部メモ:KEEP_GENERATIONS を7に設定すると直近1週間分の世代が残ります。容量に余裕があれば14や30に増やせますが、その分ドライブ容量を消費する点は表で確認した通りです。まずは7から始め、実際の容量消費を見て調整するのが現実的です。
保存とトリガー設定が終わったら、必ず手動実行で複製先フォルダの中身を確認してください。次のセクションで、つまずきやすい点を整理します。
⚠️ 失敗パターンと運用上の注意
GAS は無料で強力ですが、初回だけ引っかかりやすい関門と、運用上見落としがちな注意点があります。編集部が特に注意すべきと考える2点を挙げます。
⚠️ 失敗パターン1:複製先を複製元フォルダの中に作ってしまう。STEP 2 で複製先フォルダを誤って複製元の内側に作ると、バックアップ処理のたびにバックアップ自身も複製対象に含まれ、フォルダが際限なく肥大化します。複製先は必ず複製元と別の階層(マイドライブ直下など)に作成してください。
⚠️ 失敗パターン2:大容量フォルダで実行時間の上限に達する。Apps Script には1回の実行につき数分〜数十分の上限があります(無料アカウントは1日あたりの合計実行時間にも上限があります)。ファイル数が非常に多いフォルダでは、複製処理の途中でタイムアウトする可能性があります。詳細はApps Script の割り当てと制限を確認し、対象フォルダを業務上重要なサブフォルダ単位に絞ることをおすすめします。
初回設定時には、Google から「このアプリは確認されていません」という趣旨の警告が出ます。これは自分で書いたスクリプトに、自分のデータへのアクセスを許可するための画面です。詳細を開いてプロジェクト名が自分のものであることを確認し、承認すれば先へ進めます。
| トラブル | 起こりやすい原因 | 編集部の対策 |
|---|---|---|
| バックアップフォルダができない | フォルダ ID の誤り・権限不足 | スクリプトプロパティの ID を再確認 |
| 実行がエラーで止まる | 実行時間の上限超過 | 対象フォルダを絞る、実行時間帯を分散 |
| ドライブ容量が急に減る | 世代数が多すぎる | KEEP_GENERATIONS を減らす |
| 古い世代が消えない | フォルダ名の命名規則が変わった | sourceFolder.getName() を変更していないか確認 |
なお、setTrashed(true) で削除した古い世代はゴミ箱に入るだけで、即座に完全削除されるわけではありません。ゴミ箱に入ったファイルも30日で自動的に完全削除される点は、冒頭で紹介したGoogle Developers 公式ドキュメントの通りです。次のセクションで、この30分の投資が経営上どう返ってくるかを整理します。
🚀 経営者はこの30分をどう回収するか
編集部の想定シナリオを1つ挙げます。従業員8名のデザイン制作会社が、案件フォルダを Google ドライブの共有フォルダで管理しているケースです(実在の企業の事例ではありません)。
- 導入前: 担当者が誤ってフォルダごとゴミ箱に移動、気づいたのは32日後。ゴミ箱の30日保持期限を過ぎており復元不能
- 導入後: 前日分の複製が別フォルダに残っているため、最悪でも1営業日分の作業をやり直すだけで済む
- 効果: 「復旧不能」から「1日分の手戻り」へ被害の上限が下がる
かかった費用は¥0、かかった時間は初回の30分だけです。基本形が動いたら、次の応用も同じコードの延長で組めます。
- 対象フォルダの複数化: フォルダ ID をスクリプトプロパティで配列管理し、複数の重要フォルダを1つのトリガーでまとめて処理
- 完了通知: バックアップ完了・失敗を Slack へ通知(GASでGoogleフォーム回答をSlack即時通知するレシピと同じ Webhook の仕組みが流用できます)
- 経理データの複製: 請求書や領収書の添付ファイルが集まるフォルダを対象にする(Zapierで Gmail 添付ファイル→Google Drive自動保存するレシピと組み合わせると、受信から保管・複製までを自動化できます)
当サイトでは、Google ドライブ関連の自動化を複数紹介しています。あわせて読むと設計の引き出しが増えます。
- GASでGoogleフォーム回答をSlack即時通知 無料で初動を10分に
- ZapierでGmail添付ファイル→Google Drive自動保存 経理の手作業をゼロにする
- ZapierでGoogleドライブ新ファイル→Slack自動共有 資料の見落としを防ぐレシピ
編集部のまとめ:このレシピの本質は「もしもの時の被害上限を、無限大から1日分に縮める」ことです。GAS を選べば、その仕組みを月¥0で、専用バックアップ製品を検討する前段階として持てます。まずは1つの重要フォルダで動かしてみて、安定を確認してから対象を広げるのが堅実な順序です。
出典・参考情報
- Google Apps Script 公式サイト
- Apps Script DriveApp リファレンス
- Apps Script インストール型トリガー(時間主導型を含む)
- Apps Script の割り当てと制限
- Google ドライブでのファイル削除・ゴミ箱の挙動(Google Developers)
- Google One(ドライブ容量の追加)
Mira / AI経営ラボ 編集長