GAS 対象のフォルダにあるファイルとフォルダを全てzip化する

GAS 対象のフォルダにあるファイルとフォルダを全てzip化する

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化されます。