見出し画像

バックオフィスマンがスタートアップに入って取り組んだtechらしいことの軌跡

この記事はKanmu Advent Calendar 2019 22日目の記事です。

こんにちは。カンム のnori3です。2018年8月に財務経理マネジャーとして入社し、1年強が過ぎました。

大学は文系学部、前職は金融機関のバックオフィスで、エンジニアらしさと言えばちょっと Progate をかじっていたぐらいだったのですが、入社前の段階で「カンムの経理やってくには数字出すのにいちいちエンジニアの力借りるようではダメだから、簡単なプログラミングはやってもらうよ」と言われていました。

画像5

本記事はそんなところからスタートし、これまでにカンムで取り組んできたtechらしいことをまとめたものです。なお、記事の最後に「リストからランダムにn個を選んでslackに投稿する」GASのスクリプトを載せているので、よかったら使ってください。

1. SQL (PostgreSQL) & Redash
2. GAS (Google Apps Script)
3. その他サービス

SQL

入社して最初にそれらしいものに触れたのは、SQL でした。バンドルカードのトランザクションを経理処理するために数字を引っ張ってくるのに使ったりします。カンムでは redash を使って PostgreSQL を書きます。Progate やってたのと、 スパルタンSQL のおかげで割とスムーズに入れたと思います。とは言え、のクエリを見ると未だに?が大量に浮かんだりしますが。。。

画像6

GAS

次に触れたのは GAS です。カンムには Kanmu Tech Day という、職種に依らずテクノロジーを使ってプロセスを効率化するか、さもなければ楽しいことをするという日が毎月あり、ここでいくつかのスクリプトを書きました。そのうちの1つを紹介します。

当時、ランチでどこに行くかを Slackbot によるルーレットで決めていたのですが、回したところで ①誰が乗っかるかわからない、②ルーレットが気分に合わないと萎える という問題がありました。

画像1

そこで自分が取り組んだのが、slack 連携アプリとGASの利用でした。①については lunchbox で解消しました。アプリを slack にインストールすると、新たなスラッシュコマンドが打てるようになります。lunchboxの場合は

/lunch at A, B, C at 12:30

​と打つと

画像2

このように表示され、スタンプで参加希望を募れます。

次に②について、リストからランダムに3件選んで投稿する機能をつけようと考え、これをGASで実現しました。

画像3

実は3件投稿できるようになった後もサムネイルがうまく表示されず一悶着あったりしたのですが、それは後に貼ったコードを見てもらうと苦戦の跡を確認できます。ちなみに現在では Slack の Workflow 機能を利用して更に省力化し、はらへりスタンプを押すとWorkflowがGASのフックワードを投稿してくれるようにしています。また、GASのコード自体も hiroakis によるスパルタンGASのおかげでレベルアップしています。

画像4

その他サービス

上記の他、メールから正規表現で抽出したデータをGoogleスプレッドシートに蓄積したり(GAS)、zapier 使って KPT 用の Trello に自動でリスト追加させたり、Googleスプレッドシートのデータを redash で加工したり、BigQuery に首を突っ込んだり、といったことをやっています。


というわけで、カンムでは記事になっているとおりpythonを操るCFOがいるぐらいで、凄腕エンジニア勢によるサポートを得られる恵まれた環境の中で、プログラミングリテラシーゼロからでも少なくとも簡単なSQLは書けるようになります。また、さらなるチャレンジを称賛し、支援する文化があるので、どんな職種の方でも成長機会を得られる会社です。ぜひ一緒にチャレンジしてもらいたいと思います。

最後に記事の締めとしてランチの機運ルーレットのコード(新旧)を貼っておきますので、よかったら参考にしてください。

最初に書いたコードがこちら。

function getSheet(){
 var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/(略)"); 
 var Sheet = ss.getSheetByName('kiun'); 
 return Sheet;
}

function lastRow(){
 var Sheet = getSheet();
 var lastrow = Sheet.getLastRow();
 return lastrow;
}

function getData(){
 var Sheet = getSheet();
 var lastrow = Sheet.getLastRow();
 var SheetData = Sheet.getSheetValues(1, 1, lastrow, 2);
 return SheetData;
}

function random(){
 var Sheet = getSheet();
 var lastrow = lastRow();
 var row1 = Math.floor(Math.random() * lastrow);
 var row2 = Math.floor(Math.random() * lastrow);
 if ( row2 == row1 ){
 var row2 = Math.floor(Math.random() * lastrow);
 }
 var row3 = Math.floor(Math.random() * lastrow);
 if ( row3 == row1 || row3 == row2 ){
 var row3 = Math.floor(Math.random() * lastrow);
 }
 return row1, row2, row3;
}

function kiun(){
 var SheetData = getData();
 var row1 = random();
 var row2 = random();
 var row3 = random();
 var Dining1 = SheetData[row1][0];
 var Dining2 = SheetData[row2][0];  
 var Dining3 = SheetData[row3][0];  
 var result = "今日のランチ候補は \n A『 " + Dining1 + " 』\n B『 " + Dining2 + " 』\n C『 " + Dining3 + " 』";
 Logger.log(result);
 return result;
}

function doPost(e) {
 var slackToken = "(略)";
 if (slackToken != e.parameter.token) {
   return;
 }
 var result = kiun();
 var slackUrl = 'https://hooks.slack.com/services/(略)';
 var jsonData =
     {
       "username" : "KIUN",
       "icon_emoji": ':kiun:',
       "text" : result,
       "unfurl_links": true,
         /* "attachments": [
           {
             "title": subject,
             "text": body
           }
         ]*/
     };
 var payload = JSON.stringify(jsonData);
 var params =
     {
       "method" : "post",
       "contentType" : "application/json",
       "payload" : payload,
     };
 UrlFetchApp.fetch(slackUrl, params)
}

スパルタンGAS後のコードがこちら。

function random() {
 var sheetApp = SpreadsheetApp.openById("(略)")
 var base = sheetApp.getSheetByName("kiun");
 base.copyTo(sheetApp);
 var workSheet = sheetApp.getSheetByName("kiun のコピー");
 var range = workSheet.getRange(1,1,workSheet.getLastRow(),workSheet.getLastColumn())
 range.randomize();
 var values = range.getValues();
 values.slice(0, 3);
 sheetApp.deleteSheet(workSheet);
 return values
}

function kiun(){
 var values = random();
 var Dining1 = values[0][0];
 var Dining2 = values[1][0];
 var Dining3 = values[2][0];
 var result = "今日のランチ候補は \n A『 " + Dining1 + " 』\n B『 " + Dining2 + " 』\n C『 " + Dining3 + " 』";
 Logger.log(result);
 return result;
}

function doPost(e) {
 var slackToken = "(略)";
 if (slackToken != e.parameter.token) {
   return;
 }
 var result = kiun();
 var slackUrl = 'https://hooks.slack.com/services/(略)';
 var jsonData =
     {
       "username" : "KIUN",
       "icon_emoji": ':kiun:',
       "text" : result,
       "unfurl_links": true,
         /* "attachments": [
           {
             "title": subject,
             "text": body
           }
         ]*/
     };
 var payload = JSON.stringify(jsonData);
 var params =
     {
       "method" : "post",
       "contentType" : "application/json",
       "payload" : payload,
     };
 UrlFetchApp.fetch(slackUrl, params)
}


この記事が気に入ったらサポートをしてみませんか?