GASでZIPファイルを
作成・解凍する方法

複数のファイルを1つにまとめて配布・バックアップしたいときは、Utilities.zipUtilities.unzipが便利です。外部ライブラリなしで、ZIPの作成も解凍もGAS標準機能だけで完結します。

|対象: GAS / Utilities / Drive / ファイル操作

Table of Contents

GASでZIPを扱う場面とBlobの基本

GASでZIPを使うと、次のような処理を外部ライブラリなしで実現できます。

複数ファイルの一括配布

帳票やCSVを1つのZIPにまとめてメールで送る

フォルダのバックアップ

Driveの特定フォルダの中身を毎晩ZIPで保存する

配布物の受け取り

届いたZIPを解凍し、中身をシートやフォルダに展開する

容量の圧縮

テキストやCSVなど圧縮が効くファイルをまとめて軽くする

ZIP操作の主役はBlob(バイナリデータの入れ物)です。Driveのファイルはfile.getBlob()で、文字列やCSVはUtilities.newBlob()でBlobにできます。このBlobの配列をUtilities.zip()に渡すのが基本の流れです。

複数ファイルを1つのZIPにまとめる

まずは文字列とCSVをファイルに見立てて、ZIPにまとめる最小の例です。Utilities.newBlob(内容, MIMEタイプ, 名前)でBlobを作り、その配列をUtilities.zip()に渡すだけです。第2引数でZIP自体のファイル名を指定できます。

// 文字列やCSVをファイルとしてZIPにまとめる基本
function createBasicZip() {
  // Utilities.newBlob(内容, MIMEタイプ, ファイル名) でBlob(ファイルの入れ物)を作る
  const file1 = Utilities.newBlob("これは1つ目のメモです。", "text/plain", "memo1.txt");
  const file2 = Utilities.newBlob("name,age\nSato,30\nSuzuki,25", "text/csv", "list.csv");

  // Utilities.zip(Blobの配列, ZIPファイル名) で1つのZIP Blobにまとめる
  const zipBlob = Utilities.zip([file1, file2], "sample.zip");

  // Driveに保存する(マイドライブ直下)
  const saved = DriveApp.createFile(zipBlob);
  Logger.log("保存しました: " + saved.getUrl());
}

ZIP内に入る各ファイルの名前は、newBlobの第3引数(またはBlobのsetName())で決まります。名前を付け忘れると解凍時に扱いづらくなるため、必ず設定しておきましょう。

Driveフォルダ内のファイルを一括ZIP化する

実務でよくあるのが「あるフォルダの中身をまるごとZIPにまとめる」処理です。 フォルダ内のファイルをイテレータ(hasNext/next)で回し、各ファイルのgetBlob()を集めてZIP化します。

// Driveフォルダ内のファイルをまとめてZIP化し、別フォルダに保存
function zipFolderFiles(sourceFolderId, destFolderId) {
  const source = DriveApp.getFolderById(sourceFolderId);
  const dest = DriveApp.getFolderById(destFolderId);

  const blobs = [];
  const files = source.getFiles();
  while (files.hasNext()) {
    const file = files.next();
    // getBlob() でファイルの中身をBlobとして取り出す
    const blob = file.getBlob().setName(file.getName());
    blobs.push(blob);
  }

  if (blobs.length === 0) {
    Logger.log("対象ファイルがありません");
    return;
  }

  // 日付入りのZIPファイル名にしておくと世代管理しやすい
  const today = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyyMMdd");
  const zipBlob = Utilities.zip(blobs, "backup_" + today + ".zip");

  dest.createFile(zipBlob);
  Logger.log(blobs.length + "件をZIP化しました");
}

フォルダIDはURLの/folders/の後ろの文字列です。GoogleドキュメントやスプレッドシートなどのGoogle形式ファイルは、そのままのgetBlob()ではPDF化されて入る点に注意してください(画像やCSV、PDFなどの通常ファイルはそのまま入ります)。

ZIPファイルを解凍して中身を取り出す

受け取ったZIPを開くにはUtilities.unzip()を使います。ZIPのBlobを渡すと、中に入っていた各ファイルのBlobの配列が返ります。 このとき、渡すBlobのMIMEタイプがapplication/zipになっている必要があるため、setContentType()で明示しておくと確実です。

// ZIPファイルを解凍し、中身をDriveの指定フォルダに書き出す
function unzipToFolder(zipFileId, destFolderId) {
  const zipFile = DriveApp.getFileById(zipFileId);
  const dest = DriveApp.getFolderById(destFolderId);

  // MIMEタイプをapplication/zipにしてから渡すのが確実
  const zipBlob = zipFile.getBlob().setContentType("application/zip");

  // Utilities.unzip(Blob) で中の各ファイルのBlob配列が返る
  const files = Utilities.unzip(zipBlob);

  files.forEach((blob) => {
    dest.createFile(blob);
    Logger.log("展開: " + blob.getName());
  });

  Logger.log(files.length + "件を解凍しました");
}

返ってきたBlobは、Driveに保存するだけでなく、getDataAsString()でテキストとして読み取ったり、Utilities.parseCsv()でCSVとして解析してシートに取り込んだりできます。

シートをCSV化してZIPでメール添付する

月次レポートなどで「複数シートをそれぞれCSVにして、1通のメールでまとめて送りたい」ケースは多いです。 各シートをCSV文字列に変換してBlob化し、ZIPにまとめてMailApp.sendEmail()の添付として送ります。

// 複数シートをCSV化してZIPにまとめ、メールに添付して送る
function mailSheetsAsZip(recipient) {
  const ss = SpreadsheetApp.getActive();
  const blobs = [];

  ss.getSheets().forEach((sheet) => {
    const values = sheet.getDataRange().getValues();
    const csv = values.map((row) => row.map(escapeCsv).join(",")).join("\r\n");
    // BOM付きUTF-8にするとExcelで開いても文字化けしにくい
    const blob = Utilities.newBlob("\uFEFF" + csv, "text/csv", sheet.getName() + ".csv");
    blobs.push(blob);
  });

  const today = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyyMMdd");
  const zipBlob = Utilities.zip(blobs, "report_" + today + ".zip");

  MailApp.sendEmail({
    to: recipient,
    subject: "本日のレポート(" + today + ")",
    body: "各シートのCSVをZIPで添付します。",
    attachments: [zipBlob],
  });
}

// カンマ・改行・引用符を含むセルを安全にエスケープ
function escapeCsv(value) {
  const s = String(value);
  if (/[",\r\n]/.test(s)) {
    return '"' + s.replace(/"/g, '""') + '"';
  }
  return s;
}

先頭に(BOM)を付けると、ExcelでCSVを開いたときの日本語の文字化けを防げます。カンマや改行を含むセルは引用符で囲むエスケープ処理も忘れずに行いましょう。

トリガーで定期バックアップを自動化する

フォルダの中身を毎晩ZIP化して保存する、といった定期処理は時間主導トリガーで自動化できます。 先ほどのzipFolderFilesを呼ぶジョブを1日1回動かす例です。

// 毎晩フォルダ内のファイルをZIPバックアップするトリガーを登録
function createNightlyZipTrigger() {
  ScriptApp.newTrigger("nightlyZipJob")
    .timeBased()
    .everyDays(1)
    .atHour(2)
    .create();
}

function nightlyZipJob() {
  const SOURCE_FOLDER_ID = "ここに元フォルダのID";
  const DEST_FOLDER_ID = "ここに保存先フォルダのID";
  zipFolderFiles(SOURCE_FOLDER_ID, DEST_FOLDER_ID);
}

ファイル名に日付を入れておけば、backup_20260724.zipのように日ごとの世代が残ります。古いZIPを一定期間で自動削除する処理を足すと、容量の増えすぎも防げます。

実務での注意点(文字化け・サイズ・実行時間)

1. 日本語ファイル名は文字化けする場合がある

ZIP内のファイル名はUTF-8で格納されます。解凍側のソフトによっては日本語名が化けることがあるため、 中のファイル名は英数字にして、日本語はファイルの中身側に持たせると安全です。

2. サイズとメモリに気をつける

GASはBlobをメモリ上で扱うため、数十MB級の大きなファイルや大量のファイルを一度にZIP化すると失敗しやすくなります。 対象を絞る、分割してZIP化するなどの工夫が必要です。

3. 実行時間制限(6分)を意識する

ファイル数が多いとZIP化だけで時間がかかり、6分の実行時間制限に達することがあります。 処理件数が多い場合は、分割実行の仕組みと組み合わせると安定します。

まとめ

GASのUtilities.zipUtilities.unzipを使えば、外部ライブラリなしでZIPの作成も解凍もできます。ポイントはBlobを起点に考えることです。 DriveファイルはgetBlob()、文字列はnewBlob()でBlobにし、配列にまとめてZIP化します。CSVのメール添付や定期バックアップと組み合わせれば、 ファイル配布と保管の手間を大きく減らせます。

よくある質問

Utilities.zip(blobs, name)を使います。まとめたいファイルをBlob(バイナリの入れ物)の配列にして渡すと、1つのZIPファイルのBlobが返ります。DriveのファイルはgetBlob()で、文字列やCSVはUtilities.newBlob()でBlob化できます。返ったBlobはDriveApp.createFile()で保存したり、メールに添付したりできます。

Utilities.unzip(blob)を使います。ZIPファイルのBlobを渡すと、中に入っていた各ファイルのBlobの配列が返ります。渡すBlobのMIMEタイプはapplication/zipである必要があるため、必要に応じてsetContentType('application/zip')で指定してから渡します。

Utilities.zipはファイル名をUTF-8で格納しますが、解凍する側のソフト(古いWindows標準機能など)がShift_JIS前提だと文字化けすることがあります。確実に避けたい場合は、ZIP内のファイル名を英数字にし、日本語は本文やファイル内容側に持たせる運用が安全です。

GASはBlobを一度メモリ上で扱うため、数十MBを超える大きなファイルや大量のファイルを一度にZIP化すると、メモリ不足や6分の実行時間制限に達することがあります。大きなデータは分割してZIP化するか、ファイル数を絞って処理するのが安全です。

できます。時間主導トリガー(ScriptApp.newTrigger)を使えば、毎晩フォルダ内のファイルをZIPにまとめてバックアップフォルダへ保存する、といった定期処理を組めます。日付入りのファイル名にしておくと世代管理がしやすくなります。

GAS開発・業務Webシステムを
相談する。

ZIPでのバックアップやファイル配布のほか、帳票出力・Gmail自動化・Drive連携など、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る