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

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

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

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

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

zip

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

Q&A

解決済

1回答

2776閲覧

【GAS】zipファイル 解凍

anakama

総合スコア15

Google Apps Script

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

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

zip

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

0グッド

0クリップ

投稿2019/06/19 11:15

編集2019/06/19 16:09

Googleドライブ内のzipファイルを以下のコードで解凍しようとすると、
下記のようなエラーメッセージが表示され、zipを解凍することができません。

GASを使ったzipファイルの解凍方法について、
ネットを漁ったものの、解決できそうなものはなく、、
解決方法をご教示頂けますと幸いです。

【エラーメッセージ】
サーバーエラーが発生しました。しばらくしてからもう一度試してください。

function zip(){ var folder = DriveApp.getFolderById("***"); var zipFile = folder.getFilesByName("解凍したいzipファイル.zip"); var fileBlob = zipFile.next().getBlob().setContentType("application/zip"); var unZippedfile = Utilities.unzip(fileBlob); //ここでエラー表示される var saveFile = folder.createFile(unZippedfile[0]); }

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

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

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

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

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

macaron_xxx

2019/06/20 00:38

私も再現できませんでした。
anakama

2019/06/20 15:55

レスありがとうございます! アドブロッカーなどクロームの拡張で入れていると上手く挙動しない記事があったので、 それに近しい拡張機能を外したものの状況は変わらずでした。。 他のドライブ系のGASは通常に作動するので、こちらでも未だ原因追究中となります。
macaron_xxx

2019/06/21 05:32

GASはサーバー側で動くので、拡張機能とかクライアントに依存しません。
anakama

2019/06/22 04:48

大変失礼いたしました。。 zipファイルによって、成功するものと失敗するものがあるため、 zipファイル自体の問題だと認識しています。
guest

回答1

0

ベストアンサー

次のような修正は如何でしょうか。

From

javascript

1var fileBlob = zipFile.next().getBlob.setContentType("application/zip");

To

javascript

1var fileBlob = zipFile.next().getBlob().setContentType("application/zip");
  • 今の場合、getBlob()はClass Fileのメソッドですので、実行するために括弧を使ってください。
  • また、ファイル名に.zipの拡張子があるようですと、setContentType("application/zip")の代わりに、setContentTypeFromExtension()を使うことも可能です。

参考

追記1

誤記とのことで、気付かず申し訳ありませんでした。

次に問題になるのは、ファイルサイズです。Google Apps Scriptで扱うことのできるファイルサイズの最大サイズは50 MB(52,428,800 bytes)です。これについては如何でしょうか。

追記2

コメントありがとうございます。状況を理解することができました。こちらではLinuxとGoogle Apps Scriptで同様のテスト(圧縮元のファイル名に全角文字列を使用する)を行っていましたが、その際はエラーは発生しませんでしたので特に問題では無いのではと考えてしまいました。windowsでテストをすると、同様のエラー(サーバーエラーが発生しました。しばらくしてからもう一度試してください。)が発生することを確認できました。anakama様のテスト環境はwindowsでしたでしょうか。

おそらく問題の原因は、windowsではsjisが使われているのに対してLinuxやGoogle Apps Scriptではutf8が使われていることによると思われます。

結論といたしまして、Google Apps Scriptを使ってzip圧縮された元ファイル(CSVファイル)のファイル名を変更しようとすると、必ず一度解凍する必要がありますので、残念ながら、今の状況ではUtilities.unzip()でエラーが発生するため、解決できません。そこで、次のような回避策を提案させていただきます。ご質問の状況に合わせて説明させていただきます。

  1. zipで圧縮する際にCSVファイルのファイル名をutf8に変換する。

  2. CSVファイルのファイル名を一度、半角アルファベットや数字などに変換してzip圧縮し、Google Apps Script上でzipファイルから解答する際にCSVファイルのファイル名を元のファイル名に戻す。

投稿2019/06/19 11:50

編集2019/06/23 08:46
kisojin

総合スコア899

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

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

anakama

2019/06/19 11:56

ご回答ありがとうございます! >今の場合、getBlob()はClass Fileのメソッドですので、実行するために括弧を使ってください。 ⇒こちら失礼いたしました。。投稿してから、間違いに気づき訂正をさせていただいております。 setContentTypeFromExtension() で試したものの、同じところで同じエラーが表示されるようです。。
kisojin

2019/06/19 12:00

誤記に気付かず申し訳ありません。追記しましたのでご確認頂けますでしょうか。
anakama

2019/06/19 12:06

とんでもございません! 追加ありがとうございます。 ファイルサイズですが、zipファイルは228KBで、解凍したファイルに入っているcsvは1.5MB程となっております。
kisojin

2019/06/19 12:10

ご確認頂きまして有難うございます。すぐに解決できず申し訳ありません。今実際に問題が再現できるかどうかを確認してみましたが、同じ問題を再現することができませんでした。申し訳ありません。そこで、同じ問題が発生するサンプルのファイルをシェアしていただくことは可能でしょうか。これで実際に確認できればと思いました。ご無理であればまた別の方法を考えたいと思いますのでご安心ください。
anakama

2019/06/19 12:18

ご返信ありがとうございます! ファイルのシェアについてですが、アクセス解析ツールのローデータでして、、シェアは出来かねます。。大変申し訳ございません。 21:06投稿のzipファイルとは違うファイルで試したものの、同じエラーが表示される状態です。 (1KBのcsvをひとつ格納したzipファイルとなります。) kisojin様の環境では、zipファイルを解凍できたという認識でよろしいでしょうか、、?
kisojin

2019/06/19 12:23 編集

シェアできないとのことで了解しました。こちらで行ったテストでは、zipファイルは特にエラーは無く解凍でき、ファイルとして保存することができました。また、var unZippedfile = Utilities.unzip(fileBlob) でエラーが発生する場合のエラーメッセージは次の通りです。 1. パスワード付きzipファイルの場合: 解凍できませんでした。 2. zipファイルのサイズが50MB以上の場合: ファイル ### はファイル サイズの上限を超えています。 zipファイル自体は50MB以下で、回答後に50MBを超える場合は、folder.createFile()で上記のエラーが発生します。 また、zipFile.next().getBlob()がzipファイルでない場合は、Utilities.unzip(fileBlob)から返される結果は [] です。"サーバーエラーが発生しました"となるようなパターンは今のところ確認できませんでした。申し訳ありません。 同じ状況を再現することができ、解決策を見出すことができましたら、こちらへ投稿させていただきます。
anakama

2019/06/19 12:31 編集

ご丁寧にありがとうございます!! こちらこそお時間を取らせてしまい誠に申し訳ございません。。 kisojin様の環境では、問題なく処理できるようですね。。 エンタープライズのGsuite環境が問題(権限等の観点により)かなと思い、 野良Gmailアカウントで試したものの、エラー個所とエラー内容は同一でした。 コードの問題ではなく、Googleドライブの環境(共有フォルダかどうか等)の問題である可能性もあるものでしょうか、、? (追記となり申し訳ございませんが、zipファイルにはパスワードをかけておりません。)
kisojin

2019/06/19 12:34

ご質問やタグにはシェアドライブについては特に記載されておりませんでしたので、テストは自分のGoogle Drive上で行いました。もしもシェアドライブが気になるようですと、ご自身のGoogle Driveへ所有者を自分としたzipファイルを置いて動作テストをしてみてはいかがでしょうか。これとの比較で何か解決に繋がるような情報を得ることができればと思います。
anakama

2019/06/19 12:41

失礼いたしました。。 野良Gmailアカウントで試したものは、所有者の権限が自分のものとなり、 kisojin様のテスト環境と変わらないと認識しております。 私も他の方法があるか引き続き試すことにいたします、、!
anakama

2019/06/22 04:47

いろいろ試した結果、zipファイルによって成功するものと、「サーバーエラーが発生しました。しばらくしてからもう一度試してください。」とエラーが出るものがあります。 成功したものは、下記サイトで紹介されているzipファイルとなります。 https://qiita.com/ShishidoToru/items/b2c13b592a999a75d6e4 一方、依然エラーが出ているのは自分で作成したzipファイルです。 【右クリック→送る→圧縮(zip形式)フォルダー】という順で、普通のzipファイルの作り方だと思いますが、zipファイル自体のどこに問題があるか未だ解決できていない状態です。。。
anakama

2019/06/22 05:19

続けて失礼します! どうやら、zipファイルに格納しているcsvのファイル名が関係あるようです。 csvのファイル名に日本語が入っていると、「サーバーエラーが発生しました。しばらくしてからもう一度試してください。」のエラーが表示されるようです。
kisojin

2019/06/23 08:47

テストしていただきありがとうございます。回答を更新しましたのでご確認ください。回避策を提案させていただきましたが、もしもそれらが使えないようですとすみません。
anakama

2019/06/23 09:16

ご回答ありがとうございます! zipファイルに格納しているcsvは自動生成されるものなので、 ファイル名をあらかじめ半角英数字のみでセットするようにします。
kisojin

2019/06/24 00:35

ご返事ありがとうございます。文字コードの違いについてすぐに気付かず申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問