GAS 対象のフォルダにあるファイルとフォルダを全てzip化する
- 作成日 2023.11.07
- Google Apps Script

GAS(Google Apps Script)で、対象のフォルダにあるファイルを全てzip化するコードを記述してます。zip化は指定したフォルダに生成して、削除してます。
環境
- OS windows11 home
- ブラウザ chrome 119.0.6045.106
全てzip化
ここでは、全てzip化させるためファイルとフォルダにより処理を分けています。
// 圧縮したいフォルダのIDを指定
const folderId = "xxxxxxxxxx";
// 圧縮ファイルを保存するフォルダのIDを指定
const destinationFolderId = "xxxxxxxxxx";
const main = () => {
zipDriveFiles();
zipFirstLevelFolders();
}
// ファイルをzip化
const zipDriveFiles = () => {
// 圧縮対象のフォルダを取得
let folder = DriveApp.getFolderById(folderId);
// ファイルを全て取得
let files = folder.getFiles();
let destinationFolder = DriveApp.getFolderById(destinationFolderId);
while (files.hasNext()) {
let file = files.next();
let fileName = file.getName(); // 元のファイル名を取得
// 拡張子を取り除いたファイル名を生成
let nameWithoutExtension = fileName.split('.').slice(0, -1).join('.');
// ZIPファイルを作成
let zipBlob = Utilities.zip([file]);
// ZIPファイルを保存
let zipFileName = nameWithoutExtension + ".zip"; // 拡張子を削除したファイル名でZIPファイルを生成
let zipFile = destinationFolder.createFile(zipBlob);
zipFile.setName(zipFileName); // 拡張子を削除したファイル名でZIPファイルを保存
// 元のファイルを削除
file.setTrashed(true);
}
}
const zipFirstLevelFolders = () => {
// 親フォルダを取得
let parentFolder = DriveApp.getFolderById(folderId);
// 親フォルダ内のフォルダ一覧を取得
let subfolders = parentFolder.getFolders();
while (subfolders.hasNext()) {
let subfolder = subfolders.next();
// フォルダをZIPファイルに圧縮
compress(subfolder.getId());
subfolder.setTrashed(true);
}
}
// 圧縮
const compress = (zipFolderId) => {
const folder = DriveApp.getFolderById(zipFolderId)
let destinationFolder = DriveApp.getFolderById(destinationFolderId);
const zipped = Utilities.zip(getBlobs(folder, ''), folder.getName() + '.zip');
destinationFolder.createFile(zipped);
}
const getBlobs = (rootFolder, path) => {
let blobs = [];
let names = {}; // 同名ファイル時に別名にする
const files = rootFolder.getFiles();
while (files.hasNext()) {
let file = files.next().getBlob();
let n = file.getName();
while (names[n]) { n = '_' + n }
names[n] = true;
blobs.push(file.setName(path + n));
}
names = {};
const folders = rootFolder.getFolders();
while (folders.hasNext()) {
let folder = folders.next();
let n = folder.getName();
while (names[n]) { n = '_' + n }
names[n] = true;
let fPath = path + n + '/';
blobs.push(Utilities.newBlob([]).setName(fPath)); // 空フォルダ対応
blobs = blobs.concat(getBlobs(folder, fPath));
}
return blobs;
}
これでmain関数を実行すれば、全てzip化されます。
自動でzip化
指定したフォルダにファイルかフォルダがあれば、自動的にzip化する場合は、トリガーを1分などに設定しておけば、自動的にzip化されます。

-
前の記事
Redis set型のデータを取得する 2023.11.07
-
次の記事
Google スライド コピーを作成して移動させるショートカットキー 2023.11.07
コメントを書く