Power Automateを活用して電子帳簿保存法に対応する為に社内改善したこと

![はてなブログ　アイキャッチ画像　はてブ　Blog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/d1bc4cf8-7a62-dc77-ee6e-e84429d7ae2e.png)


##電子帳簿保存法への対応は如何ですか？
電子帳簿保存法が令和4年1月から改正されましたが、皆さんの会社の対応は如何でしょうか？個人的に、去年は電子帳簿保存法への対応準備で、翻弄された1年ではなかったかと思います。

##弊社バックオフィスサービス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/c84b7761-f078-3709-17a1-444b2e40842e.png)

弊社では、バックオフィスはMoney Forwardの製品郡で統一していて、図のようにできる限り転記作業や間違いなどを防ぐ為に自動取込をおこない、仕訳帳を入力せず振込までを完結できる状態で運用しています。

まだまだ完璧ではなくて、

- 経費精算の紙の領収書提出
- 郵送されてくる紙の請求書・発注書の類

この辺りも電子帳簿保存法への対応で電子化できると、リモートワーク時でもデジタル申請が行えて、かなり幸せになれそうです。

電子帳簿保存法への保存要件も確認して、関連サービスの黄色い枠の「クラウドBox」に電子データを保存することにしました。

https://www.nta.go.jp/law/joho-zeikaishaku/sonota/jirei/05.htm

:::note info
基準期間の売上高が1,000万円以下である方（小規模な事業者）については、税務職員による質問検査権に基づく電磁的記録のダウンロードの求めに応じることができるようにしている場合には、検索要件の全てが不要となっていますので、このまま利用することも可能かも知れません。
:::

##電子保存の課題
クラウドBOXのアカウントを各スタッフに配布して、請求書を電子化して保存することも検討しましたが、経理担当者から**「一覧にまぎれてしまって、どのファイルが当月末支払いの請求書なのかわかりにくく、支払い漏れが発生しそう」**との意見があり、共有メールボックスに送ってもらって、その添付ファイルを自動的に保存させる仕組みをPower Automateのクラウドフローで実現してみようということになりました。


**クラウドBOX画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/462947aa-6216-9369-c086-b3e98d43a4db.png)
※保存するとタイムスタンプを付与してくれます。詳細な検索機能もついていて、とても便利です。
ファイルのプレビューは見れますが、保存する際のファイル命名規則をルール化しないと、わからなくなってしまいそうです。

##やりたいことを整理

まずは、やりたいことを整理します。
請求書送付用の共有メールアドレスにメールが到着したら、フォルダ振分の設定の記載されたエクセルファイルを参照して、送付元のメールアドレスと同じメールアドレスを見つけたら、自動的に当月のフォルダ内に会社ごとにフォルダを作成して、添付ファイルを保存してくれるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/1269859d-179b-6136-ea63-dbc6d5112cb9.png)
本来は**「承認を飛ばしてクラウドBOXへ自動保存」**と行きたいところですが、念の為に経理担当者の確認をもって手動で登録することにしました。
経理データとは、外注費の仕分けを作成した際に、クラウドBOXに保存されたデータを指定することで、関連付けします。

##Power Automateを作成する
ここから実際のPower Automateで、どのように設定しているのかを解説します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/1f8e775f-70af-27d4-9c11-c67cddd96dd4.png)


###１．新しいメールが共有メールBOXに届いたとき（V2）
まずはトリガーとして、共有メールボックスにメールが届いたら、処理を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/49b82b3f-10bc-4be9-d9d0-3c0d1a939eb5.png)
**元のメールボックスのアドレス：**共有メールボックスのメールアドレスを入力します。

**フォルダ：**Inbox
↑受信ボックスのことです。

必ず忘れていけないのが、**「添付ファイルを含める」**を**「はい」**にすることです。
これを設定しないと、OneDriveに保存したファイルが「壊れている」と言われて慌てます😁やりがちなので注意しましょう。



:::note info
共有メールボックスの作成は、Microsoft365管理センターの「チームとグループ」にあります。「共有メールボックスを追加」から作成してください。
なお<font color="red">メールボックスが作成されるまで時間がかかります</font>ので、事前に作成することをおすすめします。
また、共有メールボックスに<font color="red">ご自身のアクセス権限の付与</font>を忘れずにしましょう。
:::

###２．表内に存在する行を一覧表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/68e12719-39bd-caa2-9c6d-8b3b4c041257.png)
請求書を保存するOneDriveと同じフォルダにエクセルファイルを設置しておいて、送信元の担当者メールアドレスや会社名を記載し、設定ファイルとして読み込んで利用します。
このような形にすると、**誰でも簡単にメンテナンスが出来て便利です。**

**場所：**ご自身のご契約のOneDriveを選択してください

**ドキュメントライブラリ：**ご自身のご契約のOneDriveを選択してください

**テーブル：**エクセルファイルのシートに設定したテーブル名を指定します


※エクセルファイルのテーブルは、このような内容になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/cf93ec97-5ecd-7248-c660-6464038aaac8.png)

###３．日時変数（変数を初期化する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/f51bda91-5d13-f5c3-f3b8-c25031cfb2a4.png)
当月のフォルダを作成する為に変数を作成します。日付を取得して文字列を加工しています。

**名前：**日付変数

**種類：**文字列

**値：**formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'),'yyyy年MM月')
↑現在の日時を取得して、〇〇〇〇年〇〇月という文字列を作成しています。

###４．表データ配列（変数を初期化する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/88a16548-483f-56e1-1c3a-2dcaf2ce5985.png)
後で利用するのですが、エクセルファイルに記載のないメールアドレスから送信があった場合を想定して、判断する条件に使用するため、アレイ（配列）にエクセルのデータを入れています。

**名前：**表データ配列

**種類：**アレイ

**値：**表内に存在する行を一覧表示の「Value」を指定します。


###５．表の行数変数（変数を初期化する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/f7d1ada4-3f15-b1a4-69fe-4e5937736469.png)
「４．表データ配列」でなぜ変数を作成したかというと、**行数をカウントするために作成しています。**
この「表の行数変数」の「値」で配列の個数を保存しています。

**名前：**行数変数

**種類：**整数

**値：**length(variables('表データ配列'))
↑lengthは配列の数をカウントする関数です。

###６．ループカウント変数（変数を初期化する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/3ed6feb9-0558-46be-ecb9-18e981ac9a72.png)
後の工程でエクセルの行にあるメールアドレスと合うものがないのか、毎回ループして確認するのですが、合致してない時だけこの「ループカウント変数」を増加させて、「５．表の行数変数」の数と比較して、登録のない人からのメールが届いているか判断します。

**名前：**ループカウント変数

**種類：**整数

###７．ユーザーの@mention トークンを取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/b11e4e90-e7d5-197a-23fa-a47eb55c0333.png)
登録のないユーザーからメール送信があった場合に、Teamsのチームにメッセージを送りたいので、その際にメンションをつけるために作成しています。

**ユーザー：**メンションを通知したい方のメールアドレスを指定してください。

###８．全行ループ（Apply to each）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/fc2499a8-0bbc-b2f2-5562-2dde448338a1.png)
ここからループをして、送信者のメールアドレスがエクセルファイルに記載されたメールアドレスと合致しているか１行ごとに調べて、

- **合致していたら：**添付ファイルをOneDriveに保存

- **合致してなかったら：**変数ループカウントを増やします。
ループする中で、エクセルの行数を保存した変数とループカウントの数が合致したら、メールアドレスが存在しなかったことになるので、Teamsのチームに投稿してお知らせします。

ここのセクションは長いので分割して解説します。

####８-1．全行ループ（Apply to each）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/66140f13-1d22-acbb-c230-49bdb28daeb0.png)
**以前の手順から出力を選択：**「２．表内に存在する行を一覧表示」の「Value」を指定します。これでエクセルの行数分ループしてくれます。


####８-２．条件２（コントロール→条件）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/cf957d14-8bdd-9dd4-c675-498ce9a57074.png)
メールの差出人をエクセルに設定した「メールアドレス」に合致しているのか条件設定しています。

**左の値：**「１．新しいメールが共有メールBOXに届いたとき（V2）」で取得できる「差出人」

**右の値：**「２．表内に存在する行を一覧表示」で取得できる「メールアドレス」


####<font color="Green">８-２-１．「はい」の場合</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/51edfdcb-9add-f3ab-648c-847e60393f70.png)
メールの添付ファイルが複数あったら、全て保存したいのでループして添付ファイルをすべて保存します。

#####Apply to each
**以前の手順から出力を選択：**「１．新しいメールが共有メールBOXに届いたとき（V2）」の「添付ファイル」を指定します。

#####ファイルの作成（OneDrive）
**フォルダーのパス：**自身のOneDriveに作成した保存用フォルダを指定します。フォルダパスに「日付変数」で〇〇〇〇年〇〇月の文字列、さらにエクセルにある「会社名」の文字列を繋げることでフォルダを作成しています。

**ファイル名：**「１．新しいメールが共有メールBOXに届いたとき（V2）」の「添付ファイル名前」

**ファイルコンテンツ：**「１．新しいメールが共有メールBOXに届いたとき（V2）」の「添付ファイルコンテンツ」


####<font color="red">８-２-２．「いいえ」の場合</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/0b69d231-958a-858c-d43a-195751499acc.png)
いいえの場合には「ループカウントを増やす」で数をカウントして、条件で「ループカウント変数」と「行数変数」が等しいか判断して、「はいの場合」にはTeamsのチームにメンションつけて投稿します。


#####ループカウントを増やす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/001f79f1-421a-e0c0-c7ab-1a006e40f715.png)
**名前：**「６．ループカウント変数」を指定します。

**値：**「１」
↑１づつカウントアップしたいので１を指定しています。


#####条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/ad16ce0a-b7eb-5cf5-ef52-17ab7d38abff.png)
**左の値：**「６．ループカウント変数」の「ループカウント変数」

**右の値：**「５．表の行数変数」の「行数変数」


#####<font color="Green">はいの場合</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/ec1c3f83-8a3c-a260-1103-b327cd3684cf.png)
######チャットまたはチャンネルでメッセージを投稿する
**投稿者：**フローボット

**投稿先：**チャンネル

**チーム：**ご自身の使いたいチームを指定してください。

**チャネル：**ご自身の使いたいチャネルを指定してください。

**メッセージ：**投稿するメッセージを作成します。
メンションをつけて通知したいので、「７．ユーザーの@mention トークンを取得する」から「@mention」を指定します。
件名には「１．新しいメールが共有メールBOXに届いたとき（V2）」の「件名」
本文には「１．新しいメールが共有メールBOXに届いたとき（V2）」の「本文」
を指定して、メールの文章がわかるようにしています。

###９．終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/d0fa915d-e15c-752b-d9b9-b663464e1cf7.png)
終了した場合に、成功したのか失敗したのか判断したい場合に設置しますが、今回は作成してもしなくても動きます。別で処理を行う場合を想定して暫定で作成しています。

以上で、Power Automateの作成は終了です。

:::note info
テストを忘れずに！
試しに添付ファイルをつけて共有メールBOXにメールを送ってテストしてみましょう。
「新しいメールが共有メールBOXに届いたとき」のトリガーは発動するのに少し時間がかかります。
:::

##最後に
メールで送られてくる添付ファイルをフォルダに保存するシンプルな自動化ですが、請求書の送付者にCCで共有メールアドレスに入れてもらうだけで、社名フォルダごとに保存されるので、非常に手間が軽減されますね。
そろそろ月末で請求書が送られ始めるので、これから活躍してくれると思います😁

更に「クラウドBox」のサービスがAPI提供してくれたら、「承認」で自動保存も可能になるので、バージョンアップしていきたいと思います。

この記事を読んでいただいた皆さんの会社でも、ぜひ活用してみてください。
また「こんな改善してみた！」というのを、どんどん共有して、僕にも教えてもらいたいです。

**みんなで改善ポイントを共有していけると、みんなで楽になれて幸せになれそうですので、Twitterなどで投稿してみてください。**

また、次回も宜しくお願い申します！