画面項目定義書とは、画面にある項目を1行ずつ並べ、種別・入出力・型・桁・必須・初期値などを決めておく表です。 1行が「この項目をどう作り、どう確かめるか」の単位になるので、列の意味をそろえて、迷わず埋められる書き方にしておくことが大切です。

この記事は、項目1行の書き方に絞ります。列ごとの書き方の早見表、部品の種類ごとに書くべき属性の対応表、架空の備品管理システムの4画面(検索・一覧・登録・詳細)を計55行記入した例を載せます。さらに、定義表から HTML の入力属性(maxlength・required・pattern など)を作る Python のコードと、その HTML をブラウザで開いて判定を確かめた結果を示します。

確認環境:Ubuntu 24.04、Python 3.11.15、Playwright 1.56.0 で起動した Chromium 141.0.7390.37(ヘッドレス)。ブラウザでの判定結果は、この Chromium で確かめたものです。

画面項目定義書の列の早見表

列 意味 書く値 記入例 書き漏れやすい点
項目ID 項目を1つに決める番号 画面IDの番号+連番 E030-02 行を足しても既存の番号を振り直さない
項目名 画面に出る見出し 画面の表記どおり 備品名 物理名ではなく、利用者が見る名前
種別 画面の部品の種類 テキスト、テキストエリア、数値、日付、選択、チェック、ボタン、ラベル、リンク テキスト 選択はプルダウンかラジオかまで決める
I/O 入力か表示か I(入力)、O(表示)、I/O(表示して変更可)、-(ボタンなど) I/O 変更画面で値を出すなら I ではなく I/O
型 値の種類(文字種) 全角半角、半角英数、数値、日付、日時、コード、真偽、メール 全角半角 「文字列」だけでなく、許す文字の種類まで
桁 最大の長さ 文字数または数字の桁数 60 文字数かバイト数か。表示項目は表示上の最大
必須 入力が必要か ○(必須)、△(条件付き)、-(任意・対象外) ○ △ の条件は編集仕様に書く
初期値 画面を開いたときの値 空、固定値、当日、ログイン者、登録済みの値 新規:空 変更:登録済みの値 新規と変更で分ける。「空」と「-(対象外)」を区別する
活性条件 操作できる条件 常時、または条件の文 貸出可がONのとき 非活性か非表示か。権限による違い
取得元 値の出どころ テーブル名.列名、マスタ、区分値、画面入力、固定値 equipment.equipment_name 名称を出す項目は名称の列を書く
編集仕様 入力時の変換と表示の書式 変換、書式、範囲、省略、寄せ 前後の空白を除く 未入力のときの表示(「-」など)

1行に書くのは「その項目だけで決まること」です。 2つ以上の項目にまたがるチェック(開始日が終了日より前、など)や、ボタンを押したあとの処理の流れは、別の表に書いて項目IDで参照します。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「画面項目定義書の書き方|項目一覧テンプレートと属性・桁数の記入例」

項目一覧のテンプレート

Markdown の表です。

### 画面ID 画面名

| 項目ID | 項目名 | 種別 | I/O | 型 | 桁 | 必須 | 初期値 | 活性条件 | 取得元 | 編集仕様 |
|---|---|---|---|---|---|---|---|---|---|---|
| | | | | | | | | | | |

表計算ソフトに貼れるタブ区切りです。複数の画面を1枚にまとめられるよう、先頭に画面IDの列を置いています。

画面ID    項目ID    項目名 種別  I/O 型   桁   必須  初期値 活性条件    取得元 編集仕様

列ごとの値の決め方

種別:部品の種類を決まった語で書く

種別 使う場面 あわせて決めること
テキスト 1行の文字入力 型(文字種)、桁
テキストエリア 複数行の文字入力 桁、改行の可否
数値 数量や金額の入力 範囲(最小・最大)、小数の桁
日付 日付の入力 範囲、書式
選択 決まった候補から選ぶ 候補の取得元、並び順、未選択を置くか
チェック ON・OFF、複数選択 初期値、OFFのときの扱い
ボタン 処理を始める 活性条件、押したときの動き
ラベル 値を表示するだけ 取得元、表示の書式
リンク 別の画面へ移る 移る先、渡す値

I/O:入力・表示・両方を3つの値で書き分ける

値 意味 例
I 利用者が入力する。開いたときは初期値 検索条件の備品名
O 表示するだけ。利用者は変えられない 詳細画面の備品名、一覧の件数
I/O 登録済みの値を表示し、利用者が変えられる 変更画面の備品名
- 値を持たない ボタン、ページ送り

型と桁:文字の種類と長さを分けて書く

型 許す文字 桁の数え方 例
全角半角 文字の種類を問わない 文字数 備品名 60
半角英数 0〜9、A〜Z、a〜z 文字数 備品番号 10
半角英数ハイフン 半角英数と - 文字数 型番 30
数値 数字(必要なら小数点・符号) 整数部の桁数。小数は「9,2」のように書く 数量 3
日付 年月日 書式の文字数 YYYY-MM-DD なら 10
日時 年月日と時刻 書式の文字数 YYYY/MM/DD HH:MM なら 16
コード マスタや区分で決まった値 コードの桁数 分類 2
真偽 ON・OFF 1 貸出可 1
メール メールアドレスの形式 文字数 254

桁は、保存先の列の桁と合わせます。 画面で60文字まで入るのに保存先が40文字、というずれは、項目定義の「桁」と「取得元」を横に並べて確かめると見つかります。

必須・初期値・活性条件:条件があるときの書き方

列 値 書き方
必須 ○ いつも必須
必須 △ 条件付き。条件は編集仕様に「貸出可がONのとき必須」と書く
必須 - 任意、または入力項目ではない
初期値 新規:空 変更:登録済みの値 1つの画面を新規と変更で使うときは、モードごとに書く
初期値 当日、ログイン者のメール 動的な値は、何から決まるかを言葉で書く
初期値 未選択 選択の初期値。先頭の候補を選んだ状態にするなら、その値を書く
活性条件 常時 いつでも操作できる
活性条件 貸出可がONのとき 条件を満たさないときは非活性(見えるが操作できない)
活性条件 登録権限があるとき(無ければ非表示) 非表示にする場合は、かっこで書き添える

取得元と編集仕様:出どころと見せ方を分ける

書くこと 列 例
どこから値を持ってくるか、どこへ保存するか 取得元 equipment.purchase_amount
入力された値をどう変換するか 編集仕様 前後の空白を除く、英小文字は大文字に変換
取りうる範囲 編集仕様 範囲 1〜999、当日まで
どんな書式で見せるか 編集仕様 3桁区切り+「円」、YYYY/MM/DD、右寄せ
コードを名称に変えるか 編集仕様 1:利用可 2:貸出中 9:廃棄済 の名称を表示
値がないとき 編集仕様 未入力は「-」
長いとき 編集仕様 30文字を超える分は「…」で省略

部品の種類別:書くべき属性の対応表

種別によって、埋める列と「-」にしてよい列が決まります。◎は必ず書く、○は当てはまるときに書く、-は対象外です。

種別 I/O 型 桁 必須 初期値 活性条件 取得元 編集仕様で書くこと
テキスト ◎ ◎(文字種) ◎ ◎ ◎ ◎ ◎ 変換(空白の除去、大文字化)、検索なら一致の方法
選択 ◎ ◎(コード) ◎(コードの桁) ◎ ◎(未選択か、どの値か) ◎ ◎(候補の取得元) 表示する名称、並び順
日付 ◎ ◎ ◎(書式の長さ) ◎ ◎(空か当日か) ◎ ◎ 書式、範囲
チェック ◎ ◎(真偽かコード) ○ ○ ◎(ONかOFFか) ◎ ◎ 複数選択か、OFFのときの扱い
ボタン - - - - - ◎ - 押したときの動き(処理の定義への参照)
ラベル ◎(O) ◎ ◎(表示上の最大) - - ○(表示条件) ◎ 書式、寄せ、省略、未入力時の表示

ボタンは活性条件が、ラベルは編集仕様が中心になります。入力の部品は左から右まで全部の列を埋める、と覚えておくと書き漏れが減ります。

記入例:備品管理の4画面

社内の備品を管理する架空のシステムで、検索・一覧・登録・詳細の4画面を記入した例です。

EQP010 備品検索(検索条件):12行

項目ID 項目名 種別 I/O 型 桁 必須 初期値 活性条件 取得元 編集仕様
E010-01 備品番号 テキスト I 半角英数 10 - 空 常時 画面入力 前方一致で検索。英小文字は大文字に変換
E010-02 備品名 テキスト I 全角半角 60 - 空 常時 画面入力 部分一致で検索。前後の空白を除く
E010-03 分類 選択 I コード 2 - 未選択(すべて) 常時 categories.category_code 選択肢は分類名を表示、コード順
E010-04 設置場所 選択 I コード 3 - 未選択(すべて) 常時 locations.location_code 選択肢は場所名を表示、コード順
E010-05 購入日(開始) 日付 I 日付 10 - 空 常時 画面入力 YYYY-MM-DD。この日以降を検索
E010-06 購入日(終了) 日付 I 日付 10 - 空 常時 画面入力 YYYY-MM-DD。この日以前を検索
E010-07 状態 チェック I コード 1 - 「利用可」「貸出中」がON 常時 区分値 equipment_status 複数選択。1つもONでなければすべてを対象
E010-08 貸出可のみ チェック I 真偽 1 - OFF 常時 画面入力 ONのとき貸出可の備品だけを検索
E010-09 表示件数 選択 I 数値 3 ○ 20 常時 固定値 20・50・100 1ページに表示する行数
E010-10 検索ボタン ボタン - - - - - 常時 - 押すと入力チェックのあと備品一覧を表示
E010-11 クリアボタン ボタン - - - - - 常時 - すべての条件を初期値に戻す
E010-12 新規登録ボタン ボタン - - - - - 登録権限があるとき(無ければ非表示) - 押すと備品登録を新規モードで開く

EQP020 備品一覧(検索結果):13行

項目ID 項目名 種別 I/O 型 桁 必須 初期値 活性条件 取得元 編集仕様
E020-01 検索結果件数 ラベル O 数値 6 - - - 検索結果の件数 3桁区切り+「件」。0件のときは「該当する備品がありません」
E020-02 行選択 チェック I 真偽 1 - OFF 状態が「廃棄済」以外の行 画面入力 ヘッダのチェックで表示中の行をまとめてON・OFF
E020-03 備品番号 リンク O 半角英数 10 - - - equipment.equipment_no 押すと備品詳細を開く
E020-04 備品名 ラベル O 全角半角 60 - - - equipment.equipment_name 30文字を超える分は「…」で省略。全文はツールチップ
E020-05 分類 ラベル O 全角半角 20 - - - categories.category_name コードではなく名称を表示
E020-06 設置場所 ラベル O 全角半角 30 - - - locations.location_name コードではなく名称を表示
E020-07 購入日 ラベル O 日付 10 - - - equipment.purchase_date YYYY/MM/DD。中央寄せ
E020-08 購入金額 ラベル O 数値 9 - - - equipment.purchase_amount 3桁区切り、右寄せ。未入力は「-」
E020-09 状態 ラベル O コード 1 - - - equipment.status_kbn 1:利用可 2:貸出中 9:廃棄済 の名称を表示
E020-10 貸出可 ラベル O 真偽 1 - - - equipment.lendable_flg 真は「○」、偽は空欄。中央寄せ
E020-11 更新日時 ラベル O 日時 16 - - - equipment.updated_at YYYY/MM/DD HH:MM
E020-12 ページ送り リンク - - - - 1ページ目 前・次のページがあるとき - 「前へ」「次へ」とページ番号
E020-13 CSV出力ボタン ボタン - - - - - 検索結果が1件以上のとき - 検索条件に合う全件を出力(表示中のページだけではない)

EQP030 備品登録(新規・変更):14行

項目ID 項目名 種別 I/O 型 桁 必須 初期値 活性条件 取得元 編集仕様
E030-01 備品番号 ラベル O 半角英数 10 - 新規:「(登録時に採番)」 変更:登録済みの値 - equipment.equipment_no 変更できない
E030-02 備品名 テキスト I/O 全角半角 60 ○ 新規:空 変更:登録済みの値 常時 equipment.equipment_name 前後の空白を除く
E030-03 分類 選択 I/O コード 2 ○ 新規:未選択 変更:登録済みの値 常時 equipment.category_code 選択肢は categories の分類名、コード順
E030-04 型番 テキスト I/O 半角英数ハイフン 30 - 新規:空 変更:登録済みの値 常時 equipment.model_no 英小文字は大文字に変換して保存
E030-05 購入日 日付 I/O 日付 10 ○ 新規:当日 変更:登録済みの値 常時 equipment.purchase_date YYYY-MM-DD。当日まで
E030-06 購入金額 数値 I/O 数値 9 - 新規:空 変更:登録済みの値 常時 equipment.purchase_amount 範囲 0〜999999999。単位は円
E030-07 数量 数値 I/O 数値 3 ○ 新規:1 変更:登録済みの値 常時 equipment.quantity 範囲 1〜999
E030-08 設置場所 選択 I/O コード 3 ○ 新規:未選択 変更:登録済みの値 常時 equipment.location_code 選択肢は locations の場所名、コード順
E030-09 管理者メール テキスト I/O メール 254 - 新規:ログイン者のメール 変更:登録済みの値 常時 equipment.manager_email メールアドレスの形式
E030-10 貸出可 チェック I/O 真偽 1 - 新規:ON 変更:登録済みの値 常時 equipment.lendable_flg -
E030-11 貸出日数の上限 数値 I/O 数値 2 △ 新規:7 変更:登録済みの値 貸出可がONのとき equipment.max_lend_days 範囲 1〜30。貸出可がONのとき必須
E030-12 備考 テキストエリア I/O 全角半角 200 - 新規:空 変更:登録済みの値 常時 equipment.note 改行可
E030-13 登録ボタン ボタン - - - - - 常時 - 押すと入力チェックのあと確認メッセージを出して登録
E030-14 戻るボタン ボタン - - - - - 常時 - 入力途中の値があれば確認メッセージを出して前の画面へ

EQP040 備品詳細:16行

項目ID 項目名 種別 I/O 型 桁 必須 初期値 活性条件 取得元 編集仕様
E040-01 備品番号 ラベル O 半角英数 10 - - - equipment.equipment_no -
E040-02 備品名 ラベル O 全角半角 60 - - - equipment.equipment_name 省略せず全文を表示。長いときは折り返す
E040-03 分類 ラベル O 全角半角 20 - - - categories.category_name 名称を表示
E040-04 型番 ラベル O 半角英数ハイフン 30 - - - equipment.model_no 未入力は「-」
E040-05 購入日 ラベル O 日付 10 - - - equipment.purchase_date YYYY/MM/DD
E040-06 購入金額 ラベル O 数値 9 - - - equipment.purchase_amount 3桁区切り+「円」。未入力は「-」
E040-07 数量 ラベル O 数値 3 - - - equipment.quantity 3桁区切り
E040-08 設置場所 ラベル O 全角半角 30 - - - locations.location_name 名称を表示
E040-09 状態 ラベル O コード 1 - - - equipment.status_kbn 名称を表示。「廃棄済」は赤字
E040-10 貸出可 ラベル O 真偽 1 - - - equipment.lendable_flg 真は「貸出可(上限 N 日)」、偽は「貸出不可」。N は max_lend_days
E040-11 備考 ラベル O 全角半角 200 - - - equipment.note 改行をそのまま表示。未入力は「-」
E040-12 登録者・登録日時 ラベル O 全角半角 40 - - - equipment.created_by, created_at 「氏名 YYYY/MM/DD HH:MM」
E040-13 更新者・更新日時 ラベル O 全角半角 40 - - - equipment.updated_by, updated_at 「氏名 YYYY/MM/DD HH:MM」
E040-14 変更ボタン ボタン - - - - - 登録権限があり、状態が「廃棄済」以外のとき - 押すと備品登録を変更モードで開く
E040-15 廃棄ボタン ボタン - - - - - 登録権限があり、状態が「利用可」のとき - 確認メッセージのあと状態を「廃棄済」にする
E040-16 戻るボタン ボタン - - - - - 常時 - 備品一覧へ戻る(検索条件とページを保つ)

4画面をまとめたタブ区切り(表計算ソフト用)

上の55行を1つにまとめたものです。この内容を screen_items.tsv として保存すると、次の節のコードの入力になります。

画面ID    項目ID    項目名 種別  I/O 型   桁   必須  初期値 活性条件    取得元 編集仕様
EQP010  E010-01 備品番号    テキスト    I   半角英数    10  -   空   常時  画面入力    前方一致で検索。英小文字は大文字に変換
EQP010  E010-02 備品名 テキスト    I   全角半角    60  -   空   常時  画面入力    部分一致で検索。前後の空白を除く
EQP010  E010-03 分類  選択  I   コード 2   -   未選択(すべて)    常時  categories.category_code    選択肢は分類名を表示、コード順
EQP010  E010-04 設置場所    選択  I   コード 3   -   未選択(すべて)    常時  locations.location_code 選択肢は場所名を表示、コード順
EQP010  E010-05 購入日(開始) 日付  I   日付  10  -   空   常時  画面入力    YYYY-MM-DD。この日以降を検索
EQP010  E010-06 購入日(終了) 日付  I   日付  10  -   空   常時  画面入力    YYYY-MM-DD。この日以前を検索
EQP010  E010-07 状態  チェック    I   コード 1   -   「利用可」「貸出中」がON   常時  区分値 equipment_status    複数選択。1つもONでなければすべてを対象
EQP010  E010-08 貸出可のみ   チェック    I   真偽  1   -   OFF 常時  画面入力    ONのとき貸出可の備品だけを検索
EQP010  E010-09 表示件数    選択  I   数値  3   ○   20  常時  固定値 20・50・100   1ページに表示する行数
EQP010  E010-10 検索ボタン   ボタン -   -   -   -   -   常時  -   押すと入力チェックのあと備品一覧を表示
EQP010  E010-11 クリアボタン  ボタン -   -   -   -   -   常時  -   すべての条件を初期値に戻す
EQP010  E010-12 新規登録ボタン ボタン -   -   -   -   -   登録権限があるとき(無ければ非表示)  -   押すと備品登録を新規モードで開く
EQP020  E020-01 検索結果件数  ラベル O   数値  6   -   -   -   検索結果の件数 3桁区切り+「件」。0件のときは「該当する備品がありません」
EQP020  E020-02 行選択 チェック    I   真偽  1   -   OFF 状態が「廃棄済」以外の行    画面入力    ヘッダのチェックで表示中の行をまとめてON・OFF
EQP020  E020-03 備品番号    リンク O   半角英数    10  -   -   -   equipment.equipment_no  押すと備品詳細を開く
EQP020  E020-04 備品名 ラベル O   全角半角    60  -   -   -   equipment.equipment_name    30文字を超える分は「…」で省略。全文はツールチップ
EQP020  E020-05 分類  ラベル O   全角半角    20  -   -   -   categories.category_name    コードではなく名称を表示
EQP020  E020-06 設置場所    ラベル O   全角半角    30  -   -   -   locations.location_name コードではなく名称を表示
EQP020  E020-07 購入日 ラベル O   日付  10  -   -   -   equipment.purchase_date YYYY/MM/DD。中央寄せ
EQP020  E020-08 購入金額    ラベル O   数値  9   -   -   -   equipment.purchase_amount   3桁区切り、右寄せ。未入力は「-」
EQP020  E020-09 状態  ラベル O   コード 1   -   -   -   equipment.status_kbn    1:利用可 2:貸出中 9:廃棄済 の名称を表示
EQP020  E020-10 貸出可 ラベル O   真偽  1   -   -   -   equipment.lendable_flg  真は「○」、偽は空欄。中央寄せ
EQP020  E020-11 更新日時    ラベル O   日時  16  -   -   -   equipment.updated_at    YYYY/MM/DD HH:MM
EQP020  E020-12 ページ送り   リンク -   -   -   -   1ページ目   前・次のページがあるとき    -   「前へ」「次へ」とページ番号
EQP020  E020-13 CSV出力ボタン    ボタン -   -   -   -   -   検索結果が1件以上のとき    -   検索条件に合う全件を出力(表示中のページだけではない)
EQP030  E030-01 備品番号    ラベル O   半角英数    10  -   新規:「(登録時に採番)」 変更:登録済みの値 -   equipment.equipment_no  変更できない
EQP030  E030-02 備品名 テキスト    I/O 全角半角    60  ○   新規:空 変更:登録済みの値  常時  equipment.equipment_name    前後の空白を除く
EQP030  E030-03 分類  選択  I/O コード 2   ○   新規:未選択 変更:登録済みの値    常時  equipment.category_code 選択肢は categories の分類名、コード順
EQP030  E030-04 型番  テキスト    I/O 半角英数ハイフン    30  -   新規:空 変更:登録済みの値  常時  equipment.model_no  英小文字は大文字に変換して保存
EQP030  E030-05 購入日 日付  I/O 日付  10  ○   新規:当日 変更:登録済みの値 常時  equipment.purchase_date YYYY-MM-DD。当日まで
EQP030  E030-06 購入金額    数値  I/O 数値  9   -   新規:空 変更:登録済みの値  常時  equipment.purchase_amount   範囲 0〜999999999。単位は円
EQP030  E030-07 数量  数値  I/O 数値  3   ○   新規:1 変更:登録済みの値  常時  equipment.quantity  範囲 1〜999
EQP030  E030-08 設置場所    選択  I/O コード 3   ○   新規:未選択 変更:登録済みの値    常時  equipment.location_code 選択肢は locations の場所名、コード順
EQP030  E030-09 管理者メール  テキスト    I/O メール 254 -   新規:ログイン者のメール 変更:登録済みの値  常時  equipment.manager_email メールアドレスの形式
EQP030  E030-10 貸出可 チェック    I/O 真偽  1   -   新規:ON 変更:登録済みの値 常時  equipment.lendable_flg  -
EQP030  E030-11 貸出日数の上限 数値  I/O 数値  2   △   新規:7 変更:登録済みの値  貸出可がONのとき   equipment.max_lend_days 範囲 1〜30。貸出可がONのとき必須
EQP030  E030-12 備考  テキストエリア I/O 全角半角    200 -   新規:空 変更:登録済みの値  常時  equipment.note  改行可
EQP030  E030-13 登録ボタン   ボタン -   -   -   -   -   常時  -   押すと入力チェックのあと確認メッセージを出して登録
EQP030  E030-14 戻るボタン   ボタン -   -   -   -   -   常時  -   入力途中の値があれば確認メッセージを出して前の画面へ
EQP040  E040-01 備品番号    ラベル O   半角英数    10  -   -   -   equipment.equipment_no  -
EQP040  E040-02 備品名 ラベル O   全角半角    60  -   -   -   equipment.equipment_name    省略せず全文を表示。長いときは折り返す
EQP040  E040-03 分類  ラベル O   全角半角    20  -   -   -   categories.category_name    名称を表示
EQP040  E040-04 型番  ラベル O   半角英数ハイフン    30  -   -   -   equipment.model_no  未入力は「-」
EQP040  E040-05 購入日 ラベル O   日付  10  -   -   -   equipment.purchase_date YYYY/MM/DD
EQP040  E040-06 購入金額    ラベル O   数値  9   -   -   -   equipment.purchase_amount   3桁区切り+「円」。未入力は「-」
EQP040  E040-07 数量  ラベル O   数値  3   -   -   -   equipment.quantity  3桁区切り
EQP040  E040-08 設置場所    ラベル O   全角半角    30  -   -   -   locations.location_name 名称を表示
EQP040  E040-09 状態  ラベル O   コード 1   -   -   -   equipment.status_kbn    名称を表示。「廃棄済」は赤字
EQP040  E040-10 貸出可 ラベル O   真偽  1   -   -   -   equipment.lendable_flg  真は「貸出可(上限 N 日)」、偽は「貸出不可」。N は max_lend_days
EQP040  E040-11 備考  ラベル O   全角半角    200 -   -   -   equipment.note  改行をそのまま表示。未入力は「-」
EQP040  E040-12 登録者・登録日時    ラベル O   全角半角    40  -   -   -   equipment.created_by, created_at    「氏名 YYYY/MM/DD HH:MM」
EQP040  E040-13 更新者・更新日時    ラベル O   全角半角    40  -   -   -   equipment.updated_by, updated_at    「氏名 YYYY/MM/DD HH:MM」
EQP040  E040-14 変更ボタン   ボタン -   -   -   -   -   登録権限があり、状態が「廃棄済」以外のとき   -   押すと備品登録を変更モードで開く
EQP040  E040-15 廃棄ボタン   ボタン -   -   -   -   -   登録権限があり、状態が「利用可」のとき -   確認メッセージのあと状態を「廃棄済」にする
EQP040  E040-16 戻るボタン   ボタン -   -   -   -   -   常時  -   備品一覧へ戻る(検索条件とページを保つ)

4画面を並べると見えること

画面 中心になる列 書き分けの要点
検索 初期値、編集仕様(一致の方法) 必須はほぼ「-」。条件を入れなかったときの扱いを書く
一覧 取得元、編集仕様(書式・省略・寄せ) ほぼ O。行ごとに活性が変わる部品は活性条件に書く
登録 型、桁、必須、初期値 新規と変更の初期値を分ける。条件付き必須は △
詳細 取得元、編集仕様(未入力時の表示) すべて O。ボタンの活性条件に権限と状態を書く

同じ「購入日」でも、検索では範囲の入力(I・任意)、一覧では YYYY/MM/DD の表示(O)、登録では当日までの入力(I/O・必須)と、画面ごとに I/O・必須・編集仕様が変わります。 項目定義を画面ごとに書く理由はここにあります。

定義表からHTMLの入力属性へ落とす

項目定義の列は、HTML の入力要素の属性にほぼそのまま対応します。

定義表の列と値 HTML での書き方 ブラウザで確かめたこと
種別=テキスト input 要素の type="text" -
型=メール type="email" 「taro」は typeMismatch になる
種別=数値 type="number" と min・max・step 範囲の外は rangeUnderflow/rangeOverflow、小数は stepMismatch
種別=日付 type="date" と max(当日まで) 翌日は rangeOverflow になる
種別=選択 select 要素。先頭に値が空の option required を付けると、未選択は valueMissing
種別=チェック type="checkbox" と checked OFF のときは値が送信されない
種別=テキストエリア textarea 要素と maxlength -
桁 maxlength キー入力は桁で止まる。type="number" には効かない
必須=○ required 空のとき valueMissing
必須=△ スクリプトで required を切り替える -
型=半角英数 など pattern(正規表現) 値の全体が一致しないと patternMismatch
初期値 value、checked -
I/O=O 入力要素にしない(output 要素など) -
活性条件 スクリプトで disabled を切り替える disabled の項目は送信されない
取得元 name(列名を使う) -

定義表を読んでHTMLを作るPython

screen_items.tsv から、指定した画面の入力項目を HTML にします。標準ライブラリだけで動きます。

"""画面項目定義(TSV)から、入力項目の HTML を作る。

使い方: python3 gen_html.py screen_items.tsv EQP030 > eqp030.html
"""
import csv
import html
import re
import sys
from datetime import date

PATTERN = {                      # 型(文字種)-> pattern 属性
    "半角英数": "[0-9A-Za-z]+",
    "半角英数ハイフン": "[0-9A-Za-z\\-]+",
}


def attrs(d):
    return "".join(f' {k}' if v is True else f' {k}="{html.escape(str(v))}"'
                   for k, v in d.items())


def to_html(r):
    kind, name = r["種別"], r["取得元"].split(".")[-1]
    a = {"id": r["項目ID"], "name": name}
    if r["必須"] == "○":
        a["required"] = True
    if r["I/O"] == "O":
        return f'<output id="{r["項目ID"]}"></output>'
    if kind == "テキスト":
        a["type"] = "email" if r["型"] == "メール" else "text"
        a["maxlength"] = r["桁"]
        if r["型"] in PATTERN:
            a["pattern"] = PATTERN[r["型"]]
        return f"<input{attrs(a)}>"
    if kind == "テキストエリア":
        a["maxlength"] = r["桁"]
        return f"<textarea{attrs(a)}></textarea>"
    if kind == "数値":
        a["type"] = "number"
        m = re.search(r"範囲 (\d+)〜(\d+)", r["編集仕様"])
        if m:
            a["min"], a["max"] = m.group(1), m.group(2)
        a["step"] = 1
        m = re.search(r"新規:(\d+)", r["初期値"])
        if m:
            a["value"] = m.group(1)
        return f"<input{attrs(a)}>"
    if kind == "日付":
        a["type"] = "date"
        if "当日まで" in r["編集仕様"]:
            a["max"] = date.today().isoformat()
        if "新規:当日" in r["初期値"]:
            a["value"] = date.today().isoformat()
        return f"<input{attrs(a)}>"
    if kind == "選択":
        return (f'<select{attrs(a)}><option value="">選択してください</option>'
                f'<option value="01">(マスタから取得)</option></select>')
    if kind == "チェック":
        a["type"], a["value"] = "checkbox", "1"
        if "新規:ON" in r["初期値"]:
            a["checked"] = True
        return f"<input{attrs(a)}>"
    if kind == "ボタン":
        t = "submit" if r["項目名"].startswith("登録") else "button"
        return f'<button id="{r["項目ID"]}" type="{t}">{r["項目名"][:-3]}</button>'
    raise ValueError(f"種別 {kind} の変換が決まっていません")


def main(path, screen_id):
    with open(path, encoding="utf-8", newline="") as f:
        rows = [r for r in csv.DictReader(f, delimiter="\t")
                if r["画面ID"] == screen_id]
    print('<!doctype html>\n<html lang="ja">\n<meta charset="utf-8">')
    print(f"<title>{screen_id}</title>\n<form id=\"f\">")
    for r in rows:
        tag = to_html(r)
        if r["種別"] == "ボタン":
            print(f"  {tag}")
        else:
            print(f'  <p><label for="{r["項目ID"]}">{r["項目名"]}</label> {tag}</p>')
    print("</form>\n</html>")


if __name__ == "__main__":
    main(sys.argv[1], sys.argv[2])
python3 gen_html.py screen_items.tsv EQP030 > eqp030.html

出力された eqp030.html です(2026-10-05 に実行したので、購入日の初期値と上限がその日付になっています)。

<!doctype html>
<html lang="ja">
<meta charset="utf-8">
<title>EQP030</title>
<form id="f">
  <p><label for="E030-01">備品番号</label> <output id="E030-01"></output></p>
  <p><label for="E030-02">備品名</label> <input id="E030-02" name="equipment_name" required type="text" maxlength="60"></p>
  <p><label for="E030-03">分類</label> <select id="E030-03" name="category_code" required><option value="">選択してください</option><option value="01">(マスタから取得)</option></select></p>
  <p><label for="E030-04">型番</label> <input id="E030-04" name="model_no" type="text" maxlength="30" pattern="[0-9A-Za-z\-]+"></p>
  <p><label for="E030-05">購入日</label> <input id="E030-05" name="purchase_date" required type="date" max="2026-10-05" value="2026-10-05"></p>
  <p><label for="E030-06">購入金額</label> <input id="E030-06" name="purchase_amount" type="number" min="0" max="999999999" step="1"></p>
  <p><label for="E030-07">数量</label> <input id="E030-07" name="quantity" required type="number" min="1" max="999" step="1" value="1"></p>
  <p><label for="E030-08">設置場所</label> <select id="E030-08" name="location_code" required><option value="">選択してください</option><option value="01">(マスタから取得)</option></select></p>
  <p><label for="E030-09">管理者メール</label> <input id="E030-09" name="manager_email" type="email" maxlength="254"></p>
  <p><label for="E030-10">貸出可</label> <input id="E030-10" name="lendable_flg" type="checkbox" value="1" checked></p>
  <p><label for="E030-11">貸出日数の上限</label> <input id="E030-11" name="max_lend_days" type="number" min="1" max="30" step="1" value="7"></p>
  <p><label for="E030-12">備考</label> <textarea id="E030-12" name="note" maxlength="200"></textarea></p>
  <button id="E030-13" type="submit">登録</button>
  <button id="E030-14" type="button">戻る</button>
</form>
</html>

定義表の「桁 60・必須 ○」が maxlength="60" と required に、「型 半角英数ハイフン」が pattern に、「範囲 1〜999」が min と max になっています。

活性条件と条件付き必須はスクリプトで書く

「貸出可がONのとき活性」「貸出可がONのとき必須」のように、ほかの項目の値で変わる条件は、属性だけでは表せません。数行のスクリプトで切り替えます。

// 活性条件「貸出可がONのとき」:属性だけでは書けないので、数行のスクリプトで切り替える
const lendable = document.getElementById("E030-10");
const maxDays = document.getElementById("E030-11");
function applyEnable() {
  maxDays.disabled = !lendable.checked;   // 非活性
  maxDays.required = lendable.checked;    // 必須「△」=貸出可がONのとき必須
}
lendable.addEventListener("change", applyEnable);
applyEnable();

ブラウザで判定を確かめた結果

eqp030.html に上のスクリプトを読み込ませて Chromium で開き、値を入れたときの判定(入力要素の validity の各フラグ)と、送信される値(FormData の内容)を Playwright から読み取りました。

--- 1. 開いた直後
form.checkValidity() = False
備品名     値=''            valid=False valueMissing
分類       値=''            valid=False valueMissing
購入日     値='2026-10-05'  valid=True
数量       値='1'           valid=True
設置場所   値=''            valid=False valueMissing
--- 2. 桁(maxlength)
備品名に70文字をキー入力      値=(60文字)   valid=True
備考にスクリプトで300文字     値=(300文字)  valid=True
--- 3. 文字種(pattern)
型番 ab_12   値='ab_12'  valid=False patternMismatch
型番 AB-12   値='AB-12'  valid=True
--- 4. 数値の範囲(min・max・step)
数量 0       値='0'      valid=False rangeUnderflow
数量 1000    値='1000'   valid=False rangeOverflow
数量 1.5     値='1.5'    valid=False stepMismatch
数量 12      値='12'     valid=True
number に maxlength=3   値='12345'  valid=True
--- 5. 日付とメール
購入日 翌日          値='2026-10-06'  valid=False rangeOverflow
購入日 2026-10-01    値='2026-10-01'  valid=True
メール taro              値='taro'  valid=False typeMismatch
メール taro@example.com  valid=True
--- 6. すべて入力して送信される値
form.checkValidity() = True
[["equipment_name","あ…(60文字)"],["category_code","01"],["model_no","AB-12"],["purchase_date","2026-10-01"],["purchase_amount",""],["quantity","12"],["location_code","01"],["manager_email","taro@example.com"],["lendable_flg","1"],["max_lend_days","7"],["note",""]]
--- 7. 貸出可をOFFにする(活性条件)
貸出日数の上限 disabled = True
[["equipment_name","あ…(60文字)"],["category_code","01"],["model_no","AB-12"],["purchase_date","2026-10-01"],["purchase_amount",""],["quantity","12"],["location_code","01"],["manager_email","taro@example.com"],["note",""]]
--- 8. readonly と disabled
readonly の値は送信される: True / disabled の値は送信される: False

(空白の数と一部の値の表示は、読みやすいように整えています。)

結果から、項目定義を書くときに役立つ点をまとめます。

確かめたこと 項目定義への反映
キー入力は maxlength の60文字で止まった 桁は画面で守れる
スクリプトで入れた300文字は、200桁の備考でも valid のままだった 桁のチェックはサーバー側にも置くと決めておく
type="number" に maxlength=3 を付けても 12345 が入った 数値の上限は桁ではなく「範囲」で書く
「ab_12」は一部が半角英数でも patternMismatch になった 型(文字種)は値の全体に対する条件として書く
チェックを OFF にすると lendable_flg が送信されなかった 「OFFのときは偽として保存」を編集仕様に書く
非活性にした max_lend_days は送信されなかった 非活性のときに保存する値(空にする、前の値を保つ)を編集仕様に書く
readonly の値は送信され、disabled の値は送信されなかった 「表示だけだが値は送る」項目は、活性条件ではなく I/O と編集仕様で書き分ける

MDN の input 要素のリファレンスにも、maxlength が対象とする type は text・search・url・tel・email・password であること、disabled の入力は送信されないこと、ブラウザ側の入力チェックはサーバーに正しい値が届くことを約束するものではないので、サーバー側でも確かめることが書かれています。

画面項目定義書のチェックリスト

確認すること 見る列
項目IDに重複がなく、画面の上から下・左から右の順に並んでいる 項目ID
種別が決まった語だけで書かれている 種別
変更画面の入力項目が I/O になっている I/O
入力項目のすべてに型と桁がある 型、桁
桁が保存先の列の桁と合っている 桁、取得元
△ の条件が編集仕様に書いてある 必須、編集仕様
新規と変更で初期値を分けている 初期値
非活性と非表示を書き分けている 活性条件
表示項目に、未入力のときの表示がある 編集仕様
チェックがOFFのとき、非活性のときに保存する値が決まっている 編集仕様
空欄のセルがなく、対象外は「-」になっている 全列

よくある質問

Q. 項目定義は画面ごとに書きますか、項目ごとにまとめますか? A. 画面ごとに書きます。同じ項目でも、検索・一覧・登録・詳細で I/O・必須・編集仕様が変わるためです。型と桁のように画面をまたいで同じになる部分は、データ項目辞書やテーブル定義と突き合わせてそろえます。

Q. 入力チェックはどこまで項目定義に書きますか? A. その項目だけで決まること(型、桁、必須、範囲)までを書きます。項目どうしの関係や、データベースを見て判定するチェック、エラーメッセージの文言は、入力チェックの仕様として別の表に書き、項目IDで結び付けます。

Q. 「桁」は全角を2と数えますか? A. 保存先に合わせます。保存先の列が文字数で長さを決めているなら文字数、バイト数で決めているならバイト数で書き、表の注記に「桁は文字数」と1行入れておきます。なお HTML の maxlength が数える単位は、MDN では UTF-16 のコード単位と説明されています。

Q. 表計算ソフトとMarkdownのどちらで書きますか? A. 列が多いので、記入と並べ替えは表計算ソフトが向いています。差分を確かめたいときや、この記事のようにコードから読みたいときは、タブ区切りのテキストで保存しておくと扱いやすくなります。

まとめ

  • 画面項目定義書は、項目ID・項目名・種別・I/O・型・桁・必須・初期値・活性条件・取得元・編集仕様の11列で、項目1行の作り方と確かめ方を決める表です。
  • 種別ごとに埋める列が決まります。 入力の部品は全列、ボタンは活性条件、ラベルは取得元と編集仕様が中心です。
  • I/O は I・O・I/O の3つ、必須は ○・△・- の3つで書き、条件は編集仕様に書きます。
  • 初期値は新規と変更で分け、活性条件は非活性と非表示を書き分けます。
  • 定義表の桁・必須・型・範囲は、maxlength・required・pattern・min/max に対応し、タブ区切りの定義表から HTML を作れます。
  • ブラウザで確かめると、数値に maxlength が効かない、OFF のチェックと非活性の項目は送信されないといった点が見え、編集仕様に書くべきことがはっきりします。

参考・出典

  • MDN Web Docs「input: The HTML Input element」 https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「画面項目定義書の書き方|項目一覧テンプレートと属性・桁数の記入例」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?