どうも。つじけ(tsujikenzo)です。このシリーズでは「在庫管理バーコード」についてお届けしています。社内マニュアル的な要素が強いですが、皆さんのお勤め先でも使えるアイディアになれば幸いです。
前回のおさらい
前回は「現場棚卸とデータベースの突合作業」の前半戦として必要なデータを準備しました。具体的に言うと「現場が拾ってきたバーコードリーダーデータ」[mappedValues]と「社内在庫表データベースにあるバーコードデータ」[stockValues]の2つです。

今回はこれらを突合していきたいと思います。
リーダーが拾ってくるデータ
リーダーからのバーコードはスプレッドシートを使って商品IDと納品書番号(事情により桁数を変更しました)に分割できています(分割する関数ができあがっています)。配列[mappedValues]には、
商品ID・・・・mappedValues[i][1]
納品書番号・・mappedValues[i][2]
が格納されていました。
社内データベースのデータ
突合したい元データになる配列[stockValues]にはこのような要素が格納されていました。
商品ID・・・・stockValues[i][5]
納品書番号・・stockValues[i][10]
2つの配列の突合
ということは、
- mappedValues[i][1]がstockValues[i][5]に含まれており、
- かつmappedValues[i][2]がstockValues[i][10]に含まれていれば
良さそうです。
for文をネストすればいいんでしょうけど、配列のインデックスがマジックナンバーになってしまっているし、1レコードにつきstocksValuesを全件検索していて、野暮ったいです。。。これはどうしましょうか。
objArray化
色々考える前に、とりあえずobjArray化してから考えましょう笑。
let id = 'SSのID';
const stocksObject = SpreadsheetDataConverterToObject.getElementsArray(id,'シート1');
console.log(stocksObject);
このようなオブジェクト化配列が取得できます。(一部抜粋)
[ { No: 'No',
'品名': '品名',
'品種': '品種',
'部品ID': '部品ID',
'ID入力': 'ID入力',
'数量': '数量',
'検証': '検証',
'納品書番号': '納品書番号',
'棚卸': '棚卸' },
{ No: '',
'品名': '【1本】【12月】特別純米 1800ml',
'品種': '鬼殺し 特別純米',
'部品ID': 'JK1899',
'ID入力': 114,
'数量': 1,
'検証': '',
'納品書番号': 554907824899,
'棚卸': '' },
]
と言うことは、stocksObjectにfilterを掛けると良さそうです。
const filterdArray = stocksObject.filter(element => element['部品ID'] === 'JK1899');
このように在庫一覧表から、部品IDでフィルターを掛けた配列を準備できます。
[ { No: '',
'品名': '【1本】【12月】特別純米 1800ml',
'品種': '鬼殺し 特別純米',
'部品ID': 'JK1899',
'ID入力': 114,
'数量': 1,
'検証': '',
'納品書番号': 554907824899,
'棚卸': '' },
{ No: '',
'品名': '【1本】【12月】特別純米 1800ml',
'品種': '鬼殺し 特別純米',
'部品ID': 'JK1899',
'ID入力': 115,
'数量': 1,
'検証': '',
'納品書番号': 554907824900,
'棚卸': '' }
]
[filterdArray]にリーダーが拾ってきた下記情報が含まれるか、検索しましょう。
[mappedValues]
商品ID・・・・mappedValues[i][1]
納品書番号・・mappedValues[i][2]
んー。。。。。本当にこのまま突き進んでいいんでしょうか。。
突合アルゴリズムを考える
自分で悩みまくる前にやったこと
- ネットで調べる→以前から気になっていたアルゴリズムのサイトを再び見つけて、いつか勉強したいなぁと思った。(今やることではない)
- 社内Slackで聞いて見る→櫻庭君だけスタンプをくれたけど他は無し。
- Twitterで聞いて見る→ノンプロ研メンバーがとあるサイトを教えてくれた。結合してから検索するのが良さそう!
結果として3で教えてもらった方法が一番良さそうなのでやってみましょう。
ミニマムデータでやってみる
ちょっとObjArrayとかごちゃごちゃしてきたので、まずはミニマムデータを用意してシンプルなfunctionを作成してみようと思います。サンプルのスプレッドシートはこちら。
左側のテーブルを結合してみます。.map()メソッドで一発です。
const leftValues = SpreadsheetApp.getActiveSheet().getRange("A2:B7").getValues();
const margedValues = leftValues.map(element => [element[0] + element[1]]);
console.log(margedValues);
無事結合できてるようですね。
[ [ 'ID001123456' ], [ 'ID002123457' ], [ 'ID002123458' ], [ 'ID003123456' ],
[ 'ID999987654' ], [ 'ID001123457' ] ]
ObjArrayでもやってみます。
const objArray = SpreadsheetDataConverterToObject.getElementsArray('Sheet ID','シート1');
const mappedValues = objArray.map(element => [element['商品ID'] + element['納品書番号']]);
console.log(mappedValues);
無事結合できているようですね。(ライブラリめっちゃ便利💦)
[[ '商品ID納品書番号' ], [ 'ID001123456' ], [ 'ID002123457' ], [ 'ID002123458' ],
[ 'ID003123456' ], [ 'ID999987654' ], [ 'ID001123457' ] ]
ちょっと長くなってしまったので、今回はここまでで。
まとめ
異なるテーブルの突合をどうやったら効率がいいのか、色んなやり方があると思いますが、結論は『頑張ってググっても分からない時は、一人で悩む前に人に聞け。』でした。結合するアイディアはとても良さそうですし、結合する為のmap()メソッドや、列を移動したり誰かにシートを変更されても対応が可能なSpreadsheetDataConverterToObjectライブラリはここでも便利に働いてくれそうです。
準備が整ったので、いよいよ突合本番と突合のパーツ化をしたいと思います。
Comments