Docurain Labo

Docurainサービス開発日記

複雑な集約条件においても数式自動シフトが使えるようになりました

明細のある見積書や請求書のような帳票では、ページごとの合計金額、全ページの総合計金額のような項目がよくあります。

1ページ目 2ページ目
f:id:yutay:20210729172942p:plain:w300 f:id:yutay:20210729172947p:plain:w300

その際にDourainでは簡単にページごと、グループごと、全ページの各単位で金額を計算することが可能です。

作成するテンプレートで範囲の定義を行い、その範囲ごとに計算を行うようにすることで実現させます。

早速やってみましょう!

上に載せたような見積書を作成します。

サンプルのテンプレートとデータ(JSON)です。
サンプルダウンロード

範囲について

範囲は#scopeを使用して定義します。

今回、範囲は以下の「全て」・「顧客」・「ページ」の3つの範囲を定義します。

f:id:yutay:20210729164123p:plain

範囲の定義は以下のように書きます。それぞれの範囲を#scope - #endで囲みます。

#scopeの構文は次の通りです。

#scope([範囲の名称] as [変数名])

f:id:yutay:20210729192410p:plain

「全て」の範囲定義の通り、as [変数名] は省略可能です。範囲の名称を変数として使用する必要がない場合(範囲の名称が固定で良い場合)は、as [変数名] を省略します。

これで範囲の定義は完了です。

範囲を使用した計算について

範囲ごとに計算を行うにはDR.SHIFT_FORMULA()を使用します。

DR.SHIFT_FORMULA()は数式の自動シフトを適応可能にしてくれる機能です。*1

依然として Excelの数式そのまま であるため、Excelがもつ数式記述支援機能(構文チェック、引数チェックなど)を全て活用することができます!!

DR.SHIFT_FORMULA()の構文は次の通りです。

=DR.SHIFT_FORMULA(値or式,"scope=[#scope()で代入している変数], target=[対象とするセル範囲]")

scopeを省略した場合、そのセルが所属する印刷範囲を範囲として見なします。

targetの値は、

  • all スコープ内の全ての範囲
  • nearest スコープ内の最近傍セル範囲

のいずれかを指定します。省略した場合はnearestと判定されます。

では、先ほど#scopeにて定義した範囲をDR.SHIFT_FORMULA()から参照して計算を行います。

サンプルを確認しつつ以下をご覧ください。

  • 全ページの合計金額

    f:id:yutay:20210730095220p:plain =DR.SHIFT_FORMULA(SUM(D20),"scope=全て, target=all")とすることで、範囲名称が「全て」の範囲の合計金額セル(D20)を参照しSUMにて合計を算出します。それにより総合計金額を出力します。

  • 顧客ごとの合計金額

    f:id:yutay:20210730100414p:plain =DR.SHIFT_FORMULA(SUM(J31),"scope=$outerScope, target=all")とすることで、範囲名称が$outerScope(顧客ごと)の範囲のページ合計セル(J31)を参照しSUMにて合計を算出します。それにより顧客ごとの合計金額を出力します。

  • ページごとの合計金額

    f:id:yutay:20210730100428p:plain =DR.SHIFT_FORMULA(SUM(J29:J29),"scope=$innerScope, target=all")とすることで、範囲名称が$innerScope(ページごと)の範囲の明細金額セル(J29)を参照しSUMにて合計を算出します。それによりページごとの合計金額を出力します。

  • 明細ごとの金額 f:id:yutay:20210729194310p:plain =DR.SHIFT_FORMULA(G29*I29)とすることで、数量(G29)*単価(I29)を算出します。それにより明細ごとの合計金額を出力します。 DR.SHIFT_FORMULAを使うことで明細行が複数になってもG29・I29のセル範囲は自動シフトするため、何も意識せずテンプレート上で該当のセルを指定すれば良いです。

データを準備して出力

今回使用するデータは以下です。

{
  "顧客リスト": [
    {
      "顧客名": "株式会社 顧客1",
      "見積No": 1127,
      "見積日": "2021-07-29",
      "明細": [
                { "名称": "項目1-1", "数量": 1, "単位": "", "単価": 10000 },
                { "名称": "項目1-2", "数量": 2, "単位": "", "単価": 10000 },
               ...中略...
                { "名称": "項目1-17", "数量": 17, "単位": "", "単価": 10000 }
      ]
    },
    {
      "顧客名": "株式会社 顧客2",
      "見積No": 1128,
      "見積日": "2021-07-29",
      "明細": [
                { "名称": "項目2-1", "数量": 1, "単位": "", "単価": 20000 },
                { "名称": "項目2-2", "数量": 2, "単位": "", "単価": 20000 },
               ...中略...
                { "名称": "項目2-20", "数量": 20, "単位": "", "単価": 20000 }
      ]
    }
  ]
}

出力結果です。

(サンプルテンプレートのA9セルにて明細15行ごとに分割して改ページするようにしています)

1ページ目(総合計)
f:id:yutay:20210729195227p:plain:w300
2ページ目(顧客1の1ページ目) 3ページ目(顧客1の2ページ目)
f:id:yutay:20210729195256p:plain:w300 f:id:yutay:20210729195303p:plain:w300
4ページ目(顧客2の1ページ目) 5ページ目(顧客2の2ページ目)
f:id:yutay:20210729195308p:plain:w300 f:id:yutay:20210729195319p:plain:w300

それぞれの範囲で計算され、「ページ合計金額」、「顧客ごとの合計金額」、「全ての合計金額」が正しく計算されてますね。

今回作成したサンプルは、無料トライアルページからも登録不要で試すことが出来ます。

他にも様々な機能がありますので、ぜひアカウント無料登録してマニュアルを参照しお試しください。

*1:数式の自動シフト:DocurainにてExcel/PDF出力後に命令行が削除されることを意識せずに、Docurainテンプレート上でExcelのセル範囲をそのまま使えることを指します。Docurainテンプレートにて、とあるセルを参照している数式がある場合、命令行が削除された後の行番号を考慮した数式でなければなりませんが、その命令行が削除された後の行番号に自動に適応します。