Google Apps Scriptでドキュメントを一括でPDFにする

現在受託したアプリの作成の過程で、Documentファイルを一括でPDFに変換し、結合し1枚にするものを作成中です。その過程で作成したスクリプトを公開します。以前まとめた、PDFの作成のエントリーの結合スクリプトも利用しています。また、実験としてgetAsで生成するのとUrlfetchApp.fetchAllでリクエストを投げて生成するのとではどちらが早いのか?の実験もしています。

Google Apps ScriptでPDFを作成する【GAS】

今回利用するスプレッドシート等

スクリプトの中のfolderidという変数に、ドキュメントが入ってるフォルダのIDを指定する必要があります。量が多い場合、かなりの時間が掛かるので、6分のタイムアウトを突破するテクニックの併用も必要です。

Google Apps Scriptで6分の壁(タイムアウト)を突破する - 番外編【GAS】

検証結果

7個のドキュメントでPDFへの変換をする形で計測。結果的には

  • getAs :  8.5秒
  • UrlfetchApp.fetchAll : 16.5秒

やはりHTTPリクエストはオーバーヘッドが掛かるのか、倍の差でgetAsで変換するほうが全然早かったです。

ソースコード

引数のarrayはファイル名、ファイルIDの2つが入ってる二次元配列となっています。[["filename","fileid"],["filename","fileid"],["filename","fileid"]]といった形になっています。

Drive API v2等でバッチ処理を使ったらもっと早く生成できるのかもしれませんが、今回は利用していません。

getAsを利用する場合

  • 単純にarrayの中のfileidを元にgetAsにてPDFに変換してるだけのスクリプトです。
  • 変換後のファイルをDriveに生成し、ファイルのIDを取得しています。

UrlfetchApp.fetchAllを利用する場合

  • GETによるPDF作成のURLを生成して、まとめてUrlfetchApp.fetchAllに投げています。
  • その後、レスポンスデータからDriveに対してファイル名を付けて生成する仕組みです。

結合するスクリプト

変換した結果を配列にファイルのIDとして格納し、これを元にPDF結合メソッドにて1枚のファイルにします。およそ1ページ7個で152kbのファイルサイズなので、100枚でも2.1MB程度のファイルサイズになります。気をつけなければならないのは、6分の壁があるので、この生成に於いての上限は6分で生成できるサイズとなるので注意が必要です(途中で辞める事ができないので、分割して6分の壁を超えるといったことができません)

  • 指定フォルダ内のファイルを探索し一覧にし、その中で拡張子がPDFのものだけをピックアップしています。
  • 配列にblobとして各PDFファイルを格納します。
  • 格納したものを、meregePdfsメソッドを利用して1枚に結合。mergedFileにはそのファイルのID等が返ってくる。
  • 結合に掛かった時間ですが、1ファイル1ページもので33kbで1秒あたり1.07秒。10枚で330kbとし生成時間は11秒の計測時間が出ました。100枚ならば3.3MB、時間にして110秒(1分50秒)程度なので、6分の限界を考えると結合で利用できる枚数は、最大でも500枚程度までということになるかと思います(ページ数が増えたり画像の有無でその上限はずっと小さくなると思います)。
  • PDFを生成⇒ダウンロード、ローカル環境でpdfasなどを利用して結合のほうが現実的かなぁと思います。

関連リンク

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。