SaikaColorTechBlog

渋谷のITベンチャー企業から中小企業に転職したエンジニアの話

業務システムとスプレッドシートの連携

この記事で弊社で動いているシステムについてざっくりと概要は把握できるようになりました。

 

もちろんこのシステムは現役バリバリで利用されているようですが、機能追加や修正の要望はだしても外注先が忙しいようでなかなか対応してもらえないようです。

営業からの要望

既存のシステムの受注・生産管理において、製造予定の情報を持たせることができないため、受注した商品がいつ頃製造されるのかを知るためには製造に問い合わせをしないとわからず苦労しているとのこと。

製造側の課題

製造のスケジュールは予定しているものに加えて、差し込みもあるため、1週間のスケジュールは週に何回か変更があり、製造全体のスケジュールを把握しているのは製造のマネージャーだけという状態でした。

この状態だとマネージャーが急遽出社できないような場合に、製造全体が機能停止してしまうためあまり健全とは言えず、製造全体のスケジュールを事前に共有するための方法が必要でした。

初期対応

既存のシステムに対してこちらの方で手を入れてしまうというのも一つの方法ではありますが、外注先の運用保守の対象外になるので何かあった時に面倒です。

以前導入したG Suiteのスプレッドシートで受注情報を営業側で入力し、製造側でその受注に対する生産予定を入力する製造予定表を作成して、営業・製造事務で閲覧・編集できるようにしてやりました。

f:id:bryan_f:20190314161504p:plain

また、製造予定日等が変更された場合は、変更されたこととその内容を営業・製造双方が把握しておく必要があります。これまでは、それらの情報は電話で行われていましたが、以前導入したSlackが使われるようになってきているので、変更を検知したいカラムの値が更新された場合は、Slackで変更内容を通知する仕組みをGASで作成してやりました。

f:id:bryan_f:20190314162451p:plain

これらの初期対応によって、営業側の要望と製造側の課題はある程度解決することができるようになりました。

初期対応の課題

生産予定表は営業が入力した受注に対して、製造がその製造予定を入力する形式となっています。

受注情報は既存の業務システムにも入力していることから、生産予定表ができたことによって受注情報を業務システムとスプレッドシートの双方に手動で入力する手間が増えてしまいました。また受注情報における受注数量や納期といった情報も度々変更されるため、その場合にも都度、業務システムとスプレッドシートを更新する必要があります。

このようなデータの二重管理はそのうちデータの不整合が発生し、どっちのデータが正しいのかわからなくなってしまうため、早めに対処してやるべきです。

業務システムとの連携

受注情報は業務システムに入力されることが前提となっているため、業務システムに入力された受注情報を正とし、その情報に紐づける形で製造予定を入力できるようにしてやることにしました。

ただ先にも述べた通り、業務システム自体に手を入れると面倒なので、製造予定表のスプレッドシートに、業務システムのDBから取得した受注情報を流し込む形で実現することにしました。

f:id:bryan_f:20190314172135p:plain

バッチは、sqlcmdで生産予定表に必要なデータをCSVで取得しG Suiteのドライブにアップロードします。アップロード処理はPythonで実装しライブラリにPyDriveを利用しました。

バッチはタスクスケジューラで5分ごとにデータの取得・アップロードを行います。

 

アップロードはドライブ上にファイルのIDを指定し、CSVスプレッドシートに変換してアップロードを行います。

f = drive.CreateFile({
  'id': 'xxxxxxxxxxxxxxxxxx',
  'title': 'hoge.csv',
  'mimeType': 'text/csv'
})
f.SetContentFile('hoge.csv')
f.Upload({'convert': True})

この際、Google Drive APIの方でエラーが吐かれていたのですが、アップロードするCSV文字コードが原因でした。

sqlcmdで生成されたCSVエンコードはCP932なのですが、アップロード前にnkfUTF-8エンコードしてからアップロードすることでエラーが出なくなるようになりました。

生産予定表の方はIMPORTRANGE()で受注情報を引っ張ってきているのですが、元のシートが更新されても反映までにラグが多少あるようです。

バッチの実行間隔が5分、受注情報から生産予定表への反映へのラグで最大で10分程度、業務システムから生産予定表への反映に時間がかかっている状態ではありますが、一旦これで受注情報の二重管理状態が無事解消されるようになりました。よかった。

今後

生産予定が入力できるようになったのですが、製造予定はそれなりの頻度で差し込みが発生し、生産予定の変更がされます。

差し込みが発生するとその後に控える予定が全て後ろ倒しに変更されることになり、生産予定の変更箇所が多いため入力負荷が高くなっています。

入力が面倒になってくると使われなくなってしまい、結局元の状態になってしまうためなんとかしたいところです。

差し込みや後ろ倒しであれば機械的に一括でスケジュールを変更するインターフェースがあればこの辺の問題は解消できそうなので次はそこらへんに手をつけていきたいなと考えています。