メインコンテンツへスキップ

05 · グループごとのシート分割

シナリオ

同じ更新レポートを 1 ファイルにまとめつつ、地域ごとに別のシートを置きたいとします。さらに、特定のステータス値リストに該当する「更新不可」シートも 1 枚加えます。

アプローチ: シート名にグループキーを埋め込む

テンプレートシートの名前自体がシートテンプレートです。xl3 はグループキーの一意な値ごとにシートを 1 つずつ展開し、テンプレート内容をそのまま複製します。

Template sheet name: 地域-{{ [地域] }}

xl3 は 地域-{{ [地域] }} というシート名をそのまま読み込み、ソース行を 地域 でグループ化して、地域ごとに 地域-東京地域-大阪 のようにシートを 1 つずつ展開します。

__config__

キー
source_sheet元データ
source_table1
output_file_pattern地域別レポート.xlsx

テンプレート(シート名 地域-{{ [地域] }})

セル
A1取引先
B1更新金額
A2{{ [取引先] }}
B2{{ [更新金額] }}
A3合計
B3{{ SUM([更新金額]) }}

元データ

取引先地域更新金額
アクメ東京18400
ベータ大阪7200
コレオン東京25100

結果(regions.xlsx)

  • シート 地域-東京: アクメ、コレオン、合計=43500。
  • シート 地域-大阪: ベータ、合計=7200。

名前付きリストでシートをフィルタする

よく使うパターンの 1 つ ― グループごとにシートを作りつつ、別に「$5k 未満の更新全体」シートをステータスリスト基準でもう 1 枚加える場合です。__lists__ を使います。

__lists__:
status_active: ["進行中", "更新中"]
status_inactive: ["解約", "失効"]

そしてシートテンプレートではこのように参照します。

シートテンプレート名: 要注意
A1: 取引先 | B1: ステータス | C1: 更新金額
A2: {{ @filter [ステータス] in __lists__[status_active] }}{{ @filter [更新金額] < 5000 }}{{ [取引先] }}
B2: {{ [ステータス] }}
C2: {{ [更新金額] }}

1 ブロック内の複数 @filter ディレクティブは AND で合成されます。つまり各フィルタが直前の結果をさらに絞り込みます。

メモ

  • シート名は Excel の 31 文字制限と禁止文字([ ] / \ ? *)に合わせてサニタイズされます。サニタイズ結果が衝突する場合の動作は ADR-0021 に従って実装定義です ― グループキー自体を上流で一意に保ってください。
  • 空のグループキーは ADR-0026 に従って (blank) リテラルとして扱われます。
  • シート順序は ADR-0016 に従って最初に登場した順序を踏襲します。