05 · グループごとのシート分割
シナリオ
同じ更新レポートを 1 ファイルにまとめつつ、地域ごとに別のシートを置きたいとします。さらに、特定のステータス値リストに該当する「更新不可」シートも 1 枚加えます。
アプローチ: シート名にグループキーを埋め込む
テンプレートシートの名前自体がシートテンプレートです。xl3 はグループキーの一意な値ごとにシートを 1 つずつ展開し、テンプレート内容をそのまま複製します。
Template sheet name: 地域-{{ [地域] }}
xl3 は 地域-{{ [地域] }} というシート名をそのまま読み込み、ソース行を 地域 でグループ化して、地域ごとに 地域-東京、地域-大阪 のようにシートを 1 つずつ展開します。
__config__
| キー | 値 |
|---|---|
source_sheet | 元データ |
source_table | 1 |
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 に従って最初に登場した順序を踏襲します。