公開日:2025-03-27
こんにちは!Excel/PDF出力と数か月向き合い続け、ついに自由自在に具現化できるようになった能力者のすずきです。・・・と大見得切ったものの、相変わらず理想の形で出力できることを目指して悩み続ける毎日でございます。
さて、本日お話しするテーマは表題の通り、弊社のgusuku Customine(以下カスタマインと呼称)の機能の一つ、「Excel/PDF出力」です。その中でも特に、レコードの一覧を出力する際の自由度をぐぐっと広げる裏技をご紹介したいと思います。
(カスタマインのExcel/PDF出力の基本についてはこちらをご覧ください。)
裏技の内容をざっくり説明すると、レコードの一覧を出力する場合、レコードを実際の帳票に直接放り込むのではなく、一旦別シートに出力した上で関数による参照で整形することで、ソートしなおしたり、条件に合うものだけを表示したりと自由度が格段にアップする、ということです。とは言っても、これだけではイメージしにくいと思うので、詳しく説明していきたいと思います。
基本のやり方
Excelテンプレート内に、「$FOREACH」と「$END」というgusukuコマンドを使うことで、レコードの数だけ行が増えるようにする方法が一般的です。
例えば、以下のような「従業員リスト」というkintoneアプリがあるとします。

※本記事に登場する人名は全て架空のものです。
このレコードを全てExcelに出力したい場合、エクセルテンプレート側は以下のようにします。

$FOREACHと$ENDに挟まれた行がレコードの数だけ増え、さらに増えた各行に各レコードの値が入っていくので、このテンプレートを使ってExcel出力した場合、以下のようになります。

このようにレコードを一覧形式で出力することは可能ですが、レコードの取得条件や並び順はExcelテンプレート内で指定するのでなく、カスタマイン側で出力対象のレコードを取得するアクションの設定に依存します。
では、例えば「正社員、契約社員、派遣社員をそれぞれ別々のシートに出力したい」と言われるとどうでしょう?
カスタマインのExcel/PDF出力は、基本的に1アクションで取ったひとかたまりのレコードしか流し込めないので、通常これをやろうとするとレコード取得とExcel/PDF出力を3回繰り返して、別々のファイルとして出力して後から手動で結合するしかないのです。
本題:別シートを経由させてみよう
ですが冒頭の「別シートを経由させる」方法を使えば、1度の出力で正社員、契約社員、派遣社員をそれぞれ別々のシートに出力することが可能になります。
ということでその方法をご紹介していきます。
手順1:「一次出力用」シートの作成
まずは一旦レコードのデータを全て出力するための「一次出力用」シートを作ります。

レコードのフィールドを出力する列のほかに、COUNTIF関数を使って、「正社員の中の何番目」というように雇用形態ごとの連番を振り、これを雇用形態の値と結合させて、例えば「正社員-3」「契約社員-9」のような参照キーが自動で作成されるようにしておきます。
実際に出力するとこんな感じです。

手順2:条件に合う行の表示
さあ次はこれを参照して、各帳票のシートに表示させてみましょう。今回はXLOOKUP関数を使います。テンプレート側の設定は以下のようになります。

XLOOKUP関数は簡単に言うと、キーが一致する行を指定範囲から検索し、一致した行の別の列の値を返してくれるものです。これによって、「正社員-3」を一次出力の表示キーの列から検索し、一致した4行目の氏名・性別・年齢・入社日をA8からD8に表示する、ということができます。
なお、Excelテンプレート内での式は、「=XLOOKUP($E6,一次出力用!$G$2:$G$4,一次出力用!A$2:A$4,””)」と、一次出力用シートの2行目から4行目という狭い範囲しか検索しない式になっています。
この部分は、$FOREACHのある行と$ENDのある行の範囲で指定して置けば、出力時には一次出力用シート内でFOREACHによって行が自動的に増えるのに合わせて、検索範囲が自動で広がりますのでご安心ください。
実はこのXLOOKUP関数に限らず、式内で参照される部分は$FOREACH~$ENDによる行の増減によって参照先がずれる仕様になっています(ご存じない方も多いかと思います)。
実際に出力するとこうなります。

さて、ここまではいいものの、E列の「正社員-1」などが邪魔に見えますね・・・。ですがご安心ください!E列は印刷範囲外にしておけば、印刷されることはありませんし、PDF出力した場合も表示されません。
同じく「一次出力用」シートもシート自体非表示にしておけば、これも印刷やPDFには含まれなくなります。もちろんXLOOKUP関数による参照は問題なく機能します。
PDF化したものがこちらです!



応用編:今度は複数のアプリのレコードを混ぜてみよう
流し込んだレコードを種類ごとに分けて別々のシートに出力する方法をご紹介してきましたが、今度は逆に複数のアプリから取得したレコードを混ぜて並べ替えてみましょう。
おや、先ほど言ったばかりの、「カスタマインのExcel/PDF出力は、基本的に1アクションで取ったひとかたまりのレコードしか流し込めない」という言葉と矛盾してますね・・・。確かにそうなんですが、関連レコード一覧を使うことで、他のアプリのレコードを参照することもできるので、関連レコード一覧を複数置けば、複数のアプリのレコードを表示することができる、というわけです。
今度は別のアプリを例に出します。商品の在庫をkintone上で管理しているとします。
以下のように、まず商品マスタアプリがあり、各商品の出庫を管理するアプリと、入庫を管理するアプリが別々にあり、それらが商品マスタに紐づいていて、関連レコード一覧として表示されています。

さて、この出庫と入庫の履歴を1枚のシートに出力したいとなった場合、通常のやり方なら、$FOREACH()~$ENDを縦に2つ並べることで、出庫レコードと入庫レコードが別れた状態で縦に並べることしかできません。
例えば、出庫と入庫を混ぜて、日付順に並べて入出庫複合の履歴として表示したい、という要望があった場合、どうすればいいでしょうか?
これも「別シートを経由させる」方法によって可能になるのです!やり方をご紹介していきます。
手順1:「一次出力用」シートの作成
今回も「一次出力用」シートを作ります。入庫履歴、出庫履歴は縦に並べて出力します。

特徴的なのは、B列・C列でソートするための準備として、入庫・出庫合わせた日付順の順番を自動で計算させています。まずはB列で「=RANK(A3,A2:A7,0)」のように、順位を計算するRANK関数を使って、日付の降順で順位をつけるのですが、これだけだと、同じ日付の行があった場合、同じ順位になってしまいます。
ですので、さらにC列で「=B3+COUNTIF(B$2:B3,B3)-1」のように、COUNTIF関数で同じ順番を付けます。例えば、4番目の日付が3レコードあった場合、1つ目のレコードは4番目、2つ目のレコードは5番目、3つ目のレコードは6番目となります。これを参照のキーとします。(ここはもっと簡単なやり方があるかも・・・?)
また、これは直接関係ないですが、入庫の場合はプラス、出庫の場合はマイナスの個数で表すために、入庫の行はそのままの個数をE列に、出庫の行は-1を掛けたものをE列に入れています。
実際に出力するとこんな感じになります。

手順2:ソートして表示
次はこれを参照して、各帳票のシートに表示させてみましょう。先ほどと同様にXLOOKUP関数を使います。テンプレート側の設定は以下のようになります。

今回はA列に入れた行番号をキーにしています。
B列の日付の式は「=XLOOKUP($A8,一次出力用!C$2:C$7,一次出力用!A$2:A$7,””)」、
D列の入出庫数の式は「=XLOOKUP($A7,一次出力用!C$2:C$7,一次出力用!E$2:E$7,””)」のように、A列の行番号をキーに参照させます。
実際に出力するとこうなります。

ちゃんと入庫と出庫の履歴が日付順に並んでますね。
入出庫数については、出庫がマイナスになったのでわかりやすいですし、在庫の増減も計算しやすいです。
まとめ
今回ご紹介した「別シートを経由させる」方法があれば、レコード、テーブル、関連レコードを出力する際の自由度が大幅に上がるのではないかと思います!
Excel/PDF出力は簡単なようで難しいことも多いですが、今回のようにExcelの関数をうまく組み合わせれば、可能性は多分無限大!知らんけど(笑)
投稿者プロフィール

- kintoneがメインのエンジニアです。空き時間の半分を合気道に使います。
最新の投稿
gusuku2025年3月27日[Excel/PDF出力]数多のレコードを思い通りに操ろう
kintone2025年2月20日カスタマインを使ってkintoneのレコード内を探検しに行こう!
kintone2025年1月23日[FormBridge]あらかじめ値が入ったフォームを表示するURLを作ろう
life-work2025年1月17日冬の沖縄ワーケーション!ついでにバスケ観戦にスパルタンレース参戦で最高に温まってきた!