はじめに
製造業で16年間、生産管理・在庫管理の現場を経験してきました。
多くの中小企業では、在庫管理システムの導入コストが高額で、結局Excelや紙での管理を続けているのが現状です。
そこで、無料で使えるバーコード在庫管理システムをGoogle Apps Script(GAS)とスプレッドシートで開発し、無料公開しました。
システム概要
スマホのカメラでバーコードを読み取るだけで、入出庫記録と在庫管理ができるシステムです。
主な機能:
スマホカメラでバーコード読み取り(HTML5-QRCode使用)
製品マスタから商品名を自動表示
入庫(+)・出庫(-)の記録
リアルタイムで在庫表を自動更新
新商品は初回スキャン時に自動で在庫表に追加
オフライン対応(Wi-Fi圏外でも使える一括登録)
Googleスプレッドシートで履歴管理
技術スタック
バックエンド: Google Apps Script
フロントエンド: HTML/CSS/JavaScript
バーコードリーダー: HTML5-QRCode library
データストア: Google Spreadsheet
現場目線で考えた実装の工夫
- バーコード列を文字列形式で保存
課題:
JANコードなどのバーコードは13桁の数値ですが、スプレッドシートに普通に入力すると:
先頭の0が消える(0123456789012 → 123456789012)
長い数値が科学的記数法に変換される(4901234567890 → 4.90123E+12)
解決策:
初期設定時に列を文字列形式(@STRING@)に変換する関数を実装。
javascriptfunction initialSetup() {
const ss = SpreadsheetApp.openById(SHEET_ID);
// 製品マスタのバーコード列を文字列形式に
const masterSheet = ss.getSheetByName('製品マスタ');
masterSheet.getRange("A:A").setNumberFormat("@STRING@");
// 在庫表のバーコード列を文字列形式に
const inventorySheet = ss.getSheetByName('在庫表');
inventorySheet.getRange("A:A").setNumberFormat("@STRING@");
}
これにより、ユーザーは先頭に'をつけることなく、普通に数値を入力できます。
2. 新商品の自動在庫表登録
現場の課題:
新商品を追加するたびに、製品マスタと在庫表の両方にデータを入力するのは手間。
解決策:
製品マスタに登録さえすれば、初回スキャン時に在庫表へ自動追加。
javascriptfunction updateInventory(barcode, quantity) {
const ss = SpreadsheetApp.openById(SHEET_ID);
const inventorySheet = ss.getSheetByName('在庫表');
const masterSheet = ss.getSheetByName('製品マスタ');
// 在庫表で検索
// ... (省略)
// 見つからなかった場合、製品マスタから情報取得して自動追加
const masterData = masterSheet.getRange(2, 1, masterSheet.getLastRow() - 1, 3).getValues();
for (let i = 0; i < masterData.length; i++) {
if (masterData[i][0] === barcode) {
const productCode = masterData[i][1];
const productName = masterData[i][2];
// 在庫表に新規追加
const newRow = inventorySheet.getLastRow() + 1;
inventorySheet.getRange(newRow, 1, 1, 5).setValues([[
barcode, productCode, productName, "", quantity
]]);
return;
}
}
}
- オフライン対応の一括登録機能
現場の課題:
倉庫の奥など、Wi-Fi圏外で作業することも多い。
解決策:
スキャンしたデータをブラウザのメモリに一時保存
Wi-Fi圏内に戻ったら「一括登録」ボタンでまとめて送信
javascriptlet barcodeArray = []; // ブラウザ内に一時保存
function addToList() {
const qty = parseInt(document.getElementById('quantity').value);
barcodeArray.push({
barcode: lastBarcode,
productName: lastProductName,
quantity: qty
});
updateList();
}
function batchRegister() {
google.script.run
.withSuccessHandler((result) => {
barcodeArray = []; // 登録後にクリア
updateList();
})
.addBarcodesBatch(barcodeArray);
}
- 読み込み速度の最適化
課題:
バーコードスキャンが遅いとストレスになる。
解決策:
HTML5-QRCodeのfps(frames per second)を最適化。
javascripthtml5QrCode.start(
{ facingMode: "environment" },
{
fps: 10, // 読み込み速度とバッテリー消費のバランス
qrbox: { width: 400, height: 200 }
},
onScan
);
主要コード
GAS側(バックエンド)
javascript// 品名取得
function getProductName(barcode) {
const ss = SpreadsheetApp.openById(SHEET_ID);
const masterSheet = ss.getSheetByName('製品マスタ');
const lastRow = masterSheet.getLastRow();
if (lastRow < 2) return 'マスタなし';
const data = masterSheet.getRange(2, 1, lastRow - 1, 3).getValues();
const barcodeStr = String(barcode).trim();
for (let i = 0; i < data.length; i++) {
if (String(data[i][0]).trim() === barcodeStr) {
return data[i][2]; // C列(品名)を返す
}
}
return 'バーコードデータがありません';
}
// スキャン履歴に登録 + 在庫更新
function addBarcodeWithQuantity(barcode, quantity) {
const ss = SpreadsheetApp.openById(SHEET_ID);
const sheet = ss.getSheetByName('スキャン履歴');
const now = new Date();
const newRow = sheet.getLastRow() + 1;
const formula = =IFERROR(VLOOKUP(B${newRow},'製品マスタ'!A:C,3,0),"バーコードデータがありません");
sheet.getRange(newRow, 1, 1, 4).setValues([[now, barcode, quantity, formula]]);
// 在庫表を更新
updateInventory(barcode, quantity);
return "登録完了";
}
HTML側(フロントエンド)
html
バーコードスキャナー
カメラ起動デモ・ダウンロード
実際に動作するテンプレートを無料で配布しています。
ダウンロード:
https://docs.google.com/spreadsheets/d/1V8bfKntopn85tRWzL0hZpVd-jDZ6tCPPF3TzcMBUVi0/copy
セットアップマニュアル:
https://docs.google.com/document/d/1hVaVduehDS-tS2zf-ilVf3N-ONcb1TQ7W0SAHFUpWIE/edit?usp=sharing
カスタマイズ・導入サポート
業務フローに合わせたカスタマイズや、導入サポートも承っております。
Manufacturing DX Lab
https://manufacturing-dx-lab-hp.vercel.app/
まとめ
Google Apps Scriptとスプレッドシートを使うことで、無料で実用的なバーコード在庫管理システムを構築できました。
現場の課題を理解した上で実装することで、使いやすく継続しやすいシステムになったと考えています。
ぜひお試しください!