Docurain Labo

Docurainサービス開発日記

マクロを使って帳票のメンテナンス性を高めましょう

マクロを使って帳票のメンテナンス性を高めましょう!

帳票では細かなカスタマイズが不定期に求められるので、メンテナンス性高い状態に維持するのが大事なポイントになります。そのためにできることは幾つかありますが、一つはコピー&ペーストで場当たり的な対応をしないことです。

例えば自社の情報やヘッダー情報、フッターに記載した連絡先に関する情報などを全ての帳票に直書きしていると、いざその情報が変わった時に変更漏れが発生したり、幾つも修正する手間が発生します。かといって、それをシステム側から出力するのも面倒でしょう。

そこで使って欲しいのがDocurainのマクロ機能です。共通処理を部品化し、再利用性を高めます。

今回のデータ

今回は分かりやすさのために明細データはありません。顧客の会社名、担当者名のみです。

{
  "customer": {
    "company": "株式会社Docurain",
    "account": "ドキュメント 太郎"
  }
}

マクロを使わない場合

まずマクロを使わない場合の例です。印刷範囲を3つに分けて、それぞれ「請求書」「納品書」「お客様控え」としています。いずれの帳票においても顧客情報を出力しています。繰り返し部分が多いので、もしお客様の住所を追加したいと思ったら、すべての帳票を修正しなければなりません。

f:id:moongift:20220324111657j:plain

出力結果です。

f:id:moongift:20220324111721j:plain

マクロを使う

ではマクロを使ってみましょう。

マクロの定義

まず印刷範囲外(別シートでも可)にマクロを定義します。今回の例の場合は以下のようになります。

f:id:moongift:20220324111810j:plain

マクロの定義は以下の通りです。

#macro(マクロ名 引数...)
  ## マクロの内容
#end

今回はマクロ名を header とし、顧客情報 $customer が引数になりますので、次のようになります。

#macro(header $customer)

複数の引数がある場合は、カンマで区切ります。

#macro(header $customer, $number, $string)

もし引数がない場合には、次のようになります。

#macro(header)

そして、このマクロの中で必要な出力(今回は顧客情報の出力)を行います。マクロの終わりには #end を指定してください。マクロの定義は1つのセル内で完結する関数型のマクロと、複数行使ったテンプレート型のマクロがあります。それぞれの使い方は後述します。

マクロを利用する

作成したマクロをそれぞれの帳票で呼び出します。これはA列に記述します。

#header($ROOT.customer)

header は先ほど定義したマクロ名で、括弧の中でマクロに渡す引数を指定します。引数がない場合には不要なので、次のようになります。

#header()

引数が複数ある場合はカンマで区切ります 。

#header($ROOT.customer, 1)

文字列を渡す場合には、ダブルクォートで囲んでください。

#header($ROOT.customer, 1, "これは文字列です")

関数として定義する場合

マクロは2つの形式があります。まず関数として定義する場合です。例えば以下のようになります。

#macro(replace $str)
  $str.replace('(株)', '株式会社')
#end

f:id:moongift:20220327203239p:plain

この場合の注意点は次の通りです。

  • 1つのセルに記述します
  • A列に記述します

この関数として定義した場合には、その関数の呼び出し結果を表示するセルで、次のように記述します。

#replace("(株)Docurain")

そうすると、帳票では次のように表示されます。

株式会社Docurain

もちろん変数も利用できます。

#replace($e.customer.company)

f:id:moongift:20220327203253p:plain

#if を使った出力結果の分岐もできます。

#macro(replace $num)
  #if ($num == 1)
1です
  #else
それ以外です
  #end
#end

この場合 #replace(1) とセルに記述すれば 1です と、それ以外の文字や数字であれば それ以外です と出力されます。

テンプレートとして定義する場合

このマクロを呼び出した部分に、マクロ内で定義した出力内容がそのまま差し込まれます。

今回のテンプレート例です。

f:id:moongift:20220324112039j:plain

出力結果です。

f:id:moongift:20220324112102j:plain

まとめ

マクロを使うことで出力内容を再利用でき、メンテナンス性が高まります。あまり多用すると部品の管理が大変になるので、その点はご注意ください。