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