現状仕様書 v0.1:
1. システム概要
このGASは、Googleスプレッドシート上で動作する STOCKmini ロット番号管理版 の基本処理です。
主な目的は、商品マスターに登録された商品をもとに、以下を管理することです。
・商品番号による商品検索
・ロット番号付き入庫
・ロット番号付き出庫
・使用期限付き在庫管理
・棚番別在庫管理
・ロット在庫の更新
・操作履歴の記録
特にこの版では、通常の在庫数だけではなく、
商品番号
ロット番号
棚番
使用期限
の組み合わせで在庫を識別している点が重要です。
2. 使用シート一覧
GAS上で参照しているシートは以下の4つです。
操作パネル
商品マスター
ロット在庫
操作履歴
必須シート
以下3つは存在しないとエラーになります。
操作パネル
商品マスター
ロット在庫
任意シート
操作履歴
操作履歴シートは、存在すれば履歴を書き込みます。
存在しない場合でも、在庫更新自体は動く仕様です。
ただし、リリース版では操作履歴は必須にしたほうがよいです。
なぜなら、在庫管理システムとしては「誰が・いつ・何を・何個動かしたか」が後から追えないと実務利用で不安が残るためです。
3. 操作パネル仕様
現在のGASでは、操作パネルの入力・表示セルが固定されています。
操作パネル セル定義
B3:商品番号入力
B4:商品名表示
B5:ロット管理フラグ表示
B6:期限管理フラグ表示B8:ロット番号入力
B9:棚番入力
B10:入庫数量入力
B11:使用期限入力
B12:出庫数量入力B13:メッセージ表示
B14:処理モード
操作パネルの役割
操作パネルは、ユーザーが直接操作するメイン画面です。
流れとしては、
1. B3に商品番号を入力
2. 商品マスターから商品情報を検索
3. B4〜B6に商品情報を表示
4. ロット番号・棚番・数量・使用期限を入力
5. 入庫または出庫ボタンを押す
6. B14に処理モードがセットされる
7. 確定処理でロット在庫を更新
という構造です。
4. 商品マスター仕様
GASでは、商品マスターの2行目以降、A列〜F列を読み込んでいます。
master.getRange(2, 1, lastRow - 1, 6).getDisplayValues();
つまり、商品マスターは最低でもA〜F列まで存在する前提です。
商品マスター 列定義
A列:商品番号
B列:商品名
C列:ロット管理フラグ
D列:期限管理フラグ
E列:更新日
F列:未使用または備考欄想定
実際にGASで使っている列
A列:商品番号
B列:商品名
C列:ロット管理フラグ
D列:期限管理フラグ
E列:更新日
F列は読み込み範囲には含まれていますが、現状GAS内では使われていません。
商品マスターのサンプル
商品番号 | 商品名 | ロット管理 | 期限管理 | 更新日 | 備考
JAN001 | マスクA | YES | YES | 2026/04/27 |
JAN002 | ケーブルB | NO | NO | 2026/04/27 |
JAN003 | 食品C | YES | YES | 2026/04/27 |
JAN004 | 備品D | NO | NO | 2026/04/27 |
ロット管理フラグ
C列には以下を入れる仕様です。
YES
NO
GAS側では大文字化して判定しているため、yes や Yes でも一応動きます。
ただしリリース版では、入力規則で YES / NO のプルダウンにしたほうが安全です。
期限管理フラグ
D列も以下です。
YES
NO
こちらも入力規則でプルダウン化が望ましいです。
5. ロット在庫シート仕様
GASでは、ロット在庫シートのA列〜I列を使用しています。
stock.getRange(2, 1, lastRow - 1, 9).getValues();
ロット在庫 列定義
A列:商品番号
B列:商品名
C列:ロット番号
D列:棚番
E列:初回登録日
F列:使用期限
G列:累計入庫数
H列:累計出庫数
I列:現在庫数
ロット在庫の管理単位
現在のGASでは、在庫を以下の組み合わせで1行として管理します。
商品番号 + ロット番号 + 棚番 + 使用期限
つまり、同じ商品でも、
ロット番号が違う
棚番が違う
使用期限が違う
場合は、別在庫として管理されます。
これはロット管理版としては妥当です。
ロット番号なし商品の扱い
商品マスターでロット管理が NO の商品は、GAS内部でロット番号を自動的に以下に変換します。
DEFAULT
つまり、ロット管理しない商品でも、ロット在庫シート上ではC列に DEFAULT が入ります。
これは悪くない設計です。
ロット管理あり・なしの商品を同じロット在庫シートで扱えるからです。
6. 操作履歴シート仕様
操作履歴シートは、存在する場合のみ記録されます。
操作履歴 列定義
GASのコメント上では以下です。
A列:日時
B列:JAN
C列:商品名
D列:棚番
E列:区分
F列:数量
G列:更新後在庫
ただし、注意点があります。
GAS内ではB列に productCode を入れています。
productCode // B JAN(現状は商品番号を記録)
つまり、現在の仕様では JAN列と書いているが、実際には商品番号が入る 状態です。
ここはリリース前に整理したほうがよいです。
現状の履歴項目
日時
商品番号
商品名
棚番
区分
数量
更新後在庫
操作履歴に足りない項目
ロット管理版として考えると、現状の履歴には以下が不足しています。
ロット番号
使用期限
処理前在庫
担当者
備考
特に ロット番号 と 使用期限 が履歴に残らないのは、ロット管理版としては弱いです。
リリース版では、操作履歴を以下に拡張したほうがよいです。
A列:日時
B列:商品番号
C列:商品名
D列:ロット番号
E列:棚番
F列:使用期限
G列:区分
H列:数量
I列:処理前在庫
J列:処理後在庫
K列:担当者
L列:備考
7. 商品検索仕様
処理関数
searchByProduct()
起動タイミング
onEdit(e) により、操作パネルのB3が編集されたときに自動実行されます。
if (cell === "B3") {
searchByProduct();
return;
}
処理内容
1. 操作パネル B3 の商品番号を取得
2. 商品番号が空なら「商品番号未入力」
3. 商品マスターから該当商品を検索
4. 見つからなければ「商品なし」
5. 見つかれば以下を表示
B4:商品名
B5:ロット管理フラグ
B6:期限管理フラグ
6. メッセージに「商品表示」
商品検索時に表示される情報
商品名
ロット管理 YES/NO
期限管理 YES/NO
8. 入庫処理仕様
処理関数
nyukoRegister()
confirmStock()
現在の構造では、入庫ボタンを押しただけでは在庫更新されません。
流れは2段階です。
1. nyukoRegister() で入力チェック
2. 問題なければ B14 に IN をセット
3. confirmStock() で確定更新
入庫時の入力必須項目
商品番号
商品検索済みの商品名
棚番
入庫数量
さらに、商品マスターの設定によって以下が必須になります。
ロット管理 YES の場合:ロット番号必須
期限管理 YES の場合:使用期限必須
入庫時の禁止条件
ロット管理 NO の商品にロット番号を入れるとエラー
期限管理 NO の商品に使用期限を入れるとエラー
出庫数量が入っているとエラー
数量が数値でないとエラー
数量がマイナスだとエラー
入庫時の在庫更新
既存のロット在庫行がある場合:
累計入庫数を加算
現在庫数を再計算
既存行がない場合:
ロット在庫に新規行を追加
累計入庫数 = 入庫数量
累計出庫数 = 0
現在庫数 = 入庫数量
9. 出庫処理仕様
処理関数
shukkoRegister()
confirmStock()
出庫も2段階です。
1. shukkoRegister() で入力チェック
2. 問題なければ B14 に OUT をセット
3. confirmStock() で確定更新
出庫時の入力必須項目
商品番号
商品検索済みの商品名
棚番
出庫数量
ロット管理YESの場合:
ロット番号必須
期限管理YESの場合:
使用期限必須
出庫時の禁止条件
入庫数量が入っているとエラー
対象在庫が存在しないとエラー
出庫数量が現在庫を超えるとエラー
出庫時の在庫更新
既存のロット在庫行に対して、
累計出庫数を加算
現在庫数を再計算
します。
現在庫数は以下です。
現在庫数 = 累計入庫数 - 累計出庫数
10. バリデーション仕様
共通チェックは以下の関数で行っています。
validateCommon(actionType)
共通チェック内容
商品番号が空 → 商品番号未入力
商品名が空 → 商品未検索
棚番が空 → 棚番がありませんロット管理YES かつ ロット番号なし → ロット番号がありません
ロット管理NO かつ ロット番号あり → ロット管理NOの商品にロット番号入力期限管理YES かつ 使用期限なし → 使用期限がありません
期限管理NO かつ 使用期限あり → 期限管理NOの商品に使用期限入力数量が数値でない → 数量が数値ではありません
数量がマイナス → 数量にマイナスは不可
入庫時チェック
入庫数量が0以下 → 入庫数量がありません
出庫数量が入っている → 入庫時は出庫数量不要
出庫時チェック
出庫数量が0以下 → 出庫数量がありません
入庫数量が入っている → 出庫時は入庫数量不要
11. 現在のメッセージ一覧
操作パネルB13に表示されるメッセージは以下です。
商品番号未入力
商品なし
商品表示
商品未検索
棚番がありません
ロット番号がありません
ロット管理NOの商品にロット番号入力
使用期限がありません
期限管理NOの商品に使用期限入力
数量が数値ではありません
数量にマイナスは不可
入庫数量がありません
入庫時は出庫数量不要
出庫数量がありません
出庫時は入庫数量不要
入庫予定
出庫予定
先に入庫/出庫ボタン
商品マスターに商品なし
対象在庫なし
在庫不足
在庫更新しました
このメッセージは操作パネル型のシステムとしては分かりやすいです。
ただし、初心者向けリリース版では、もう少しやさしい表現にしてもよいです。
例:
在庫不足
↓
現在庫数より多い数量は出庫できません
商品未検索
↓
先に商品番号を入力して、商品を表示してください
12. 現状GASから見た業務フロー
商品検索
操作パネル B3 に商品番号を入力
↓
商品マスターを検索
↓
商品名・ロット管理・期限管理を表示
入庫
商品番号を入力
↓
商品情報を表示
↓
ロット番号を入力
↓
棚番を入力
↓
入庫数量を入力
↓
必要なら使用期限を入力
↓
入庫ボタン
↓
入力チェック
↓
B14 に IN
↓
確定ボタン
↓
ロット在庫を更新
↓
操作履歴を記録
↓
入力欄をクリア
出庫
商品番号を入力
↓
商品情報を表示
↓
ロット番号を入力
↓
棚番を入力
↓
出庫数量を入力
↓
必要なら使用期限を入力
↓
出庫ボタン
↓
入力チェック
↓
B14 に OUT
↓
確定ボタン
↓
対象在庫を検索
↓
在庫不足チェック
↓
ロット在庫を更新
↓
操作履歴を記録
↓
入力欄をクリア
13. 現状仕様の良い点
このGAS、土台としてはかなり良いです。
良い点1:商品マスター側でロット管理・期限管理を制御している
商品ごとに、
ロット管理する商品
ロット管理しない商品
期限管理する商品
期限管理しない商品
を分けられます。
これは実務向きです。
良い点2:ロット管理なし商品も同じ在庫テーブルで扱える
ロット管理NOの商品は、内部的に DEFAULT ロットで管理しています。
これにより、ロットあり・なしでシートを分ける必要がありません。
良い点3:棚番も在庫識別に含まれている
ロット番号だけでなく棚番も在庫キーに含まれています。
そのため、
同じ商品
同じロット
同じ使用期限
でも棚番が違う
場合は、別在庫として管理されます。
これは倉庫・棚管理では重要です。
良い点4:入庫・出庫の確定前にモードを持っている
B14に IN / OUT を入れてから確定する設計です。
誤操作を防ぎやすい構造です。
14. 現状仕様の注意点・修正候補
ここからが重要です。
リリース前にブラッシュアップするなら、以下は直したほうがよいです。
修正候補1:操作履歴にロット番号と使用期限が残らない
これは一番大きいです。
ロット管理版なのに、履歴にロット番号が残らないため、
どのロットを出庫したか
どの使用期限の商品を動かしたか
が後から追えません。
リリース版では必ず追加したほうがよいです。
修正候補2:「JAN」と「商品番号」が混ざっている
コメント上では、
B:JAN
となっていますが、実際には商品番号を記録しています。
リリース版では、どちらかに統一すべきです。
おすすめは、
商品コード
JANコード
を分けることです。
商品マスターは以下がよいです。
A列:商品コード
B列:JANコード
C列:商品名
D列:ロット管理
E列:期限管理
F列:更新日
G列:備考
ただし、現状GASを大きく変えずに行くなら、
A列:商品番号
B列:商品名
C列:ロット管理
D列:期限管理
E列:更新日
F列:備考
で統一したほうが安全です。
修正候補3:使用期限の比較が不安定
現在、使用期限の一致判定が以下です。
String(rowExpire) === String(expireKey)
日付データは、スプレッドシート側の形式やタイムゾーンでズレることがあります。
過去のGASでも日付表示問題が出ていたので、ここは要注意です。
リリース版では、使用期限を比較用に以下の形式へ正規化したほうが安全です。
yyyy-MM-dd
例:
2026-04-27
修正候補4:担当者欄がない
無料版なので必須ではありませんが、操作履歴に担当者があると実務感が上がります。
操作パネルに以下を追加してもよいです。
B15:担当者
B16:備考
ただし、無料版をシンプルにするなら担当者は後回しでもOKです。
修正候補5:出庫時に使用期限まで手入力が必要
現在は、期限管理YESの商品を出庫するときも、使用期限を入力しないとエラーになります。
つまり出庫時に、
商品番号
ロット番号
棚番
使用期限
出庫数量
を全部指定する必要があります。
正確ではありますが、初心者にはやや面倒です。
将来的には、
商品番号 + ロット番号 + 棚番
で対象在庫を表示し、使用期限は自動表示する形が理想です。
ただし、最初のリリースでは今のままでも問題ありません。
むしろ在庫を厳密に特定する仕様として説明できます。
15. スプレッドシート初期構成案
まずは現状GASに合わせるなら、以下の4シートを作れば動かせます。
シート1:操作パネル
A1:STOCKmini ロット番号管理版A3:商品番号
B3:入力欄A4:商品名
B4:表示欄A5:ロット管理
B5:表示欄A6:期限管理
B6:表示欄A8:ロット番号
B8:入力欄A9:棚番
B9:入力欄A10:入庫数量
B10:入力欄A11:使用期限
B11:入力欄A12:出庫数量
B12:入力欄A13:メッセージ
B13:表示欄A14:処理モード
B14:表示欄
ボタンは最低3つ必要です。
商品検索ボタン:searchByProduct
入庫ボタン:nyukoRegister
出庫ボタン:shukkoRegister
確定ボタン:confirmStock
ただし、商品検索はB3編集時に自動実行されるので、商品検索ボタンはなくても動きます。
シート2:商品マスター
現状GASに合わせる最小構成はこれです。
A列:商品番号
B列:商品名
C列:ロット管理
D列:期限管理
E列:更新日
F列:備考
サンプル
商品番号 | 商品名 | ロット管理 | 期限管理 | 更新日 | 備考
P001 | テスト商品A | YES | YES | | ロット・期限あり
P002 | テスト商品B | YES | NO | | ロットあり・期限なし
P003 | テスト商品C | NO | YES | | 期限あり
P004 | テスト商品D | NO | NO | | 通常在庫
ただし、NO + YES、つまりロット管理なしで期限管理ありは少し扱いに注意が必要です。
食品や消耗品ではありえますが、ロット番号なしで期限だけ管理するため、在庫識別は以下になります。
商品番号 + DEFAULT + 棚番 + 使用期限
これはGAS上は動きます。
シート3:ロット在庫
A列:商品番号
B列:商品名
C列:ロット番号
D列:棚番
E列:初回登録日
F列:使用期限
G列:累計入庫数
H列:累計出庫数
I列:現在庫数
サンプル
商品番号 | 商品名 | ロット番号 | 棚番 | 初回登録日 | 使用期限 | 累計入庫数 | 累計出庫数 | 現在庫数
最初はヘッダーのみでOKです。
シート4:操作履歴
現状GASに合わせるなら、
A列:日時
B列:商品番号
C列:商品名
D列:棚番
E列:区分
F列:数量
G列:更新後在庫
ただし、リリース版では以下を推奨します。
A列:日時
B列:商品番号
C列:商品名
D列:ロット番号
E列:棚番
F列:使用期限
G列:区分
H列:数量
I列:処理前在庫
J列:処理後在庫
K列:担当者
L列:備考
16. リリース前のおすすめ仕様
STOCKmini ロット番号管理版として出すなら、最小リリース仕様はこれでよいです。
リリース版の基本仕様
商品マスターで商品を登録する
商品ごとにロット管理YES/NOを設定する
商品ごとに期限管理YES/NOを設定する
操作パネルから商品番号で検索する
入庫時にロット番号・棚番・数量・使用期限を登録する
出庫時にロット番号・棚番・数量・使用期限を指定する
ロット在庫シートに現在庫を反映する
操作履歴に入出庫履歴を残す
リリース前に追加したい改善
優先順位をつけると、こうです。
優先度A:操作履歴にロット番号・使用期限を追加
優先度A:使用期限の日付比較を安定化
優先度A:シート見出しを仕様に合わせて確定優先度B:商品番号とJANコードの扱いを整理
優先度B:担当者・備考欄を追加
優先度B:メッセージ文言を初心者向けに調整優先度C:出庫対象ロットの検索・候補表示
優先度C:期限切れ・期限間近アラート
優先度C:先入先出の自動提案
最初の無料リリースでは、優先度Aまでで十分です。
17. このGASから見た位置づけ
このロット番号管理版は、STOCKminiシリーズの中ではかなり実務寄りです。
位置づけとしては、
STOCKmini 通常版
↓
STOCKmini 棚番版
↓
STOCKmini ロット番号管理版
↓
STOCKmini ロット・使用期限管理版
↓
アピス在庫管理システム
という流れが作れます。
マーケティング上もかなり良いです。
特に、
食品
化粧品
医薬部外品
消耗品
製造ロット管理
部品管理
賞味期限・使用期限管理
あたりに刺さります。
18. 次にやるべきこと
次はこの順番がよいです。
1. 仕様書v0.1をベースに、リリース版仕様v1.0へ修正
2. 商品マスターの列構成を確定
3. 操作履歴の列構成を拡張するか決定
4. 操作パネルのセル配置を確定
5. それに合わせてGASを微修正
6. スプレッドシート初期テンプレートを作成
ロット管理 V0.2
1. JAN表記はすべて商品番号へ統一する
2. 操作履歴にロット番号を追加する
3. 操作履歴に使用期限を追加する
4. 入庫時は、期限管理YESの商品だけ使用期限を必須にする
5. 出庫時は、使用期限入力を不要にする
6. 出庫時の使用期限は、ロット在庫シートの該当行から取得する
7. 在庫の検索キーは、商品番号 + ロット番号 + 棚番 とする
JAN は商品番号に統一
入庫時の必須項目
商品番号
ロット番号 ※ロット管理YESの場合
棚番
入庫数量
使用期限 ※期限管理YESの場合
出庫時の必須項目
商品番号
ロット番号 ※ロット管理YESの場合
棚番
出庫数量
出庫時に不要な項目
使用期限
入庫数量





コメント