[30 分早く帰り隊] 「kintone meets DataSpider ハッカソン成果 #1」 kintone × Excel × メールで業務自動化

Avatar
dstn


こんにちは、アプレッソ開発部 / 30 分早く帰り隊の野口です。

今回は、去る 8 月に開催しました「kintone meets DataSpider」ハッカソンの成果物から、kintone × Excel × メールの連携によって業務を自動化するスクリプトをご紹介します。

「kintone meets DataSpider」 ハッカソンについて


「kintone meets DataSpider」ハッカソンは、2014/8/22 に板橋のしゃれたフレンチレストランで開催したハッカソンです。
8/22 は、何を隠そう、【30 分早く帰り隊】が誕生した記念すべき日でもあります!

さて、ハッカソンでは、3 つのチームに分かれてそれぞれテーマを決め、およそ 4 時間で、kintone アプリと DataSpider のスクリプトを作成しました。
今回ご紹介するのは、そのうちの 1 つです。

ハッカソンの様子については、開催レポートがありますので、ぜひご参照ください。

* 開催報告:「kintone meets DataSpider」ハッカソン開催しました
- https://dstn.zendesk.com/hc/ja/articles/220074788

シナリオ 1 : メールで届く Excel の見積書を読み取って、自動的に kintone アプリに登録


今回は、2 つのシナリオに沿って、2 つのスクリプトを作ります。
まずは、「メールで届く Excel の見積書を読み取って、自動的に kintone アプリに登録する」というシナリオです。

s1

見積書のフォーマットは、予め定めておきます。
また、kintone で、見積書のフォーマットにあわせたアプリを一つ作成しておきます。

s2

メールを受信し、Excel の見積書を取り出す


今回は Gmail を使います。
Gmail では、Gmail アダプタを使うとほとんど設定いらずで、非常に楽ちんです。

gmail_receive

添付ファイルを受信するように設定します。
メールは一度の受信で複数届くかもしれませんし、同じファイル名の添付ファイルを同時に複数受け取る可能性があるので、連番を振るようにしておきます。

gmail_receive_attachment

さらに、取得した添付ファイルをリネームして移動し、そのファイル名をスクリプト入力変数として、Excel ファイルを読み取って kintone に登録するスクリプトを呼び出します。

call_script

というわけで、親スクリプトの全体像はこうなります。

overall1

ここでは添付ファイルの移動やリネームについての詳細は省略しますが、「神尾みかさんのDS自由自在」 の第4回が参考になるかと思います!

* 神尾みかさんのDS自由自在 第4回 「メールの添付ファイルを指定のディレクトリに移動する!」
- https://dstn.zendesk.com/hc/ja/articles/220078308

また、「DataSpiderデザインパターンβ」の第 8 回でも、メールから Excel ファイルを取得する際の注意点について説明されています。

* DataSpiderデザインパターンβ 第8回 設計パターン 「Mail&Excel Data Integration」
- https://dstn.zendesk.com/hc/ja/articles/220078548

Excel の見積書を読み取る


さて、呼び出し先のスクリプトはというと……こうなります。

overall

oh...

これらのアイコンのほとんどでは、Excel の [読み取り] 処理で 1 つだけのセルを読み取って、予め作成しておいたスクリプト変数にマッピングする、ということを行っています。
たとえば、社名読み取りはこうです。

company_name1

company_name2

company_name3

「filepath」というスクリプト変数が、親スクリプトから受け取った入力変数、すなわち取得した添付ファイルの名前が入っている変数です。
この要領で、見積書の単独セル(繰り返しのないセル)をそれぞれ読み取っていきます。

現状、DataSpider の Excel アダプタには単一セルをまとめて読み取るオペレーションがないため、このようにちょっとスゴいスクリプトが生まれてしまいましたが、中身は単純なので、ちょっとメンドクサイのを我慢すれば難しくはありません。
とはいえ、メンドクサイのも事実なので、これに懲りた 30 分早く帰り隊の某メンバーが [セル指定読み取り] 処理の開発に意欲を燃やしているとかいないとか……。(あくまで噂です)

というわけで、社名、所属、氏名、FAX、住所、電話、小計、消費税、合計をそれぞれ読み取ったら、最後に肝心の商品一覧の読み取りです。
これは、送付してもらう Excel ファイルに予め範囲を定義しておいて、[範囲から読み取り] 処理を使用して読み取ります。

area1

特に難しいことはありません……が、ここでポイント!
Excel ファイルで、範囲を「列名」の部分まで含めて定義していた場合、[読み取り設定] タブで「最初の行は値として取得しない」にチェックを入れるのを忘れないようにしましょう。
kintone に登録したいのはそれぞれの商品の具体的な内容であって、列名は不要だからです。

area2

あるいは、定義する範囲には、列名が書かれた行を含めないようにしましょう。
その場合、上記のチェックは不要です。

30 分早く帰り隊は、ハッカソン当日、これが原因でハマってしまって苦しみました……。
皆さんお気をつけください。

kintone アプリに登録する


kintone の [レコード追加] 処理を配置して、接続先のアプリを設定したら、「フィールド一覧の更新」を押すだけでスキーマが自動的にセットされます。

kintone_register

あとは、これまで読み取った値をマッピングするだけです。
kintone アダプタでは kintone のサブテーブルにも対応しているので、1 通の見積書ごとに複数ある商品一覧も、繰り返し処理できちんと全件登録できます。

kintone_mapping

範囲から読み取った商品一覧では、すべての行に商品が入力されているとは限らない(あとの方の行は、空のままの可能性がある)ので、「商品コード」が空でない行だけを抽出しているのがポイントです。
また、現在日時ロジックで日付を取得し、レコードの「発行日」に入力しています。

サービス登録し、スケジュールトリガーで自動実行する


これで完成です。
一度 Gmail のアドレスに実際にメールを送って、テスト実行してみます。

registered

無事、kintone にレコードが登録されたことを確認できました。

ちゃんと動くことが確認できたので、最後に、このスクリプトをサービスに登録して、スケジュールトリガーで定期的に実行するように設定します。
一度の実行は通常数秒で完了しますが、厳密にリアルタイムである必要もないので、ちょっと余裕をもたせて 3 分ごとに実行することにしてみましょう。

schedule_trigger1

できました!!
これで、所定のメールアカウントに取引先から見積書がメールで届いたときに、その内容が自動的に DataSpider によって kintone に登録されます。

ほとんどリアルタイムに、メールで届いた見積りの内容を kintone アプリで確認することができるようになりました。

シナリオ 2 : 一日の終わりに、kintone アプリからその日の見積一覧を取得して CSV に整形し、メールでレポート


2 つめのシナリオは、「一日の終わりに、kintone アプリからその日の見積一覧を取得して CSV に整形し、メールでレポートする」というものです。

s4

「その日の見積り一覧」については、kintone アプリをうまく使って、kintone 上で確認するというのも一つの方法です。
実際、このスクリプトを作ったハッカソンでは、チームの方が kintone アプリを JavaScript でカスタマイズして、当日登録されたレコードをわかりやすくしてくれました。

registered_markuped

でもその一方で、やはりメールでレポートしたい、してほしい、といった要望も、現場では根強かったりもするのではないでしょうか。
あるいは偉い人が、「kintone、良いとは思うが、私はメールが大好きなのだ。メールで送れ」と命令するかもしれません。

そんなシナリオをスクリプトで実現してみます。

「その日」


まず、「その日」を判別するために「その日」をスクリプト変数に保存しておきます。

the_day

これは、先ほどのスクリプトでもやっていたことと同じですね。

見積り一覧を取得する


それから、kintone の [レコード取得] 処理でレコードを取得します。接続先のアプリを設定して、「フィールド一覧の更新」を行ったら、簡単な検索クエリを書きます。

kintone_get

「発行日」フィールドが「今日の日付」と一致するものだけを取得する、というクエリです。
かんたんですね。

CSV に出力する


CSV の [書き込み] 処理を配置して、書き出したい項目を列一覧に追加します。

csv1

今回は、[書き込み設定] タブで、[1行目に列名を挿入] するように設定しておくとよいでしょう。

csv2

あとは、kintone から取得した値をマッピングするだけです。

kintone_get_mapping

とりあえず、それぞれの見積りの概要だけをレポートすることにしました。

[ノードの数] ロジックを使用して、見積りの総件数を集計しているところがちょっとしたポイントです。
集計した値は、やはりスクリプト変数に保存しておきます。

メールで送付する


最後に、出力した CSV ファイルを添付して、送ります。偉井部長に送るという設定です。

mail1

スクリプト変数を利用して、今日の日付や見積りの総件数を本文に埋め込みます。

また、添付ファイルを指定しておきます。

mail2

これですべてです。
スクリプトの全体像は、こうなります。

overall3

サービス登録し、スケジュールトリガーで自動実行する


スクリプトができたので、テスト実行してみます。
すると、ちゃんとメールが届きました!

mail_received

さっきと同様に、スケジュールトリガーで、今度は毎日の終わりに一度だけ、実行することにしましょう。
念のため、kintone への登録が止まる時間(23:59 としていました)からは、少し時間をあけてあります。

schedule_trigger2

できました!!
これで、毎日の終わりには、DataSpider が自動的にその日の見積り一覧を kintone から取得して集計し、偉い人にメールを送信します。

今回は簡素な CSV ファイルにまとめて添付していますが、やはり Excel を使用してよりリッチなレポートに仕立てるのもよいですし、逆にメールの本文にレポートを埋め込んでしまうというのもありかもしれません。

まとめ


kintone × Excel × メールの連携を行う 2 つのスクリプトをご紹介しました。
これら 2 つのスクリプトによって、業務時間が一日 10 分程度は短縮されるのではないのでしょうか。

もっとも、偉い人に CSV を直に送りつけてしまっていいのか、本当に見積書のフォーマットを統一できるのか(おそらく、多かれ少なかれ業務を変えることになるでしょう)、等々の課題もあり、この状態で今すぐに実運用!というわけにもいかないかもしれません。
とはいえ、ご紹介したような、以下の連携パターンは様々に応用が可能なはずです。

* メール受信 → 添付の Excel ファイル読み取り → kintone に登録
* kintone から読み取り → CSV(Excelでもよいですね)ファイル作成 → メールで送付

……といったことごとを考えあわせて、ひとまずこのスクリプトの業務時間短縮効果を一日あたり 10 分と見積りました。

【30 分早く帰り隊】が 30 分早く帰れる日まで、あと【15 分】です。

読者の皆さまも、ぜひ DataSpider を利用して業務の自動化に取り組んでみてください!

コメント

ログインしてコメントを残してください。

Powered by Zendesk