GASでSpreadsheetApp.getActiveSheetを使った在庫管理システム構築

GASでSpreadsheetApp.getActiveSheetを使った在庫管理システム構築

本記事では、Google Apps Script(GAS)とSpreadsheetApp.getActiveSheetメソッドを使用して、在庫管理システムを構築する方法について解説します。在庫管理は、企業が効率的に運営するために不可欠な業務であり、GASを活用することで、手動での管理作業を自動化し、時間とコストを削減することができます。

SpreadsheetApp.getActiveSheetとは

SpreadsheetApp.getActiveSheet()は、現在アクティブなスプレッドシートのシートを取得するためのGASのメソッドです。このメソッドを使用することで、特定のシート名を指定せずに、現在開いているシートを操作することができます。

// 現在アクティブなシートを取得
function getActiveSheet() {
const sheet = SpreadsheetApp.getActiveSheet();
Logger.log(sheet.getName()); // シート名を表示
}

在庫管理システムの概要

今回構築する在庫管理システムは、以下の機能を持つことを想定しています。

  • 商品情報の登録・更新
  • 入庫・出庫の記録
  • 在庫数の自動計算
  • 在庫状況の可視化

これらの機能をGASとスプレッドシートで実現します。

在庫管理システムの実装

1. スプレッドシートの準備

まず、在庫管理用のスプレッドシートを作成します。以下のシートを作成し、それぞれに必要な項目を設定します。

  • 商品マスタ:商品ID、商品名、単価などを登録
  • 入庫リスト:入庫日、商品ID、入庫数などを記録
  • 出庫リスト:出庫日、商品ID、出庫数などを記録
  • 在庫状況:商品ID、商品名、在庫数などを表示(自動計算)

2. GASコードの実装

次に、GASコードを記述して、在庫管理機能を実装します。

2.1. 入庫処理

入庫リストに新しい入庫情報を追加する関数を作成します。

// 入庫処理
function recordArrival(productId, quantity) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('入庫リスト');
const date = new Date();
sheet.appendRow([date, productId, quantity]);
updateInventory(productId);
}

2.2. 出庫処理

出庫リストに新しい出庫情報を追加する関数を作成します。

// 出庫処理
function recordDeparture(productId, quantity) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('出庫リスト');
const date = new Date();
sheet.appendRow([date, productId, quantity * -1]); // 出庫数は負の数で記録
updateInventory(productId);
}

2.3. 在庫更新処理

入庫・出庫があった場合に、在庫数を自動的に更新する関数を作成します。

// 在庫更新処理
function updateInventory(productId) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const arrivalSheet = ss.getSheetByName('入庫リスト');
const departureSheet = ss.getSheetByName('出庫リスト');
const inventorySheet = ss.getSheetByName('在庫状況');

// 入庫数の合計を計算
const arrivalData = arrivalSheet.getDataRange().getValues();
let arrivalQuantity = 0;
for (let i = 1; i < arrivalData.length; i++) { // 1行目はヘッダーのためスキップ
if (arrivalData[i][1] == productId) {
arrivalQuantity += arrivalData[i][2];
}
}

// 出庫数の合計を計算
const departureData = departureSheet.getDataRange().getValues();
let departureQuantity = 0;
for (let i = 1; i < departureData.length; i++) { // 1行目はヘッダーのためスキップ
if (departureData[i][1] == productId) {
departureQuantity += departureData[i][2];
}
}

// 現在の在庫数を計算
const currentInventory = arrivalQuantity + departureQuantity;

// 在庫状況シートを更新
const productMasterSheet = ss.getSheetByName('商品マスタ');
const productData = productMasterSheet.getDataRange().getValues();
let productName = '';
for (let i = 1; i < productData.length; i++) {
if (productData[i][0] == productId) {
productName = productData[i][1];
break;
}
}

// 在庫状況シートに書き込む(既存の在庫を更新するか、新規に書き込む)
const inventoryData = inventorySheet.getDataRange().getValues();
let updated = false;
for (let i = 1; i < inventoryData.length; i++) {
if (inventoryData[i][0] == productId) {
inventorySheet.getRange(i + 1, 1).setValue(productId);
inventorySheet.getRange(i + 1, 2).setValue(productName);
inventorySheet.getRange(i + 1, 3).setValue(currentInventory);
updated = true;
break;
}
}
if (!updated) {
inventorySheet.appendRow([productId, productName, currentInventory]);
}
}

3. メニューの追加

スプレッドシートにカスタムメニューを追加し、入庫・出庫処理を簡単に実行できるようにします。

// メニューの追加
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('在庫管理')
.addItem('入庫', 'showArrivalDialog')
.addItem('出庫', 'showDepartureDialog')
.addToUi();
}

// 入庫ダイアログを表示
function showArrivalDialog() {
const html = HtmlService.createHtmlOutput('

');
SpreadsheetApp.getUi().showModalDialog(html, '入庫処理');
}

// 出庫ダイアログを表示
function showDepartureDialog() {
const html = HtmlService.createHtmlOutput('

');
SpreadsheetApp.getUi().showModalDialog(html, '出庫処理');
}

よくある問題とトラブルシューティング

  • シート名の間違いgetSheetByNameで指定するシート名が間違っていると、シートを取得できません。
  • 権限の問題:GASの実行には、スプレッドシートへのアクセス権が必要です。
  • データ型の不一致:スプレッドシートに書き込むデータの型が間違っていると、エラーが発生することがあります。

カスタマイズ方法と応用例

  • UIの改善:HTML Serviceを使用して、より洗練されたUIを作成することができます。
  • バーコードリーダーとの連携:バーコードリーダーで読み取った情報をGASで処理し、入庫・出庫処理を自動化することができます。
  • API連携:外部の在庫管理システムと連携し、データを同期することができます。

まとめ

GASとSpreadsheetApp.getActiveSheetメソッドを活用することで、簡単に在庫管理システムを構築することができます。この記事を参考に、自社の業務に合わせた在庫管理システムを構築し、業務効率化を実現してください。