質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

2回答

4689閲覧

Google Apps Scriptでフォルダ名ごとZIP圧縮したい

barobaro

総合スコア1286

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2021/08/07 23:24

編集2021/08/08 09:20

前提・実現したいこと

Google Apps ScriptでフォルダごとZIP圧縮したいのですが、
フォルダ名そのままで作成するにはどうすればいいか教えてください

images内のファイルを圧縮、ZIP解凍後も同じ構造でimagesのフォルダ内にファイルがあるZIPを作成したい

DRIVE:\ └─images ├─aaa.png └─bbb.png

該当のソースコード

javascript

1const id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 2const folder = DriveApp.getFolderById(id); 3const files = folder.getFiles(); 4 5const blobs = []; 6 7while (files.hasNext()) blobs.push(files.next().getBlob()); 8 9const zipBlob = Utilities.zip(blobs, "folder.zip"); 10DriveApp.createFile(zipBlob);

試したこと

フォルダ内のファイルは圧縮できたのですが
同じ構造のフォルダのままのZIPを作成できない

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

参考 Creating a zip file inside Google Drive with Apps Script (stackoverflow)

下記comperss()関数を実行のこと。

js

1function compress(){ 2 const folder = DriveApp.getFolderById("圧縮対象フォルダの親フォルダのフォルダID") 3 const zipped = Utilities.zip(getBlobs(folder, ''), folder.getName()+'.zip'); 4 folder.getParents().next().createFile(zipped); 5 Logger.log("完了") 6} 7 8function getBlobs(rootFolder, path) { 9 let blobs = []; 10 let names = {}; // ドライブのフォルダ内に同名ファイルが存在する場合先頭に「_」を付けて別ファイル名にする 11 const files = rootFolder.getFiles(); 12 while (files.hasNext()) { 13 let file = files.next().getBlob(); 14 let n = file.getName(); 15 while(names[n]) { n = '_' + n } 16 names[n] = true; 17 blobs.push(file.setName(path+n)); 18 } 19 names = {}; 20 const folders = rootFolder.getFolders(); 21 while (folders.hasNext()) { 22 let folder = folders.next(); 23 let n = folder.getName(); 24 while(names[n]) { n = '_' + n } 25 names[n] = true; 26 let fPath = path+n+'/'; 27 blobs.push(Utilities.newBlob([]).setName(fPath)); // 空フォルダ対応 28 blobs = blobs.concat(getBlobs(folder, fPath)); 29 } 30 return blobs; 31}

なお、GOOGLE DOCUMENT, GOOGLE SPREADSHEET などの Google Workspace専用形式のファイルは
基本的にその形式のままzip圧縮することはできません。
これらのファイルはPDFに変換されます。(仕様)

投稿2021/08/08 03:52

編集2021/08/08 09:54
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barobaro

2021/08/08 09:32 編集

ありがとうございます フォルダ構成の部分がわかりにくかったので修正しました imagesの中にaaa.pngとbbb.pngがあり zip内にもimagesというフォルダの中にaaa.pngとbbb.pngという 構成にしたいのですがうまくできないようです 同名ファイルの名前変更は勉強になりました ありがとうございます フォルダ内にフォルダを作成するとできましたら 確認不足で申し訳ありません ありがとうございました
退会済みユーザー

退会済みユーザー

2021/08/08 09:53 編集

ダウンロードし、ダブルクリックすると、「aaa.pngとbbb.pngというファイルが入っているimagesというフォルダ1つ」が表示されるようなzipファイルを作りたいということでしょうか? その場合は、Googleドライブ上で、(たとえば)rootという名前のフォルダを作成し、このrootフォルダの中にimagesというフォルダを作成し、imagesの中にaaa.pngとbbb.pngを入れてください。 (このrootというフォルダ名はあくまで例です。実際には何でも構いません) そして、上記のプログラム中の「圧縮対象のフォルダID」の部分に、今作ったrootフォルダのフォルダIDを入力して、compress()関数を実行してください。(imagesフォルダのフォルダIDではなく、その親フォルダのIDを記入する、ということです) すると、Googleドライブのルートに、root.zipというファイルが作成されると思います。 このroot.zipというファイルが、御所望の「aaa.pngとbbb.pmgを含むimagesフォルダ」が圧縮されたzipファイルになります。
barobaro

2021/08/08 09:58

ありがとうございます プログラムを参考にファイル名にpathをつける形で対応できました
guest

0

ベストアンサーを参考にファイル名にフォルダ名付のファイル名に変更してZIP圧縮で作成できました

javascript

1 2function compress(){ 3 4 const folder = DriveApp.getFolderById("xxxxxxxxxxxxxxxxxxxxxxxxxxx"); 5 const fpath = folder.getName(); 6 7 const files = folder.getFiles(); 8 9 const blobs = []; 10 11 while (files.hasNext()) { 12 13 let file = files.next().getBlob(); 14 let fname = file.getName(); 15 16 blobs.push(file.setName(fpath + "/" + fname)); 17 } 18 const zip = Utilities.zip(blobs); 19 folder.createFile(zip).setName("images.zip"); 20}

投稿2021/08/08 10:00

barobaro

総合スコア1286

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問