はじめに
最近ですが、LINEでやり取りするトランザクションデータをデータベースではなく、ユーザのスプレッドシートで直接管理することを推してます。
メリットとしてはこんな感じです。
1. サービス内でデータを保持しないということは、データ保持の責任リスクを軽減できる
2. ユーザに馴染みのあるExcel形式であり、スプレッドシートの機能で可視化できるのでデータ分析もしやすい
このメリットを活かすサービスとして、家計簿アプリを作りました。
家計簿アプリについて
コンセプト
- 後で家計簿に書こうとしても、ついつい忘れてしまう。なので、モバイルアプリで買ったその場で登録!!
- それでも人間は忘れてしまう。そんな時は、モバイルアプリでちまちま登録せず、PCでまとめて登録しよう!!
- 使い慣れたExcel形式だから、自分の好きなようにデータ分析もできる!!
一応、以前作ったプレゼンですが、こちらでもコンセプトを語ってます。
今回の改良点
今までは単純に買ったものをスプレッドシートに書き込むだけでした。
巷でこんな声を聞きました。
「買い物してたら、ついつい買いすぎちゃって、月の生活費の予算を超えちゃったわ」
・・・なるほど。
じゃあ、月のトータル金額が見れるようにしましょう。
サーバー環境
サーバサイドはNode.jsで作っており、スプレッドシートの操作は以下のモジュールを使ってます。
google-spreadsheet
※Githubにも全ソースを上げてますが、以下のソースコードはQiitaに載せるにあたって分かりやすくするためにGithubのソースコードとは多少異なります。
まずは月の集計金額を出す必要があるので、query関数をスプレッドシートに書き込んでます。
let doc = new GoogleSpreadsheet(sheetId);// スプレッドシートIDを指定
// 認証関連のコードは省略します(※そのうちQiitaに記事書きます)
// スプレッドシート(doc)から、対象のシート(sheet)を取得したところから書きます。
// query関数を書き込むセルの指定
await sheet.loadCells('F1');
let cell = sheet.getCellByA1('F1');
// 関数を書き込む際は「formula」を使います。
cell.formula = `=query(A:C,"select B,sum(C) where B is not null group by B label B 'sum 買ったもの'",1)`;
sheet.saveUpdatedCells();
これだけではツマラナイので、グラフも入れて分かりやすくしてみます。
とはいえ、スプレッドシートの関数でグラフ化ができるのは今のところ少ないようです。
※本当は円グラフを使いたかったのですが、関数ではできないようなので棒グラフにしてみました。
// for文でぐるぐる回して、SPARKLINE関数を使って棒グラフを追加してます
for (let i = 2; i <= index; i++) {
await sheet.loadCells(`H${i}`);
let cell = sheet.getCellByA1(`H${i}`);
cell.formula = `=SPARKLINE(G${i}, {"charttype","bar";"max",MAX(G:G)})`;
sheet.saveUpdatedCells();
}
sheet.saveUpdatedCells();
今後の改良点
実は、買ったもの(商品名)で集計しているので、例えば「生活費」みたいなカテゴリで集計する形にはまだなってません。
今度はその辺りを直したいと思ってます。
最後に
今回は改良した部分を中心に記事を書きましたが、そもそもユーザのスプレッドシートに書き込むための設定方法については書いてません。
次回はその辺りを書きたいと思います。