0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

スプレッドシート×GASで作る実用的なバーコード在庫管理

Posted at

はじめに
製造業で16年間、生産管理・在庫管理の現場を経験してきました。
多くの中小企業では、在庫管理システムの導入コストが高額で、結局Excelや紙での管理を続けているのが現状です。
そこで、無料で使えるバーコード在庫管理システムをGoogle Apps Script(GAS)とスプレッドシートで開発し、無料公開しました。
システム概要
スマホのカメラでバーコードを読み取るだけで、入出庫記録と在庫管理ができるシステムです。
主な機能:

スマホカメラでバーコード読み取り(HTML5-QRCode使用)
製品マスタから商品名を自動表示
入庫(+)・出庫(-)の記録
リアルタイムで在庫表を自動更新
新商品は初回スキャン時に自動で在庫表に追加
オフライン対応(Wi-Fi圏外でも使える一括登録)
Googleスプレッドシートで履歴管理

技術スタック

バックエンド: Google Apps Script
フロントエンド: HTML/CSS/JavaScript
バーコードリーダー: HTML5-QRCode library
データストア: Google Spreadsheet

現場目線で考えた実装の工夫

  1. バーコード列を文字列形式で保存
    課題:
    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;
}

}
}

  1. オフライン対応の一括登録機能
    現場の課題:
    倉庫の奥など、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);
}

  1. 読み込み速度の最適化
    課題:
    バーコードスキャンが遅いとストレスになる。
    解決策:

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とスプレッドシートを使うことで、無料で実用的なバーコード在庫管理システムを構築できました。
現場の課題を理解した上で実装することで、使いやすく継続しやすいシステムになったと考えています。
ぜひお試しください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?