Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

Ruby gem XlsFunction を OSS として公開しました

こんにちは。福岡開発拠点で クラウド債務支払 および クラウド経費 の開発をしている中久喜と申します。

今回は社内で開発した gem XlsFunction を OSS として公開いたしましたので、その紹介をさせていただきます。

XlsFunction とは

Ruby で Excel の関数をエミュレートすることができます。

func = 'SUBSTITUTE("マネーフォワード", "マネー", "ライフ")'
XlsFunction.evaluate(func)
# => "ライフフォワード"

func = 'ROUNDDOWN(100 / 3 * 2, 2)'
XlsFunction.evaluate(func).to_s('F')
# => "66.66"

まだまだほとんどの関数を実装できていませんが、文字列操作の関数を中心に実装を進めています。

開発の経緯

クラウド債務支払やクラウド経費において、ユーザーの利用する会計システムとの連携は欠かせない機能ですが、 連携するシステム向けに値を加工したいシナリオは割とあります。

例えば、会社内で特定の意味をもたせたコードを部門コードとして割り振っている会社があるとします。

  • 開発部:部門コード = A_D_0001
  • 営業部:部門コード = A_S_0002
  • 経理部:部門コード = B_A_0003

このとき経費の費用負担部門のコードがAで始まる場合 1、それ以外なら 2 を出力できるようにしたいという要望があった場合、 実現するためにはエンジニアの作業が必要でした。

従来の手法

そこそこの頻度で発生する上記のような要望に対して、エンジニアは目的の値を取り出す Ruby スクリプトを個別に実装し、それを出力処理の中で実行させることで解決を図っていました。 クラウド債務支払及びクラウド経費は Ruby on Rails を利用して作られていますが、Ruby ではその言語の自由さから安全な Sandbox 環境を用意するのはなかなか難しいとされています。 そのため、予め許可した Ruby スクリプトと完全一致するもののみ実行できる、という仕組みにしていました。 これはホワイトリストと呼ばれ、下記のように yaml で管理されていました。

運用を続けていくうちにこのホワイトリストは優に300行を超え、厳しさを増していきました。 要望が発生するたびに、実装依頼が生まれ、実装をしてリリースされるまでユーザーは欲しい値を得られない。 Speed に欠け、 UserFocus できていない状態でした。

新たな手法

たとえ安全な Sandbox 環境ができたとしても、非エンジニアであるコンサルチームやユーザー自身が Ruby スクリプトを書くのは現実的でなく、どうしてもエンジニアが介入せざるをえません。 そこで考えた解決方法が、Excel の関数をエミュレートすることでした。 Excel の関数を扱えるビジネスパーソンはそれほど珍しくないし、学習情報もWeb上にたくさんあります。 Excel の関数と同じ動きをする実行環境を作り、それを利用して値を加工することができれば、簡単な加工であればエンジニアを介することなく、ユーザーが自分で欲しい値を手にすることができる世界が実現できそうです。 そう思い立ってから Excel 関数を評価する Parser を Ruby で書き始め、XlsFunction は生まれました。 上記の例では、 IF(LEFT("${部門コード}", 1) = "A", 1, 2) と式を書くことで実現できるようになりました。 ※クラウド債務支払・クラウド経費では ${} で式中に値を展開する仕組みが別途用意されています。

それはいうならば、大車輪の再発明、とでも言えるもしれません。 しかしこの機能をクラウド債務支払及びクラウド経費に搭載したことで、結果的には従来よりもユーザーに素早く価値を届けることができるようになりました。 平均して月20時間ほど開発で消費していた時間を削減できました。 あわせてホワイトリストを利用するケースは激減しました。 開発メンバーとコンサルチームで協力して、良い業務改善ができたと思っています。

現状ユーザーが直接この機能に触れることは無く、主に導入時のコンサルチームによってユーザーの要望にあわせた関数が作られており、開発エンジニアがこのために手を動かす機会は減っています。 ゆくゆくはユーザーが直接利用できる世界を目指しています。

最後に

以上の経緯により生まれた gem ですが、冒頭でも述べた通りまだまだ未実装の関数がありますし、OSS として公開することで この gem にもいろんな可能性が広がっていくと嬉しいです。 皆様の Contribute をお待ちしております。


マネーフォワード福岡拠点では

  • UserFocus のためなら車輪の再発明も厭わない
  • 製販一体となって顧客に価値を届けることが好き

そんな価値観を持ったエンジニアを募集しています。

株式会社マネーフォワード 福岡 の求人一覧

福岡開発拠点のサイトもあるのでぜひみてください!

マネーフォワード 福岡開発拠点


マネーフォワードでは、エンジニアを募集しています。 ご応募お待ちしています。

【会社情報】 ■Wantedly株式会社マネーフォワード福岡開発拠点関西開発拠点(大阪/京都)

【SNS】 ■マネーフォワード公式noteTwitter - 【公式】マネーフォワードTwitter - Money Forward Developersconnpass - マネーフォワードYouTube - Money Forward Developers