(この記事は2022年7月6日に弊社テックブログに掲載した内容となっております。)
はじめに
AppBrewでスクラムマスター、ディレクターをしています「なっつん」です。
今回は、文系非開発職の私が「Google Apps Script(以下GAS)を書いてちょっとめんどくさい請求書処理フローを改善した話」について書きます。
先に少し私の自己紹介をしておくと、新卒からディレクターとして働き現在7年目です。AppBrewに入社するまでは
- 決済・会員基盤開発チームのディレクター
- to C・to Bサービスのプロダクトマネージャー
- webメディアのコンテンツ制作やYoutube動画のディレクター
など、自らの好奇心に任せて、ディレクターやプロダクトマネージャーとしてサービスやコンテンツを作る動きをしてきました。
そして現在AppBrewでは、これまでの経験を生かしてスクラムマスターとして「最大限のパフォーマンスを発揮する最高のチームをみんなで作るための取り組み」をしています。
これを読んで分かること
- メールで届いた大量の請求書を自動でGoogle ドライブに取り込む方法
- AppBrewの行動指針、「OWNERSHIP」「LEAN」「USER FIRST」の一例
請求書フロー改善プロジェクトの発足
みなさん請求書に関わらず、こういう地味に辛い業務ってあるあるじゃないでしょうか? 「効率化できることはどんどん自動化していきたい。でもみんなが困っているわけではないし、頻度の少ない作業ならそこまで優先度は高くないけど、毎回ちょっとめんどくさいな…」そういう課題、ありますよね。
このslackメッセージを通りすがりに見つけまして、運用を変えて幸せになるメンバーがいるならやっていきます!とのことで請求書フロー改善プロジェクトを発足しました。
ちょっとめんどくさい請求書フロー課題まとめ
弊社には業務委託で参画していただいてる方も多く、そのようなメンバーの業務上のサポートは数名の正社員エンジニアリングマネージャー(以下EM)が行っています。 そのサポートの一つには、月末に業務委託メンバーから送付されてくる請求書の社内処理も含まれています。
ただし、これが意外とEM陣のリソースを使う業務で主な課題は3つ
- 請求書送付先はEMへ直接メールやslackで人によってバラバラ
- 誰からの請求書が届いてないか各EMが把握して、未送付者にリマインドを行う
- EMは受け取った請求書を確認し、社内処理用に適切なものにリネームし専用フォルダに格納する
これらをEM陣が毎月行うという運用になっていました。(業務委託費の他にもシステム使用料などの請求書も多数含む)
「あれ?一見するとそんなに複雑じゃないし困ってなくない?」となるかもしれませんが、運用開始当初よりも請求書の数が増え、いつの間にやら地味に辛い業務になっていたのです。
その証拠に「やるぞと言っただけまだ何も着手していない時点」で神と崇められ、タコスが送られてきました(タコスとは弊社で導入しているピアボーナスのことで、詳細は弊社のオープンポータルをご覧ください)
正直そこまで課題感があったとはプロジェクト発足時点で私も把握をしきれていなかったので驚きました。 扱う請求書の数が少ないうちは上手く行っていた運用フローも、会社規模が大きくなりメンバーが増えるにつれて見直しや統一が必要になっていたようです。個人的には今までのやり方では通用しなくなり新しく出てきた課題と向き合うと、会社がぐんぐん成長しているんだなとワクワクします♪
具体的にやったこと
現行の課題と改善後のフローを整理した
まず、課題のヒアリングを行い、改善後フローのイメージはすでにあったのでそれらを整理するためにフローチャートを作成しました。合わせて経理処理上懸念がないか、経理担当者に確認をしました。
メールで届いた大量の請求書を自動でGoogle ドライブに取り込むGASを書いた
次に、請求書受付用メールアドレスを用意し送信されてきたメールの添付ファイルをGoogleドライブに自動で格納するGASを書きました。 以下はGASの一例です。参考までにどうぞ
//メーリングリストに受信した添付ファイルをgoogledriveに保存する
function Attachment_to_GDrive() {
//昨日の日付計算(検索条件用)
let now = new Date();
let yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
yesterday = Utilities.formatDate(yesterday, "JST", "yyyy/MM/dd");
//保存先フォルダ設定(IDはフォルダURLの~folders/以降)
let save_folder = DriveApp.getFolderById('保存先フォルダID');
//検索条件設定
let condition;
condition = " is:unread" //未読
condition += " has:attachment"; //添付あり
condition += " after:" + yesterday; //今日(昨日より後)
condition += " to:メーリングリストアドレス" //受信用メールアドレス
//検索条件でメール検索
let search_mail = GmailApp.search(condition);
//検索したメールをスレッドで取得
let messages = GmailApp.getMessagesForThreads(search_mail);
//スレッド数ループ
for(let i = 0; i < messages.length; i++) {
//スレッドの中身数ループ
for(let j = 0; j < messages[i].length; j++) {
//添付ファイル取得
let attach = messages[i][j].getAttachments();
//添付ファイル数ループ
for(let k = 0; k < attach.length; k++){
//添付ファイル保存
save_folder.createFile(attach[k]);
}
}
//スレッドが終わったら既読にする
messages[i][0].markRead();
}
gasの書き方は新卒で入社した会社でなんとなく教わりました。そのおかげで書き始めるハードルは高くはありませんでしたが、内容はすっかり覚えていないので具体的に書く際にはたくさんググりました(笑)
フローまとめとGASを書き、実際に運用してみると、考慮できていない点もあり、少しずつ修正を加え、より良い運用に改善中です。
まとめ
ちょっと不便なことを自動化してみて分かったこと
- エンジニアメンバーと辛みを分かち合うことができた
- 自分自身のやれることが増えたり、コードレビューでコードを書く時の思考方法を教わったり、エンジニアとの共通言語を増やすことができた
- 最初は困っている個人(エンジニア)がターゲットだったが、結果的に部署横断的に社内で複雑になっていた運用を整理することができた
AppBrewの行動指針、「OWNERSHIP」「LEAN」「USER FIREST」を体現することができた
- 「OWNERSHIP」gasを実務で書くのは初めてでしたが、事業の成功のために必要なことは担当範囲にこだわらず積極的に学び、やりきる精神を発揮することができた
- 「LEAN」「とりあえずやってみる」「とりあえず出してみる」で最低限の品質まで仕上げ、試験運用を行いながら改善を回すことができた
- 「USER FIRST」課題を見つけたり、困っていたりするユーザ(社内外関わらず)がいるものに対してアプローチをすることができた
さいごに
この記事を読んで参考になったという方はぜひ、はてなのブックマークやシェアいただけると励みになります♪
また、AppBrewでは一緒に働くメンバーを募集中です。
誰もが良い意味で職域を意識せず、何事も「とりあえずやってみる」が良しとされる環境です。 そんな環境で一緒に働いてみませんか?