kintoneのテーブルは、1件のレコードの中に行を増やせる表です。見積の明細や訪問の履歴を1画面にまとめられる反面、一覧・検索・通知・アクセス権では普通のフィールドと違う動きをします。作ってから「この行だけ一覧に出したい」「行ごとに権限を分けたい」となって別アプリに作り直す会社は少なくありません。この記事では、テーブルにするか別アプリにするかの判断から、置き方、計算、ルックアップ、ファイルの読み込みと書き出し、できないことの代わりまで、公式ヘルプで確かめた仕様だけで書きます。フォームにフィールドを置いてアプリを公開したことがある人を前提にしています。
この記事の内容
テーブルとは何か
テーブルは、フォームに置くフィールドの一つです。中に文字列や数値などのフィールドを横に並べておくと、レコードを登録するときに行を何行でも足せます。注文管理なら「商品・単価・数量」の行を注文の数だけ、日報なら「訪問時間・訪問先・内容」の行をその日の訪問の数だけ入れられます。
テーブルが無いと、商品1・商品2・商品3と同じ項目を並べて置くことになります。それだと4つ目の商品が来たときに入らず、空欄だらけの画面にもなります。テーブルにすると、必要な分だけ行を足せばよくなります。
行はレコードの追加画面と編集画面で、行の右にある「行を追加する」アイコンで足し、「この行を削除する」アイコンで消します。行は押した行のすぐ下に入ります。
呼び方は画面でも公式ヘルプでも「テーブル」です。一方、APIのフィールド形式ではテーブルの種類が SUBTABLE になっていて、開発者向けの記事や古い資料では「サブテーブル」と呼ばれます。「テーブル」と「サブテーブル」は同じものです。

先に決めること
テーブルは、一度作ってデータが入ると後から別アプリへ切り出すのが大変です。テーブルに入れたフィールドはテーブルの外にも別のテーブルにも移動できず、アプリに反映済みのフィールドを後からテーブルに入れることもできません。テーブルの設定画面にも「一度テーブルにすると、元に戻せません。」と出ます。作る前に、次の表で行き先を決めます。
テーブルにするか、別アプリにするか
| 観点 | テーブル | 別アプリ(1行=1レコード) |
|---|---|---|
| 合計 | 同じレコードの中ならSUMですぐ出る | 関連レコード一覧は計算式で参照できないので、親レコードに合計を自動で持たせられない |
| 一覧 | 一覧の「表示する」を押すと開く。常に並べて見せることはできない | 1行ずつ一覧に並び、列で見られる |
| ソート | テーブル内のフィールドではソートできない | 日付・数値・文字列(1行)などで普通にソートできる |
| 絞り込み・検索 | どれか1行が条件に合えば、レコードごと出てくる | 条件に合った行(レコード)だけが出る |
| グラフ | 集計には使えるが、行数100万行までの範囲で集計される | 普通のレコードとして集計できる |
| 条件通知 | 他の行がすでに条件を満たしていると通知されない | レコードごとに通知される |
| アクセス権 | テーブル内のフィールドにはフィールドのアクセス権を設定できない | 行ごとにレコードのアクセス権で分けられる |
| 件数 | 1テーブル10フィールド・100行までが公式の目安 | レコード数の上限は無い |
| 入力 | 親と一緒に1画面でまとめて書ける | 1件ずつ登録する。アクションで親から開ける |
判断の軸は「行を、親のレコードと切り離して見たいか」です。行だけを一覧で追いたい、行ごとに期日や担当者があって通知したい、行が1年で何百も増える、のどれかに当たるなら別アプリにします。親と一緒にしか見ない、合計して印刷する、行数が数十行で収まる、ならテーブルが向いています。
見積の明細はテーブル、案件ごとの対応履歴は件数と通知の都合で別アプリ、というのが実際によく回っている分け方です。迷ったら別アプリ側に倒しておくほうが、後から困りません。別アプリはルックアップと関連レコード一覧で親とつなげば、親の画面からも履歴が見えます。
テーブルに入れられるフィールド
公式に「テーブルに含められない」とされているのは次のフィールドです。これ以外の入力用のフィールドは入れられます。
| 入れられない | 入れられる |
|---|---|
| ラベル | 文字列(1行)、文字列(複数行)、リッチエディター |
| 関連レコード一覧 | 数値、計算 |
| スペース、罫線 | ラジオボタン、チェックボックス、複数選択、ドロップダウン |
| グループ、テーブル | 日付、時刻、日時 |
| レコード番号 | 添付ファイル、リンク |
| 作成者、更新者 | ユーザー選択、組織選択、グループ選択 |
| 作成日時、更新日時 | ルックアップ |
| すでに使用中のフィールド |
入れられても、扱いに注意が要るものがあります。
- 添付ファイルを入れたテーブルは、ファイルからの一括更新ができなくなります。
- チェックボックスと複数選択は、テーブルの外の計算式から参照できません。
- ルックアップは、コピー先を同じテーブルの中のフィールドにしか指定できません。
テーブルそのものは、既存のテーブルやグループの中には置けません。グループで折りたためる区画にテーブルを入れたい、という作り方はできないので、テーブルは区画の外に置きます。
設計表
ここでは見積アプリの明細を例にします。テーブルの外に見積の基本情報と合計、テーブルの中に明細を置きます。計算式はフィールドコードで書くので、配置したあとで各フィールドの「フィールドコード」をフィールド名と同じ文字にそろえておきます。
テーブルの外
| フィールド名 | 種類 | 設定 |
|---|---|---|
| 見積日 | 日付 | 初期値を当日にする |
| 取引先名 | ルックアップ | 取引先アプリから取得 |
| 件名 | 文字列(1行) | 必須 |
| 小計合計 | 計算 | SUM(金額) |
| 消費税 | 計算 | ROUNDDOWN(小計合計*0.1,0) |
| 合計金額 | 計算 | 小計合計+消費税 |
| 明細行数 | 計算 | SUM(カウント)。行数の確認用 |
テーブルの中(テーブル名:明細)
| フィールド名 | 種類 | 設定 |
|---|---|---|
| 商品コード | ルックアップ | 商品マスタから取得。ほかのフィールドのコピーで商品名と単価を入れる |
| 商品名 | 文字列(1行) | ルックアップのコピー先 |
| 単価 | 数値 | ルックアップのコピー先 |
| 数量 | 数値 | 初期値を1にする |
| 金額 | 計算 | 数量*単価 |
| 備考 | 文字列(1行) | 値引きの理由など |
| カウント | 数値 | 初期値を1にする。行数を数えるためのもの |
公式の目安は1テーブルにつき10フィールドかつ100行までで、テーブルのフィールド数は「中に置いたフィールドの数+1」で数えます。上の明細は7フィールドなので8と数え、目安の内側です。これを超えると画面の表示が遅くなり、レコードの操作やカスタマイズに影響が出ることがあると書かれています。
作る手順
テーブルを置く
- レコードの一覧画面で、右上の歯車の「アプリを設定」をクリックします。
- 「フォーム」タブを開きます。
- 左のフィールド一覧から「テーブル」をフォームにドラッグします。
- テーブルの中に、商品コード(ルックアップ)をドラッグします。
- 続けて商品名、単価、数量、金額、備考、カウントを右へ並べてドラッグします。
- 各フィールドの歯車から「設定」を開き、フィールド名とフィールドコードを設計表どおりにします。
- テーブルの右上の歯車にカーソルを合わせ、「テーブルの設定」をクリックします。
- 「テーブル名」に「明細」と入れます。
- 「保存」をクリックします。
- 画面左上の「フォームを保存」をクリックします。
- 画面右上の「アプリを更新」をクリックし、確認画面でもう一度「アプリを更新」をクリックします。
フィールドを置いていない空のテーブルがあると、フォームを保存できません。

並べたフィールドの行をテーブルにする
先にフィールドを1行に並べてから、その行をまとめてテーブルにする方法もあります。
- フォームにフィールドを横一列に並べます。
- その行の右端にあるアイコンにカーソルを合わせ、「テーブルの設定」をクリックします。
- 「この行をテーブルにする」をクリックします。
- 「保存」をクリックします。
この方法が使えるのは、アプリをまだ公開・更新していないフィールドだけです。一度「アプリを公開」か「アプリを更新」をしたフィールドは、もうテーブルにできません。
【画面:「テーブルの設定」画面。「この行をテーブルにする」ボタンと「一度テーブルにすると、元に戻せません。」の文言】
行ごとの計算と、テーブルの外での合計
テーブルの中に置いた計算フィールドは、同じ行の値で計算します。金額に 数量*単価 と書けば、行ごとにその行の数量と単価を掛けます。日報の明細なら、終了時刻から開始時刻を引く 終了-開始 で行ごとの所要時間が出せます。このときは計算フィールドの表示形式を「時間」にします。
テーブルの外で全行を合計するときは、テーブルの外に置いた計算フィールド(または計算式を設定した文字列(1行))に SUM(金額) と書きます。所要時間の合計なら SUM(所要時間) で、表示形式は同じく「時間」にします。数量が空の行があっても合計は計算されるので、空欄の扱いを決めておきます。数量に初期値を入れておくのが手早い方法です。
テーブルの外の計算式からテーブルの中のフィールドを参照できるのは、SUM関数とCONTAINS関数だけです。IF(金額>100000,"要承認","") のようにテーブル外でテーブル内の値を直接比べると、「配列型の値に対して適切な関数が利用されていません。」と出て保存できません。合計を一度テーブルの外の計算フィールドに出し、その値でIFを書きます。
CONTAINS関数は、テーブルの中に指定した文字と完全に一致する値の行があるかを判定します。テーブル内の文字列(1行)・ラジオボタン・ドロップダウン・ルックアップ(コピー元が文字列のもの)が対象です。テーブルの中にドロップダウンの「優先度」があるなら、テーブルの外の文字列(1行)に次の式を書くと、どれか1行でも「至急」なら目印が出ます。
IF(CONTAINS(優先度, "至急"), "至急対応あり", "通常")
行数を数えるときは、テーブルの中に初期値1の数値フィールド(ここではカウント)を置き、テーブルの外の計算フィールドに SUM(カウント) と書きます。テーブル内のフィールドの初期値は追加した行にも入るので、行を足すたびに1ずつ増えます。計算式の書き方全般は「計算式の書き方。条件分岐(IF)と日付計算のパターン集」にまとめています。

テーブルの中のルックアップ
テーブルの中にルックアップを置くと、行ごとに商品マスタなどから値を取ってこられます。設定項目は普通のルックアップと同じで、「関連付けるアプリ」「コピー元のフィールド」「ほかのフィールドのコピー」を指定します。
- テーブル内の商品コード(ルックアップ)の「設定」を開きます。
- 「関連付けるアプリ」で商品マスタを選びます。
- 「コピー元のフィールド」で商品マスタの商品コードを選びます。
- 「ほかのフィールドのコピー」で、商品名→商品名、単価→単価を追加します。
- 「保存」をクリックします。
制約は3つあります。テーブルの中のルックアップは、コピー先に同じテーブルの中のフィールドしか指定できません。逆にテーブルの外のルックアップは、テーブルの中のフィールドにコピーできません。そして参照先のアプリ側では、テーブルの中のフィールドを「コピー元のフィールド」にも「ほかのフィールドのコピー」のコピー元にもできません。商品マスタは1商品1レコードで作り、テーブルに入れないようにします。

一覧にテーブルを出す
- 「アプリを設定」から「一覧」タブを開きます。
- 表示したい一覧の「編集」をクリックします。
- 左のフィールド一覧からテーブル(ここでは明細)を一覧の列にドラッグします。
- 「保存」をクリックし、「アプリを更新」をクリックします。
一覧には、テーブルの列に「表示する」が出ます。押すとそのレコードのテーブルの中身が開き、「閉じる」か別のレコードの「表示する」で閉じます。テーブルの中身を常に開いておくことも、複数のレコードのテーブルを同時に開くこともできません。スマホなどのモバイル版では、一覧画面でテーブルフィールドが表示されません。

行の初期値・並び順・行の自動追加
ここは「標準でできること」と「できないこと」がはっきり分かれます。
行の初期値は、テーブルの中の各フィールドに普通の初期値を設定すれば、行を足すたびにその値が入ります。数量に1、日付に当日、という設定はそのまま行ごとに効きます。
一方、テーブルの設定画面で決められるのは「テーブル名」「テーブル名を表示しない」「フィールドコード」だけで、最初から決まった行を何行か並べておく設定はありません。点検表のように毎回同じ10項目を並べたいなら、次のどれかにします。
- ひな形のレコードを1件作っておき、そのレコードを開いて「レコードを再利用する」から登録する運用にする
- JavaScriptで、レコード追加画面を表示したときのイベント(
app.record.create.show)にテーブルの行を入れる処理を書く - プラグインを使う
行の並び順も標準では自由になりません。行を一番上に足すことはできず、公式ヘルプでも「上に対しての行の追加はできません。」と書かれています。新しい行を上に置きたいなら、公式が案内している代わりの手のとおり、一番上の行を空けておき、その行の「行を追加する」を押して2行目に新しい内容を書く運用にします。テーブル内のフィールドはソートの対象にもならないので、日付順に並べ直す標準の操作もありません。
行を自動で増やす、たとえば親レコードの保存時に行を足す、という処理も標準ではできません。JavaScriptでは、テーブルの値の配列に行を足したり、テーブルの行が追加・削除されたときのイベント(app.record.create.change.テーブルのフィールドコード)で処理を書いたりできます。契約コースがライトコースの場合は、JavaScriptによるカスタマイズもプラグインも使えません。

ファイルの読み込みと書き出し
Excelの表をkintoneに移すときに、テーブルはいちばん崩れやすいところです。先に書き出しの形を見ておくと、読み込みのファイルも作りやすくなります。
書き出し
テーブルを含むレコードは、1件が複数の行に分かれて書き出されます。先頭の列は「レコードの開始行」で、各レコードの最初の行に「*」が入ります。「*」の行から次の「*」の直前までが1件分です。テーブルの外の値は、そのレコードの各行に繰り返しコピーされて出てきます。
この繰り返しがよくある落とし穴です。書き出したCSVをExcelで開いて合計金額の列を足すと、明細が3行あるレコードは合計金額が3回数えられます。レコード単位で集計するなら、「レコードの開始行」が「*」の行だけに絞ってから計算します。
読み込み
読み込むファイルも同じ形にします。
- 先頭の列を「レコードの開始行」にし、各レコードの最初の行にだけ「*」を書きます。「*」以外の文字があるとエラーになります。
- テーブルの外の値は、「*」の行にだけ書きます。それ以外の行に書いた値は無視されます。
- テーブルの中の値は、行の数だけ下へ書きます。
- テーブルが2つ以上あるときは、同じ行に複数のテーブルの値を置かず、1行ずつずらして書きます。
読み込みの画面では、テーブルの中のフィールドが「テーブル名 > フィールド名」の形で出てくるので、それぞれに「ファイルの列」を指定します。既存のレコードのテーブルを上書きするときは、変えないフィールドも含めて、テーブルの中の全部のフィールドに列を指定します。1つでも「(指定しない)」が残っていると「読み込む」が押せません。テーブルの中に添付ファイルがある場合は既存レコードの更新ができないので、そのテーブルのフィールドを全部「(指定しない)」にします。
公式ヘルプは、いったんアプリから書き出したファイルを元に編集することを勧めています。列の並びと「*」の位置が正しい状態から始められるので、手で一から作るより失敗が減ります。Excelファイルの読み込みは1ファイル1,000行までで、ファイル上ではテーブルの1行が1行を使います。明細が多いならCSV(1ファイル10万行まで)にします。取り込み前の表の整え方は「Excelの管理表をkintoneに移す手順。取り込みで崩れない整え方」で詳しく書いています。

使用例
見積・請求の明細
設計表のとおり、商品マスタからルックアップで単価を取り、行ごとに金額を出し、テーブルの外で合計と税を出します。明細は親の見積と一緒に見て、一緒に印刷するものなので、テーブルが最も素直に合う使い方です。印刷までの作り方は「kintoneで請求書を作って出す。明細テーブルと計算式、印刷まで」で通して書いています。
顧客ごとの訪問履歴
顧客アプリに「訪問日・担当・内容・次回予定」のテーブルを持たせる形です。訪問が月に数回で、顧客の画面を開いたときに経緯が並んでいれば足りる会社ならこれで回ります。ただし、次回予定の日付で通知したい、担当ごとの訪問件数を毎月見たい、という要望が出たら別アプリに分けます。リマインダーの条件通知の基準日に選べるのは日付・日時・作成日時・更新日時のフィールドで、テーブルの中の日付を基準日にする設定は公式の説明に出てきません。行ごとの期日で動かしたいものは、行をレコードにしておく必要があります。
日々の作業記録
日報アプリに「開始・終了・作業内容・所要時間」のテーブルを置き、所要時間を 終了-開始、1日の合計を SUM(所要時間) で出します。1日の作業はその日の日報と一緒にしか見ないので、テーブルに向いています。月の合計を作業内容別に見たいときは、グラフで分類する前に小さなデータで集計の見え方を試してから本番の一覧を作ります。書く側の手間を減らす項目の選び方は「kintoneの日報アプリの作り方。書く側がラクな項目設計」にまとめています。

できないことと、その代わり
| できないこと | 代わりの手 |
|---|---|
| 一覧でテーブルの中身を常に並べて見せる | 別アプリにして関連レコード一覧で親の画面に出す |
| テーブル内のフィールドでソートする | 別アプリにする。並べ替えだけならJavaScriptかプラグイン |
| テーブル内のフィールドにフィールドのアクセス権を設定する | 隠したい項目をテーブルの外に出すか、別アプリにしてレコードのアクセス権で分ける |
| レコードタイトルにテーブル内のフィールドを使う | テーブルの外に代表の値を持つフィールドを置く |
| 関連レコード一覧の「表示するレコードの条件」にテーブル内のフィールドを使う | 条件にするキーをテーブルの外に置く |
| テーブル外の計算式でSUM・CONTAINS以外を使って参照する | 一度SUMでテーブル外に出してから計算する |
| 行を一番上に足す | 一番上の行を空けておく運用にする |
| 決まった行を最初から並べる・行を自動で足す | 再利用の運用、JavaScript、プラグイン |
| テーブルをグループの中に置く | テーブルはグループの外に置く |
| テーブル内のフィールドをテーブルの外へ移す | 新しくフィールドを作り、ファイルの書き出しと読み込みで値を移す |
| アクションでテーブルの中とテーブルの外の間で値を写す | コピー元とコピー先をどちらもテーブルにする |
アプリアクションでは、テーブルの中からテーブルの外へも、外から中へもコピーできません。2つ以上のテーブルから1つのテーブルへまとめることもできず、1つのテーブルから複数のテーブルへのコピーはできます。見積から受注へ明細を引き継ぐなら、両方のアプリに同じ形のテーブルを1つずつ用意してつなぐのが確実です。
よく詰まるところ
| 症状 | 原因 | 直し方 |
|---|---|---|
| 「この行をテーブルにする」がグレーアウトする | 行にラベル・罫線などテーブルに入れられないフィールドがある。または一度アプリに反映したフィールドがある | 入れられないフィールドを行から外す。反映済みのフィールドは新しく置き直す |
| 既存のフィールドをテーブルにドラッグできない | 使用中のフィールドはテーブルへ移動できない | テーブル内に新しくフィールドを置き、必要なら書き出しと読み込みで値を移す |
| テーブル外の計算式で「配列型の値に対して適切な関数が利用されていません。」と出る | テーブル内のフィールドをSUM・CONTAINS以外で参照している | SUMで合計を出したフィールドを間に挟む |
| 絞り込みで、条件に合わない行まで出てくる | 1行でも条件に合えばレコードごと表示される仕様 | 行単位で探すものは別アプリにする |
| 条件通知が2件目から届かない | レコードの条件通知は、他の行がすでに条件を満たしていると通知されない | 行ごとに知らせたいものは別アプリにする |
| リマインダーが同じレコードで何通も届く | リマインダーの条件通知は、テーブルのいずれかの行が条件を満たすたびに送られる | 条件をテーブルの外のフィールドで書く |
| 一覧のソートにテーブル内のフィールドが出てこない | テーブル内のフィールドはソートできない | ソートしたい値をテーブルの外に持つか、別アプリにする |
| ファイル読み込みで「読み込む」が押せない | テーブル内のフィールドに「ファイルの列」が指定されていないものがある | テーブル内の全フィールドに列を指定する |
| 添付ファイル入りのテーブルが一括更新できない | テーブルに添付ファイルがあると、テーブルのデータを一括更新できない | そのテーブルは全部「(指定しない)」にして読み込む |
| テーブル内のルックアップを含むテーブルが一括更新できない | 参照先アプリの閲覧権限が無い | 読み込む人に参照先アプリの閲覧権限を付ける |
| 書き出したCSVで合計金額を足すと何倍にもなる | テーブル外の値は各行に繰り返し出力される | 「レコードの開始行」が「*」の行だけで集計する |
| ファイル読み込みで登録したのに通知が来ない | ファイルの読み込みで登録・更新したレコードは条件通知の対象にならない | 読み込み後に担当へ別途知らせる運用にする |
| スマホの一覧でテーブルが見えない | モバイル版は一覧画面でテーブルを表示しない | レコードを開いて詳細画面で見る |
| テーブルを消したらデータも消えた | テーブルを削除すると、中のフィールドと登録済みのデータも全部消える | 消す前にファイルに書き出しておく |

次にやること
テーブルの基本が押さえられたら、業務ごとの作り方に進みます。明細と印刷は「kintoneで請求書を作って出す。明細テーブルと計算式、印刷まで」、テーブルの中で使う式は「計算式の書き方。条件分岐(IF)と日付計算のパターン集」、作業記録のテーブルは「kintoneの日報アプリの作り方。書く側がラクな項目設計」、既存の表をテーブルごと取り込むなら「Excelの管理表をkintoneに移す手順。取り込みで崩れない整え方」を読んでください。