【GAS】ルートフォルダにバックアップフォルダを作り、バックアップを行う


今回は、Google Apps Scriptでバックアップを行うコードを作っていきたいと思います。
やりたいことは、次のとおり。
- Googleドライブのルートフォルダに「BUCKUP」フォルダがなければ作成する
- 「BUCKUP」フォルダの中にファイルを「ファイル名」+「現在時刻」で保存し、バックアップをとる

基本的には、実行=バックアップを想定して作っているんだにゃ。
実行するタイミングは、トリガーをうまく使って、例えば時間指定など、自分の好きなタイミングにするといいんだにゃ。
完成したコードの確認

まずは、完成したコードを確認してみましょう。
前半で、「BUCKUP」フォルダを作成し、後半でファイル名を指定して保存しています。
function myFunction() {
const folderName = "BUCKUP"; //「BUCKUP」フォルダの名前
const folder = DriveApp.getFoldersByName(folderName); //「BUCKUP」フォルダを取得
let buckupFolder;
//「BUCKUP」フォルダがあるか、なければ作成
if (folder.hasNext()) {
buckupFolder = folder.next();
} else {
buckupFolder = DriveApp.getRootFolder().createFolder(folderName);
}
//「BUCKUP」フォルダ内にファイルを保存
// ファイル名に時刻を入力
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ssId = ss.getId();
const ssFile = DriveApp.getFileById(ssId);
const date = new Date();
const date_format = Utilities.formatDate(date, "Asia/Tokyo", "yyyyMMddHHmmss");
const fileName = ssFile.getName() + "_" + date_format;
ssFile.makeCopy(fileName, buckupFolder);
}
コードの詳細
「BUCKUP」フォルダの確認&作成

「BUCKUP」フォルダを作成していきます。
GASだと同じ名前のフォルダがあっても、エラーにならず何回も作成されるので、あった場合は、作成せず、そのオブジェクトを取得します。
順番にみていきましょう。
const 変数 = DriveApp.getFoldersByName(取得したいフォルダ名);

まずは、DriveAppを使って、フォルダ名から取得したいフォルダを取得するんだにゃ。今回は「BUCKUP」という名前のフォルダを取得したいから、次のようになるんだにゃ。
const folderName = "BUCKUP";
const folder = DriveApp.getFoldersByName(folderName);

上のfolderには、フォルダを表すオブジェクトが入り、指定したフォルダがなくとも、無いというオブジェクトが入るイメージです。
次に、そのオブジェクトを使って、「BUCKUP」フォルダがあるかを判定して、ifで分岐させます。
フォルダを入れたオブジェクト.hasNext()
返値:True or False
フォルダを入れたオブジェクト.next()
イメージ:次にあるオブジェクトの実体を取得する。複数ある場合、順次ネクストをかけると順番で実体が出てくる。
DriveApp.getRootFolder().createFolder(フォルダの名前);

上の3つを使えば、フォルダの確認と作成ができるんだにゃ。
ちょっとわかりずらいから、実際のコードに落とし込むんだにゃ。
let buckupFolder;
if (folder.hasNext()) {
buckupFolder = folder.next();
} else {
buckupFolder = DriveApp.getRootFolder().createFolder(folderName);
}

説明すると、最初に「BUCKUP」フォルダを入れる変数buckupFolderを作っておきます。
次に、上で名前から取得したfolderのオブジェクトを使って、hasNext()で分岐します。

folder作成時に指定した名前のフォルダがあれば、hasNext()はTrueを返し、なければFalseを返すんだにゃ。

分岐した先で、folderからオブジェクトの実体を変数buckupFolderに入れるのか、新しくDriveappで作ったオブジェクトを入れるのか変わりますね。
GASのファイル操作はイメージが難しい感じがしますが、こんな感じだと思って使っちゃった方がいいかもしれないです。
現在時刻を入れてファイルをバックアップ保存

次に現在時刻を入れてファイルをバックアップ保存する方法を見ていきます。
まずは、保存するため、ファイルオブジェクトを取得しましょう。
const 変数 = SpreadsheetApp.getActiveSpreadsheet();
const id変数 = 変数.getId();
const ファイル変数 = DriveApp.getFileById(id変数);
ファイル操作には、DriveAppのファイルオブジェクトが必要です。
スプレッドシートで現在のシートIDを取ってから、そのIDでDriveAppからIDを取得しています。
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ssId = ss.getId();
const ssFile = DriveApp.getFileById(ssId);

このIDからファイルオブジェクトを取得する方法は色々あるけど、GASの場合、IDから取得するのが多いみたいだにゃ。

次に、現在時刻を取得します。
フォーマットも整えて、20230218とかにしておきます。
const 日時変数 = new Date();
const フォーマット変数 = Utilities.formatDate(日時変数, “Asia/Tokyo”, “yyyyMMddHHmmss”);
const date = new Date();
const date_format = Utilities.formatDate(date, "Asia/Tokyo", "yyyyMMddHHmmss");

上のようにすると、現在日時をフォーマットした文字列が取得できます。
あとは、日時を追加した名前で、ファイルオブジェクトを保存しましょう。
const 保存する名前変数 = ファイル変数.getName() + “_” + フォーマット変数;
ファイル変数.makeCopy(保存する名前変数 , 保存先パス);
const fileName = ssFile.getName() + "_" + date_format;
ssFile.makeCopy(fileName, buckupFolder);

以上でバックアップができるんだにゃ。イメージとしては、「バックアップフォルダにファイルをコピーする」って感じだにゃ。今なにをしているのかをイメージしながら頑張るといいと思うんだにゃ。
プログラミングを学ぶならTechAcademy(テックアカデミー)がおすすめ!

独学で苦戦している人は、一度しっかりと基礎を学ぶと次のステップへ進めますよ。今のおすすめは、TechAcademy(テックアカデミー)ですね。
- オンラインで選抜された現役エンジニアから学ぶことができる
- 自宅からWeb制作・プログラミング・アプリ開発など幅広い分野を学べる
- 学ぶだけではなく、転職の支援、副業に活かせるスキルの習得、副業の仕事紹介まで行っている

無料体験や相談もあるから、一度試してみてもいいんだにゃ!
\無料体験、無料相談はこちらから/