Google Apps Scriptそのものには、印刷に関するメソッドがありません。しかし、ファイルのエクスポートではPDF形式がサポートされています。これは、URLを組み立てて投げることで、プログラム側からも利用出来るようになっています。但し、Google Appsか?それとも通常のフリーのGoogle Documentかによって、ちょっとコードが変わってきてしまいます。

PDF化は何かと利用価値はありますが、これが実装できると、自動的にPDF化してメールに添付して送る、ドライブの所定の場所に自動的に格納するなどが可能になります。また、スプレッドシート固有の機能ではないので、他のドキュメントも利用することが出来ますよ。

※暗号化PDFを作ることは出来ません。外部APIを利用すれば可能ですが、結構お高い・・・

使用するメソッド・クラス、準備するもの

  1. 今回使用するスプレッドシート
  2. UrlfetchAppクラスの各種メソッド
  3. DriveAppクラスのgetAsメソッド

ソースコード

メソッドを使って簡単にPDF化して取得

この方法は最も手っ取り早いPDF化の方法です。しかし、制御が出来ません。よって、細かいPDF化の為のオプションが存在しないので、そのドキュメントおよびスプレッドシートがまるごとPDFになるだけです。今回はスプレッドシートをPDF化して、ファイルを生成し、そのままログインユーザ名を取得して、操作者にそのままPDFをメールに添付して送り付けます。

  • 今回はフォルダの指定はしていないので、ルートディレクトリにPDFが生成されます。
  • 生成しなくてもメールに添付してそのまま送りつけてしまってもOKです。
  • getAsメソッドの引数にPDFのMIMETYPEを渡しています。これが最も重要です。
  • 特定のシートのみPDF化が出来ません。
  • 何も他にオプションが無いので、スプレッドシートではセルの枠線などもバッチリ映り込んでしまいますので、ドキュメント向けです。

URLを組み立ててPDFをエクスポートして取得

getAsメソッドだと自由が効かないので、使い勝手が悪いです。そこで、URLを組み立ててPDF化する方法があります。特定の1シートのみをPDF化することが可能です申請書類などをスプレッドシートで生成し、PDF化してメールで送る場合にはこの手法が最も良い方法でしょう。

ソースコード

  • 今回は、アクティブシートをA4用紙横印刷でグリッドライン無しのフィットページにてPDFを作成しています。
  • スクリプトトリガーなどで実行する場合は、実行者の権限で動かせます。また、ウェブアプリケーション上でもこのコードは実行者の権限設定ができますので、匿名の者であっても、ウェブアプリケーション化してしまえば、コードを実行することが可能です。

書き込みが間に合わない時の処置

データの書き込みを行い、其の流れでPDFを生成する場合には、データの書き込みが間に合わずPDFが生成されてしまうケースが、しばしばあります。このままでは、折角のPDFもデータが欠けた状態で作成されてしまうので、以下のような無限ループを利用して、「最終書き込みセル」を確認しながら、スクリプトをウェイトさせます。

最終書き込みをするであろう場所を今回は、名前付き範囲で指定しています。
その中身が空の状態の時は無限ループします。値が確認できたら、PDF生成ルーチンへ進むといった感じです。

URLオプション

URLに続けてオプションを付加すると、Chromeでの印刷時と同じオプションを付け加えることが出来る。重要度の高い物を赤字、次に必要な物を青字で説明してみた。

  • key : スプレッドシートのIDを指定する
  • gid : シートIDを指定する。シート毎に付いているもので、URLに入ってる。このオプション指定をしないと、全ページ印刷の対象となる。省略可。
  • format : 出力フォーマットを指定。PDFなので、format=pdfとして引数を取る。以前は、fmcmdで引数に数字を取っていた。

formatの引数に指定できるものは以下の数種類。要するに標準で装備してる「形式を指定してダウンロード」の対象物が取れるようになっているわけです。今回はスプレッドシートのみ紹介しますが、ドキュメントやスライドなどでは若干使えるもの使えないもの、違うものがあります(例えば、ドキュメントの場合、4.はodsではなくodtとなる)。

  1. pdf : 今回のテーマ。PDF形式で出力します。
  2. xlsx : Microsoft Excel形式で出力します。出力は、xlsx形式なので注意
  3. csv : UTF-8でエンコードされたCSVファイル。正直あまり使わない。Excelにインポートする時は、拡張子をtxtに変更してから取り込みましょう。
  4. ods : OpenDocument形式。但しこれは、スプレッドシートの場合の形式です。OpenOffice.orgのcalcの拡張子を指定すると覚えておけばOK。使わないと思うけれど。
  5. tsv : タブ区切りのテキストファイル形式です。
  6. zip : シートをHTML形式で出力しZIPで固めてエクスポート。その為、このオプションだけは、gid=の指定を入れてしまうとエラーになります。単純にexport?format=zipだけしか指定してはいけません。

その他のオプション指定項目は以下の通り。よく使うものだけ青色で表示。

  1. size : 出力するサイズ。A4と入れるとA4形式となる。番号での指定もできるようだ。
  2. fzr : 各ページに行見出しを含めるかどうか。trueで含める、falseで含めない。
  3. portrait : trueで縦出力、falseで横出力
  4. fitw : ページをフィットさせるかどうか。trueでフィット、falseで原寸大。
  5. gridlines : グリッドラインの有無。trueで有り、falseで無し。
  6. printtitle : ドキュメントのタイトルの有無。trueで有り、falseで無し。
  7. sheetnames : シート名の有無。trueで有り、falseで無し。
  8. pagenum : ページ番号の指定。CENTERと入れると真ん中に表示される。
  9. attachment : 不明。getFileというコマンドと連携してるとかしてないとか。
  10. locale : 言語の指定。必要ないと思う。
  11. range : シート単位ではなく、指定範囲内を印刷。名前付き範囲を指定したり、A1:D5の範囲指定ならば、A1%3AD5(%3Aでコロン)といったURLエンコードした範囲を与える
  12. widget : rangeの指定時のみ使用可能。今見ている範囲内をtrueとすると印刷範囲とする変なオプション。使いドコロ不明。

ボタンをクリックでダウンロード

これまでの説明は、スプレッドシートをPDFへ変換してUrlfetchAppで取得後にメールに添付して送るというものでした。しかし、メールではなくボタンを押したら直接ダウンロードしたいという要望があると思います。その場合、直接GASのコマンドを叩いてダウンロードは出来ませんが、例えばSidebarやダイアログにボタンを表示して、クリックするとPDFでダウンロードされるみたいな事は可能です。

GAS側コード

※現在見てるスプレッドシートをPDF化するリンクとファイル名を取得して、HTML側へ返しています。

HTML側コード(サイドバー)

※google.script.run.withSuccessHandlerにてGAS側へリンクとファイル名を要求。返って来た値を元にjQueryでボタンにそのリンクとファイル名を設定するというものです。ボタンをクリックするとリンクが叩かれてファイルがダウンロードされます。

関連リンク

共有してみる: