スプレッドシートで在庫管理を自動化する方法

Googleスプレッドシート+GASで、専用ツールなしに在庫管理を自動化する実践的な手順を解説します。

在庫管理の手間を省きたいけれど、高価な専用システムは導入できない——そんな中小企業や個人事業主にとって、Googleスプレッドシートは強力な味方です。しかし、入力・集計を手動で行っていては本末転倒。GAS(Google Apps Script)を使えば、在庫の増減を自動追跡し、在庫不足アラートまで自動化できます。

この記事では「在庫マスタシート」「入出庫記録シート」「自動集計+アラート通知」の3点セットを、コピペで使えるGASコードとともに丁寧に解説します。初めてGASを触る方でも手順通りに進めれば1時間以内に完成できます。

この記事でできること

  • スプレッドシートで在庫数をリアルタイムに自動集計する
  • 入出庫があるたびに残数を自動更新する
  • 在庫が設定した閾値を下回ったらメールで自動アラートを受け取る
  • 月次在庫レポートをシートに自動生成する

事前準備

必要なものはGoogleアカウントのみです。以下のシート構成で新しいスプレッドシートを作成してください。

  • 在庫マスタシート:列A=商品ID、列B=商品名、列C=現在庫数、列D=最低在庫数(アラート閾値)
  • 入出庫記録シート:列A=日付、列B=商品ID、列C=区分(入庫/出庫)、列D=数量、列E=担当者

シートを作成したら、スプレッドシートのIDをメモしておきます(URLの /d/ と /edit の間の文字列)。

STEP1: 在庫マスタシートにサンプルデータを入力する

在庫マスタシートに以下のようなサンプルデータを入力して動作確認の準備をします。

商品ID  | 商品名         | 現在庫数 | 最低在庫数
P001   | ボールペン(黒)| 50      | 20
P002   | コピー用紙A4   | 10      | 30
P003   | ホッチキス針   | 200     | 50

P002のコピー用紙は意図的に在庫数を最低在庫数以下にしています。アラートのテストに使います。

STEP2: GASエディタを開いてスクリプトを作成する

スプレッドシートのメニューから「拡張機能」→「Apps Script」を開きます。デフォルトの myFunction は削除し、以下のコードを貼り付けてください。

const SS_ID = 'YOUR_SPREADSHEET_ID'; // ここをスプレッドシートIDに変更
const ALERT_EMAIL = 'your-email@example.com'; // アラート送信先

function updateStock() {
  const ss = SpreadsheetApp.openById(SS_ID);
  const masterSheet = ss.getSheetByName('在庫マスタ');
  const logSheet = ss.getSheetByName('入出庫記録');

  const masterData = masterSheet.getDataRange().getValues();
  const stockMap = {};
  for (let i = 1; i < masterData.length; i++) {
    stockMap[masterData[i][0]] = {
      row: i + 1,
      name: masterData[i][1],
      stock: masterData[i][2],
      minStock: masterData[i][3]
    };
  }

  const logData = logSheet.getDataRange().getValues();
  for (let i = 1; i < logData.length; i++) {
    const [date, itemId, type, qty, person] = logData[i];
    if (!itemId || logData[i][5] === '処理済') continue;

    if (stockMap[itemId]) {
      const delta = type === '入庫' ? Number(qty) : -Number(qty);
      stockMap[itemId].stock += delta;
      masterSheet.getRange(stockMap[itemId].row, 3).setValue(stockMap[itemId].stock);
      logSheet.getRange(i + 1, 6).setValue('処理済');
    }
  }

  checkLowStock(stockMap);
}

function checkLowStock(stockMap) {
  const alerts = [];
  for (const id in stockMap) {
    const item = stockMap[id];
    if (item.stock <= item.minStock) {
      alerts.push('【' + item.name + '】残数: ' + item.stock + ' / 最低在庫: ' + item.minStock);
    }
  }

  if (alerts.length > 0) {
    const subject = '【在庫アラート】補充が必要な商品があります';
    const body = alerts.join('\n') + '\n\n※このメールは自動送信されています';
    MailApp.sendEmail(ALERT_EMAIL, subject, body);
  }
}

STEP3: トリガーを設定して自動実行にする

GASエディタの左メニューから「トリガー」(時計アイコン)を開き、「トリガーを追加」をクリックします。設定は以下の通りです。

  • 実行する関数: updateStock
  • イベントのソース: 時間主導型
  • 時間の種類: 時間ベースのタイマー → 1時間ごと(または任意の間隔)

これで1時間ごとに入出庫記録が自動集計され、在庫不足があれば即座にメール通知が届くようになります。

STEP4: 入出庫記録シートに記録するだけで在庫が動く

日々の運用は「入出庫記録」シートへの入力だけです。以下のフォーマットで行を追加するだけで、次のトリガー実行時に在庫マスタが自動更新されます。

日付       | 商品ID | 区分 | 数量 | 担当者
2025-04-10 | P001  | 出庫 | 10  | 山田
2025-04-10 | P002  | 入庫 | 100 | 鈴木

列Fに「処理済」と自動で記録されるので、重複処理の心配もありません。

STEP5: 月次レポートを自動生成する(応用)

以下の関数をスクリプトに追加し、月次トリガー(月1回)に設定すると、毎月1日に前月分の入出庫サマリーを新シートに自動生成できます。

function generateMonthlyReport() {
  const ss = SpreadsheetApp.openById(SS_ID);
  const logSheet = ss.getSheetByName('入出庫記録');
  const now = new Date();
  const lastMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1);
  const reportName = '月次レポート_' + lastMonth.getFullYear() + String(lastMonth.getMonth()+1).padStart(2,'0');

  const reportSheet = ss.insertSheet(reportName);
  reportSheet.appendRow(['商品ID', '入庫合計', '出庫合計', '純増減']);

  const logData = logSheet.getDataRange().getValues();
  const summary = {};
  for (let i = 1; i < logData.length; i++) {
    const [date, itemId, type, qty] = logData[i];
    if (!itemId) continue;
    const d = new Date(date);
    if (d.getMonth() !== lastMonth.getMonth() || d.getFullYear() !== lastMonth.getFullYear()) continue;
    if (!summary[itemId]) summary[itemId] = { in: 0, out: 0 };
    if (type === '入庫') summary[itemId].in += Number(qty);
    else summary[itemId].out += Number(qty);
  }

  for (const id in summary) {
    const { in: inQty, out: outQty } = summary[id];
    reportSheet.appendRow([id, inQty, outQty, inQty - outQty]);
  }
  Logger.log('月次レポート「' + reportName + '」を生成しました');
}

うまくいかないときのチェックリスト

  • スクリプト内の SS_ID が正しいスプレッドシートIDになっているか確認する
  • シート名が「在庫マスタ」「入出庫記録」と完全一致しているか確認する(全角スペースや表記ゆれに注意)
  • GASの実行権限でGmailの使用を許可しているか確認する(初回実行時に許可ダイアログが出る)
  • 入出庫記録の「区分」列が「入庫」または「出庫」の全角表記になっているか確認する
  • トリガーが正常に登録されているかGASのトリガー一覧画面で確認する

応用・発展

この仕組みをベースに、以下のような発展的な機能も追加できます。Googleフォームと連携すれば、スマートフォンからのバーコードスキャン入力にも対応可能です。また、Slackと連携して在庫アラートをチームチャンネルに通知する方法は別記事で詳しく解説しています。複数拠点の在庫管理が必要な場合は、シートをタブで拠点ごとに分け、集計関数で合算する方法が効果的です。さらにAppSheetと組み合わせると、スプレッドシートのデータをモバイルアプリのUIで操作できるようになり、現場スタッフでも直感的に入出庫入力ができます。

まとめ

  • スプレッドシート+GASで、無料で本格的な在庫管理自動化が実現できる
  • 入出庫記録シートへの入力だけで在庫マスタが自動更新される
  • 在庫不足はメールで自動アラート通知されるため見落としゼロ
  • 月次レポート自動生成で棚卸し作業も効率化できる
  • Googleフォーム・Slack・AppSheetとの連携でさらに発展できる

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA