GASでHTML⇒PDFへの変換が失敗する
Google Apps Scriptでは様々なデータソースからPDFを生成する手段がいくつもありますが、現在、HTMLからPDFに変換するメソッドでトラブルが起きているようです。この手のエラーは、Googleが修正をするまで基本治る事がないので、代替策を講じて回避するのがこれまでの定番パターンです。
エラーとコード
エラーの内容
Issue Trackerによりますと、問題が起きているのは、getAsメソッドが原因で、シートからPDFをgetAsで生成する分には問題が無いのですが、Blobで取得したHTMLをPDFに変換時に「Exception: Conversion from text/html to application/pdf failed.」というエラーが発生しストップします。
getAsのメソッド全般が問題というわけではなさそうです。
図:HTMLからの変換でだけエラーが出てる
エラーが起きるコード
1 2 3 4 5 6 7 8 |
function html2pdf() { var html = "<h1>testだよ</h1>" + "<p>ここに本文</p>"; var blob = Utilities.newBlob(html, "text/html", "text.html"); var pdf = blob.getAs("application/pdf"); DriveApp.createFile(pdf).setName("test.pdf"); } |
上記のコードで、DriveApp.createFileでエラーが出てるので、一見するとgetAsではなさそうなのですが、そもそも、getAsで変換出来ていないような印象です。(Sheetからの変換だとDriveApp.createFileではきちんとPDFは生成できてる)
代替策
getAsを使った変換がNGであるので、この部分を他の方法に置き換えて実装をすれば変換することが可能です。もともとgetAs自体は簡易的なPDF生成メソッドであるので、ここを以下のように一旦、Googleドキュメント形式でファイル生成した後に、対象のファイルをExportでPDFに変換を掛けるという2段階で行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
function html2pdf() { //生成する元になるHTML var html = "<h1>PDFタイトル</h1>" + "<p>ここに本文を記述</p>"; //Blobで取得 const tempblob = Utilities.newBlob(html, MimeType.HTML, "text.html"); //Googleドキュメント形式の指定 const resource = { title: "テストPDF", convert: true, mimeType: 'application/vnd.google-apps.document' }; //一旦ドキュメント形式でドライブにファイルを生成 const fileId = Drive.Files.insert(resource, tempblob).getId(); //ドキュメントをPDF形式でエクスポートするURL const url = "https://docs.google.com/document/d/" + fileId + "/export?format=pdf"; //生成先フォルダの指定 const folder = DriveApp.getRootFolder(); //Access Tokenを取得 const token = ScriptApp.getOAuthToken(); //PDF形式でエクスポート const res = UrlFetchApp.fetch(url, {headers: {'Authorization': 'Bearer ' + token}}).getBlob().setName("test.pdf") //フォルダにPDFファイルを生成 folder.createFile(res); //Googleドキュメントのファイルを削除 Drive.Files.remove(fileId); } |
- 本コードの場合、サービスにDrive APIを追加する必要があります。
- 一旦HTMLデータをGoogleドキュメント形式で出力させておく(ファイルからでないと、Blobから直接URLで組み立ててPDFに変換が出来ない)
- getAsではなく、URL組み立てでのPDFエクスポートのURLをUrlfetchAppで叩いてBlobで取得します。
- ファイル生成はコレまで通り、DriveAppのcreateFileで生成する
- 出力したGoogleドキュメント形式のファイルを最後に削除する