商品の注文があったのに発注を忘れていて在庫不足(欠品)となり売上をロスしてしまった、、、
こんな「もったいない」経験ありませんか?
これはかなりの後悔が残りますよね。
金銭的な利益を逃すだけでなく顧客の信用も失い顧客離れとなってしまう可能性もあります。
そのため発注忘れによる欠品は絶対に防ぎたいですよね。
発注忘れはなぜ起きる?
発注忘れが起きてしまう根本の原因は人手で行うからだと考えられます。
人手でやることでイレギュラーな業務への対応などで忙しくなると発注や在庫の確認が後回しになり忘れてしまう等が起きます。
と言うのも発注のみを担当している担当者は少なく、他にメインの業務がある中で発注作業を行うため後回しになって忘れやすくなります。
ではどうすれば良いか、
・忘れないようにリマインドするや目の付くところにメモしておく
これが手っ取り早い方法でやっている人も多いと思います。しかし、発注作業の発生が決まった間隔であるのであればこれでも良いですが、商品の注文数(在庫の減少数)に応じて発注が必要になる業種だと随時確認が必要になるため勝手が悪いように感じます。定期的に確認をするでも良いですが、確認をしても在庫が十分で発注の必要ないが何度もあると確認が面倒になり、回数を重ねるうちにまだ大丈夫と思い確認頻度が減って、結果的に発注ミスに繋がると考えられます。
ではこの発注の頻度が時間では決まっていない場合の発注忘れを防ぐにはどうするべきか、、、
今回はGoogleのスプレッドシートにGASと言う機能を連携して在庫管理をしつつ定期的に在庫を確認しなくても必要な時に発注を行える仕組みを作っていきます。(無料で作れます!)
GASとは
GAS(Google Apps Script)は、スプレッドシートやGmail、GoogleカレンダーなどのGoogle Workspaceのサービスを自動化するためのツールです。
GoogleWorkspaceのアカウントがあれば無料で利用することが出来ます。
GASを使うことで
・スプレッドシートの集計の自動化
・メールの自動送信、一括送信
・タスクやスケジュールの自動設定
ただGASの利用にはJavaScriptと言うプログラミング言語への理解が必要になります。今回はコピペ出来るコードを用意していますのでプログラミングをやったことがなくても大丈夫です。
ChatGPT等の生成AIを利用すればプログラミングへの理解が浅くても利用は可能ですが、今回の本題ではないので割愛します。
GASについてはこちらで解説をしています↓
GAS(Google Apps Script)は何が出来る?特徴や使い方を簡単解説!
どうやって解決する?
ここまで発注忘れの原因とGASについて説明をしました。
ここから本題の発注忘れを防ぐ具体的な方法を書いていきます。
原因の章に書いたように在庫の確認作業をしなくても在庫を把握しつつ適宜必要な発注を自動で知れるようにしたいです。
そこで発注が必要になったら担当者に以下のようなメールが届く仕組みを作って在庫確認をしなくても発注が必要なタイミングを把握出来るようにします。
発注点とは、在庫管理において「この在庫数を下回ったら発注をかける」と定めた発注の基準になります。
今回はこの発注点(画像の製品Aでは30)を下回ったら発注をかけると言うルールに沿って仕組みを作ります。
※発注の基準や数値は企業、取扱商品によって変わると思いますが、今回作る仕組みにおいてはある一定の基準があれば問題ありません。
このメールが届くようにすれば何度も在庫の確認をしなくても発注をするべきタイミングが自動で分かります。在庫確認のために別の業務から離れなくて良くなるので業務全体の効率アップにも繋がるのではないでしょうか。
メールの送り先を発注先に指定して自動で発注することも出来ますが、発注方法がメールではなく電話、FAX、チャットなど業界によって方法が違うと思うので、今回は幅広い企業が使えるように社内担当者へのメール通知の方法を取ります。
それではこのメールが届く仕組みの作り方を紹介していきます。
在庫管理シートの用意
まずは在庫数を管理するシートを用意します。
必要なシートは
①在庫数を管理するシート
②出荷や入荷を入力するシート
項目は例として入れているので自社に合った内容、形で作成して問題ありません。
この2つのシートを使って以下のような動作をするようにしていきます。
①入出荷を入力するシートに「製品名」「入荷or出荷」「個数」を入力する
②自動で在庫管理シートに「入荷」だったら「個数分」プラス、「出荷」だったら「個数分」マイナスされる
③マイナスをして在庫数が発注点を下回ったらメールが担当者に自動で送られる
この②③を自動化する仕組みを作っていきます。
GASを使って自動化構築(コピペでOK)
シートと作っていきたい形の構想が出来たら本題のGASとの連携です。
まずはGASを開くために連携をしたいスプレッドシートで上部にあるツールバーの
①拡張機能をクリック
②AppsScriptをクリック
そうすると無題のプロジェクトと言うタイトルでGASのページが開きます。
灰色のエリアに入力をしていくのですが、すでにfunction~~と書いてあると思います。この文字は全て消します。
文字を消したら以下のコードをコピーして貼り付けます。
function start(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var sheetName = sheet.getName();
if (sheetName == '入出庫履歴') {
var changeType = e.changeType;
Logger.log('Change type: ' + changeType);
if (changeType == 'EDIT' || changeType == 'INSERT_ROW' || changeType == 'INSERT_COLUMN') {
var range = e.range;
if (range) {
var lastRow = range.getLastRow();
Logger.log('Last row: ' + lastRow);
updateInventory(lastRow); // 最後に追加された行を処理
} else {
var lastRow = sheet.getLastRow();
Logger.log('Last row: ' + lastRow);
updateInventory(lastRow); // シートの最後の行を処理
}
}
}
}
function updateInventory(row) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var logSheet = ss.getSheetByName('入出庫履歴');
var inventorySheet = ss.getSheetByName('在庫');
var itemName = logSheet.getRange(row, 3).getValue(); // 商品名
var transactionType = logSheet.getRange(row, 4).getValue(); // 入荷or出荷
var quantity = logSheet.getRange(row, 5).getValue(); // 数量
Logger.log('itemName: ' + itemName);
Logger.log('transactionType: ' + transactionType);
Logger.log('quantity: ' + quantity);
var inventoryData = inventorySheet.getDataRange().getValues();
for (var i = 1; i < inventoryData.length; i++) {
if (inventoryData[i][1] == itemName) { // 商品名が一致する行を探す
var currentStock = inventoryData[i][3];
var orderPoint = inventoryData[i][5];
Logger.log('currentStock before: ' + currentStock);
if (transactionType == '入荷') {
currentStock += quantity;
} else if (transactionType == '出荷') {
currentStock -= quantity;
}
Logger.log('currentStock after: ' + currentStock);
Logger.log('orderPoint: ' + orderPoint);
inventorySheet.getRange(i + 1, 4).setValue(currentStock);
if (currentStock <= orderPoint) {
Logger.log('Sending email for item: ' + inventoryData[i][1]);
sendReminderEmail(inventoryData[i][1], currentStock, orderPoint, inventoryData[i][6]); // 商品名、現在の在庫数、発注点、発注先
}
break;
}
}
}
function sendReminderEmail(itemName, currentStock, orderPoint, orderContact) {
var emailAddress = 'メールアドレス①,メールアドレス②,メールアドレス③'; // ここに通知を送りたいメールアドレスを入力
var subject = '発注が必要です: ' + itemName;
var message = '商品名: ' + itemName + '\n現在の在庫: ' + currentStock + '\n発注点: ' + orderPoint + '\n発注先: ' + orderContact;
MailApp.sendEmail(emailAddress, subject, message);
Logger.log('Email sent to: ' + emailAddress);
}
貼り付けをしたら
①下にスクロールをして66行目のメールアドレスを発注担当者など発注が必要になったら通知を送りたい人のアドレスにしましょう。通知は複数に送れます。アドレスごとに半角の「,」で区切ります。
この時にメールアドレスと「,」以外を消さないように注意してください。特に最初のアドレスの前と最後のアドレスの後ろにある「’」に注意してください。
②メールアドレスを入力したら画面上部のフロッピーマークをクリックして保存します。
これで完成です。
正しく動作するか確認のために保存ボタンの横にある「実行」をクリックしてみて画面の下側に実行完了と出れば問題なく設定が出来ています。(「実行」をクリックしたら「承認が必要です」と出たら本記事の下に行ってください。)
スプレッドシートにも入力をしてメールが届くかも試してもらえたらと思います。
「承認が必要です」と出た場合の進め方
初めてGASを使うと「承認が必要です」と言うポップアップが出る場合があるので以下の手順で承認をします。
①「権限を確認」をクリック
②作成をしているGoogleアカウントをクリック
③「詳細」をクリック
④「無題のプロジェクト(安全ではないページ)に移動」をクリック
⑤「許可」をクリック
これで承認は完了です。
まとめ
そして以上がスプレッドシートとGASを使って発注忘れを防ぐ方法です。
在庫確認の手間を排除して必要があればメールで通知が届くようにしたことで、確認漏れや発注作業を忘れるのを防ぐ仕組みを作りました。
しかし、確認の手間を省いただけで発注自体は人手が必要ですし、そもそもスプレッドシートへの入力がされなかったり間違っていたりすると今回の仕組みは適切に機能しなくなります。またシートの項目や通知内容をもっと自社の業務内容に合わせたいがコードの変更方法が分からないなどの課題もあると思います。
なので、もっと正確で効率よく業務を進める仕組みを作りたい、自社の業務に柔軟に対応させつつ会社全体の生産性を上げたいなどを行っていきたい方は「お問い合わせ 」
よりお気軽にご相談ください。
GoogleWorkspaceをベースに柔軟かつ効率的な仕組みづくりをお手伝いをいたします。
コメント