Google ドキュメントは、正直な所、他のワープロソフトに比較すると、かなり機能的には貧弱です。また、スプレッドシートと比較すると、スクリプトも難解な構造になっており、サンプルも少ないです。そんなGoogleドキュメントですが、標準搭載されていない機能で要望が高いのが、差し込み印刷です。標準で搭載されていても良いのにと思うのですが。

しかし、Googleドキュメント類は印刷に関するメソッドがないので、スクリプトから印刷はできません。よって、印刷の一歩手前までをなんとか出来ないだろうか?また、同様のテクニックを使って、これまでスプレッドシートでテンプレートを作り、書類を作ってたものを、Googleドキュメントで出来ないだろうか?と考えた結果、ようやく形になりました。今回はダイアログではなく、サイドバーで実装しています。

ちなみに既にアドオン形式では、DocumentMerge by PandaDocというものがありましたが、英語UIな上に画像類などはどうもテンプレートからコピーしてくれないみたいなので、若干不便です。但し、データ元であるスプレッドシートのシートの指定とカラムの指定が柔軟でとても良く出来ているアドオンです。

今回しようするファイル等

ソースコード

正直言って、結構な量のコードになっているので、いずれ最適化しないといけないなと思いつつ、手が付けられずにいたので、主要な部分のコードだけ。残りは上記のファイルからコピーして除いてみて下さい。リッチなデザインとユーザビリティもちょこっと考慮してるので、実際にはもっと少ないコードで書けると思います。大分無駄にメソッド呼び出してる面もありますし。

GAS側コード

HTML側コード

実行と結果

使い方

このスクリプトは印刷はできませんが、印刷一歩手前の書類を作る為のものです(Cloud Printがあれば、印刷まで実行できます)。よって、ユーザがスクリプトで書類を生成したら、やることは印刷だけです。差込印刷を行う為には、以下の手順を踏みます。

  1. サンプルドキュメントがテンプレートとなります。メニューより「▶差込印刷」より【差込メニュー】を実行し、サイドバーを表示します。
  2. 使用する差込用のデータ(スプレッドシート)を指定します。Google Pickerが起動するので、使用するスプレッドシートを指定します。
  3. 次に生成するドキュメントを格納するドライブの場所を指定します。同じくGoogle Pickerが起動するので、フォルダを指定します。
  4. 差込文字列の挿入は2.で指定したスプレッドシート(まだシート名の指定は出来ません)の1枚目のカラムを自動で読み取って表示してくれます。よって、カラムを2行にするだとか、オカシナ整形をすると読めなくなります。
  5. 差し込みたい位置にカーソルを移動し、4.で表示されたカラムリストをクリックすると、その場所に特別な文字列が挿入されます。これは削除したり変形させてはいけません。
  6. 最後に、RUNボタンを押すと、テンプレートを複製しスプレッドシートデータのレコード数分ページを作り、文字列を置換します。
  7. 最後に生成したドキュメントへのリンクが表示されるダイアログが出てくるので、リンクをクリックして印刷するだけ。
  8. 使用する差込データのスプレッドシートは、予め書式を「書式なしテキスト」にしておくと良いです。特に日付などのデータはそのままだと、表示してる形式ではない形式でデータが取得されてしまいます。書式なしテキストなら、見た目のままのデータで差し込んでくれます。
  9. Google Picker APIを利用していますので、クラウドコンソールでデベロッパーキーを生成し、Picker APIを有効にする必要性があります。

実行結果

ポイント

印刷メソッドがない分、テンプレートを下敷きに、1つのドキュメント内にページという形で、印刷物の元を作るのが味噌です。テンプレートの中身を画像から文字列まで含めて、ドキュメントを複製し、その後、replacetextにて文字をスプレッドシートのカラムに対応するものをもって置換をするわけです。実際には、テンプレートデータの塊を複製しては、置換し、複製しては置換する作業を繰り返しています。

ページはスプレッドシートのレコード分だけ用意しますし、挿入するカラム文字についても、自動的に挿入するスクリプトが仕込まれているので、ユーザはマウスだけで操作が完結することができます。また、サイドバーを用いてるので、ダイアログと違い、常に作業しながら行えるので便利ですね。こういうユーティリティ的なシーンではサイドバーはオススメです。

メソッド類ですが、正直まだ全体像を把握していません。もっと良いやり方があるのかもしれません。実用には十分だとは思います。今回は§記号を代用して、完全一致で置き換えるようにしています。

その後、replaceTextの正規表現は、通常のJavascriptで用いられてる正規表現とは異なり、RE構文と呼ばれるもので書かないといけないみたいです。[テスト]⇒置き換え文字としたい場合には、sourceDoc.replaceText(“(\\[)(テスト)(\\])”,”置き換え文字”);としなければならないようです。

パラグラフのコピー元ですが、テンプレートのBodyをコピーしたものから複製しています。でないと、新たにコピーが追加されて置換を行ったものを複製してしまう為です。オリジナルをキープしておくわけです。また、新たにDocumentを作らずファイルの複製を行わせてる理由は、ずっと放置されてるバグなのですが、そのままオリジナルファイルからのパラグラフコピーだと画像が出ません。ファイルの複製なら問題ないので、複製しBodyをコピーし、それをレコード数分差し込みつつ置換しています。Document.Element.Typeが画像も何もかもがParagraphで返って来るので判別ができないのもそれが理由です。tableなどは逆にちゃんと帰ってくるので、今回のような個別のappendが必要というちぐはぐ具合がなんとも言えません。

関連リンク

共有してみる: