メール添付ファイルの自動保存をPower Automateで自動化します
この記事は、以前の記事「Power Automate によるメール添付ファイル自動保存 to Sharepoint」をご覧くださった方からブログネタのリクエストを頂いたので それに対するアンサー的内容です。リクエストいただきありがとうございます。
以前の記事ではメールの添付ファイルを受信時にSharepoint Onlineに自動保存するフローを作成しました。そこでは添付ファイルを新規保存しましたが、今回のリクエストは「添付ファイルを、Sharepoint Online上の既存のファイルに同名で上書き保存するにはどうしたら良いか?」という内容です。
早速トライしてみたいと思います。
今回のゴールを確認しよう。
シチュエーション
ターゲットとする添付ファイルは、Power Queryのデータソースとしてユーザから参照されているため、パス(ファイル名)を変えたくないようです。
以下のシチュエーションを想定しました。
Sharepoint上にPower QueryのデータソースにしているExcelファイルがあります。(以降このファイルをデータソースと呼びます。)このデータソースの情報は、更新される度に特定の件名のメールにExcelファイルとして添付されて送られてきます。
社員Aさんはこのメールを受け取るたびに、まずSharepoint Online上の古いデータソースを削除して、新しいデータソースをアップロードしています。
この記事でやること
上の前提に登場した「社員Aさんの作業」をPower Automate クラウドフローを使って自動化します。Power Automateに任せる作業は下記のとおりです。
- メールを受け取ったら、Sharepoint Onlineに既存のファイルの上から上書き保存
- ファイルが更新された旨を関係メンバーにteamsで連絡
作業の流れ
以下の流れで作業をすすめます!
前提となるテスト環境も1から作ります。
- データソースExcelファイルをSharepoint Onlineに作成する。(Power Queryで呼び出されるExcel)
- データソースExcelファイルをSharepoint Onlineでチェックアウト状態にする。
- データソースを読み込むExcelファイルを作成する。(Power Queryを実行して呼び出すExcel)
- Power Automate クラウドフローを作成する
- 動作テスト
(Step1)データソースとなるExcelファイルを準備します。
Power Queryの前提条件を確認しましょう。
パワークエリでExcelファイルをデータソースにする場合、そのExcelのデータ領域がテーブル化されている必要があります。テーブル化されていない領域はデータソースとして認識されませんので注意してください。対象のExcelファイルがテーブル化されていない場合は事前にテーブル化しておきましょう。
テーブル設定方法
- Excelファイルを開きます。
- 対象のデータ領域(表)の中のひとつのセルを選択(あるいは表のセル範囲全体を選択)
- 「挿入」タブをクリックします。
- 「テーブル」をクリックします。
- テーブルに含めるセル範囲を選択します。
データソースExcelファイルを作成してSharepoint Onlineに保存します。
▲こんな感じのダミーデータを用意しました。前述のとおりテーブル化しました。テーブル化するとテーブルスタイルが自動適用されるので上図のようにテーブル領域のデザインが変化します。
ファイル名は「上書き.xlsx」としました。
作成したExcelをSharepoint Onlineにアップロードして保存します。(今回わたしはローカルpcでExcelを作成してからSharepoint Onlineにアップロードしていますが、もちろんSharepoint Online上に最初からExcelを作り始めても大丈夫です。その場合はアップロードする手間がなくなりますね。)
(STEP2)チェックアウトの設定
チェックアウトしないとどうなるの?
データソースにするExcelファイルはチェックアウトします。チェックアウトとはファイルの共同編集をロックするSharepoint Online(以下SPO)の機能です。チェックアウトする理由については下記のとおりです。
チェックアウトしていない場合
チェックアウトしていない場合、通常SPO上に保存されたExcelファイルは複数人による共同編集が可能です。この共同編集が可能な状態でPower Automateフローがファイルを実行してしまうと、その時点で誰もファイルを開いていなければ問題ありませんが、誰かがファイルを開いていた場合、以下のエラーを吐いてPower Automateが上書き保存に失敗してしまいます。
エラー:アクション ‘ファイルの作成’ に失敗しました
ファイル https://hogehoge.sharepoint.com/sites/{site-name}/Shared Documents/テスト/上書き.xlsx は、{user-name} [membership] が共有するためにロックしています。
チェックアウトした場合
チェックアウトしている場合、Power Automateが実行された時点でたとえ誰かがファイルを開いた状態にあっても、Power Automateはファイルを上書き保存することができます。これは、チェックアウトをオンにしていると同時編集が不可能になり必ず読み取り専用で開かれるためです。
以上の理由でここからのステップではチェックアウト設定をオンにします!
チェックアウトの設定方法
▲データソースとなるExcelファイルのメニューアイコンをクリック>「その他」>「チェックアウト」をクリックします。ここでは「上書き.xlsx」というExcelファイルをチェックアウトしています。
▲チェックアウト状態のファイルには上図のように赤いアイコンがつきますのでこのアイコンを目安にして設定の有無を確認すると良いかと思います。
チェックアウト状態のSPO上のファイルをPower Automateで上書き保存した場合、チェックアウト状態は保たれるのか?
チェックアウト状態のファイルをPower Automateで上書き保存した場合、再度チェックアウト設定が必要なのでは?という心配がありました。しかし、Power Automateでファイル上書き後もチェックアウト状態のままでした。ですのでここで紹介したチェックアウト設定は初回1度だけ実施すれば良さそうです。
(STEP3)データソースを読み込む側のExcelのPower Queryの設定
Power Queryの設定を行います。
読み込む側のExcelの保存場所はローカルPCでも、SPO上でもどこでもいいかと思いますが今回はSPO上に保存しました。
▲「データの取得」をクリックします。
▲「データの取り込み」画面でSharepoint サイトのURLを張り付けます。そして「開く」ボタンを押します。
▲サイトのドキュメントライブラリが表示されます。フォルダ階層をたどって対象のExcelファイルをたどって探しましょう。
▲目的のExcelファイルを見つけたらクリックして選択状態にして、ウィンドウ右下の「インポート」をクリックします。
▲図のような「ナビゲーター」画面が開きます。テーブルを選択して「読み込み」ボタンをクリックします。必要があれば読み込み前にデータの変換を行ってください。(データ変換はあとからでもできます。)
▲データの取り込みが完了しました。
(STEP4)Power Automate クラウドフローを作成します。
ファイルの準備が整いましたので、ここからはPower Automateのフローを作っていきます!!
わたしの環境ではPower Automateの「試験的な機能」を有効化しています。関数の入力が楽になるので有効化することをおすすめします。今回解説に使用している画面図も「試験的な機能」を有効化しているときの画面です。有効化していない場合若干見た目が異なるかもしれません。
▲左側メニューの「+作成」をクリックして「自動化したクラウドフロー」を選択します。
▲「新しいメールが届いたとき(v3)」をトリガーにします。「メール」で検索すると見つけやすいです。フロー名を付けて「作成」ボタンをクリックします。
▲「新しいメールが届いたとき(V3)」の設定を開いて、必要な設定を入力します。
- 件名フィルター:上書きメール
- 添付ファイル付き:はい
「上書きメール」という件名のメールでなおかつ「添付ファイルが付いているとき」だけフローを実行したいので上記のように設定しました。
▲「組み込み」グループの中の「変数」コネクタの中の「変数を初期化する」アクションを追加してパラメータを入力します。
- 名前:numberOfAttachments
- 種類:整数
- 値:@{length(triggerOutputs()?[‘body/attachments’])}
この変数アクションに入れている値は、「添付ファイルの個数」です。
length関数に「添付ファイル」という動的な値を引数として渡すと添付ファイルの数を調べることができます。メールに添付ファイルが4個ついていたら、この変数には4という数字が入ります。何故添付ファイルの数を調べているかというと今回のフローは添付ファイルが1個の時だけ処理を完了させたいからです。
length関数の入力の仕方
▲「値」の入力欄をクリックしてフォーカスした状態にします。すると「fx」という関数入力アイコンが表示される(②)のでクリックします。
▲キーボードを半角モードにして「le」と入力すると「length」関数がサジェストされるので選択してエンターキーを押します。
▲①length()の()部分を手入力して()の中にカーソルを合わせます。②かっこの中には「添付ファイル」という動的な値を入れたいので動的な値の検索ボックスに「添付ファイル」と入力して③みつけたらクリックします。
▲以上の操作で関数式が完成しましたので、関数入力の画面を右上の×ボタンで閉じます。
▲関数式を挿入できました。
関数は必ず上図のようにfxアイコンとして認識されているか確認してくださいね。fxアイコンにならずにただのテキストの表示になっている場合タイプミスなどで構文エラーが起きている可能性があります。初心者の方がよくつまずくところですので注意してください。そうなってたら入力をやり直してください。コツとしてはなるべくキーを手打ちせずにマウスクリックだけで進めると良いです。
▲「組み込み」グループの中の「コントロール」コネクタの中の「条件」アクションを追加します。
- 左:@{variables(‘numberOfAttachments’)}
- 中:次の値に等しい
- 右:1
左辺に入力しているのは、numberOfAttachments変数ですね。numberOfAttachmentsの値が1だったら(つまり添付ファイルの数が1つだったら)Trueの方の処理を実行します。
このアクションを追加することで「はい」と「いいえ」に処理を条件分岐させることができます。
添付ファイルが1個のときは「はい」の処理、2個以上の時は「いいえ」の処理が実行されるよ。
※添付ファイルが0個のときはそもそもトリガー起動条件を満たしていないのでフローが起動しません。
▲「Sharepoint Online 」コネクタの中の「ファイルのコピー」アクションを追加します。
- 現在のサイトアドレス:ドロップリストからサイトを選択します。
- コピーするファイル:ドロップリストからフォルダ階層をたどってファイルを選択してください。ここでは「/Shared Documents/テスト/上書き.xlsx」とします。
- 送信先サイトアドレス:ドロップリストからサイトを選択します。
- インストール先フォルダ:ドロップリストからフォルダ階層をたどってフォルダを選択してください。ここでは「/Shared Documents/テスト/バックアップ」とします。
- 別のファイルが既に存在する場合:Copy with a new name
このアクションで上書きの前にバックアップ用にコピーをとってます。
▲Apply to eachの入力値に、動的な値「添付ファイル」を入力します。
▲先程追加したApply to eachループの中にアクションを追加します。「Sharepoint Online」コネクタの中の「ファイルの作成」アクションを追加します。
- サイトのアドレス:サイトを選択してください。
- フォルダーのパス:データソースとなるExcelファイルが保存されたパスを入力してください。
- ファイル名:データソースとなるExcelファイルと同じファイルを拡張子付きで入力してください。
- ファイルコンテンツ:@{items(‘Apply_to_each’)?[‘contentBytes’]}
既存のSharepoint Online上のファイルに上書き保存するには、既存のファイルと同じ名前(同じフルパス)で保存するだけです。ファイルの保存には「ファイルの作成」アクションを使います。
▲「teams」コネクタの中の「チャットまたはチャネルでメッセージを投稿する」アクションを追加します。このアクションは「Apply to each」の外側に追加します。
- 投稿者:フローボット
- 投稿先:Channel
- Teams:メッセージ送信先のチームを選択します。
- Channel:メッセージ送信先のチームのチャネルを選択します。
- Message:トリガーメールを受信したためデータソースを更新しました。
ファイルが更新されたことがわかるようにTeamsでメッセージ通知します。
▲「teams」コネクタの中の「チャットまたはチャネルでメッセージを投稿する」アクションを追加します。
- 投稿者:フローボット
- 投稿先:Channel
- Teams:メッセージ送信先のチームを選択します。
- Channel:メッセージ送信先のチームのチャネルを選択します。
- Message:「トリガーメールを受信しPower Automateフローが実行されましたがエラーのため処理を中止しました。添付ファイルの数が多すぎた可能性があります。添付ファイルは1つずつ送信してください。」
「いいえ」の方に処理が流れてきたら、添付ファイルの個数が想定外ということなので、メールの再送などをしてもらう必要があると思うので相応の対応ができるように担当者に通知をしてあげるようにしました。
完成しました!次の項でテストしていきます!
(STEP5)動作テストします。
Power automate のトリガー条件のとおりメールを送信しましょう!
データソースが更新されたことがわかるように、もともとデータソースのデータ行数10あったところを5行たして15行に更新してからメール送信します。
メールの内容
- 件名:上書きテスト
- 添付ファイル:上書き.xlsx
- 宛先:フローを作成したMicrosoftアカウント
メールを送信すると、フローが実行され、フローに追加したTeamsアクションによってTeamsに通知が来るはずなので待ちます。1分程度かかるかと思います。
▲データソースが更新されたはずなので、取り込む側のExcelを開いて更新してみます。
- 「データ」タブ>「すべて更新」をクリックします。
▲もともと10件だったデータが15件に更新されました。
以上、問題がなさそうなので作業完了です。ありがとうございます。
補足
古いファイルの退避について
Sharepoint にはバージョン管理機能が付いていますが、何回かテストしたんですがPower Automatで更新した内容についてはバージョン履歴が残りませんでした。そのため上書きの前に「ファイルのコピー」アクションでバックアップを取っています。
バックアップファイルのファイル名に日付を入れたい
今回作成したフローではバックアップファイルは下記のような名前で保存されます。
- 上書き.xlsx
- 上書き1.xlsx
- 上書き2.xlsx
- ・・・
上書き2022-01-27_123456.xlsxのようにタイムスタンプをファイル名につけたい場合は下記の記事が参考になるかと思います。
まとめ
以上、メールの添付ファイルを、SPO上の既存のファイルに、自動で上書き保存する方法について試してみました。
このブログではRPA・ノーコードツール・VBA/GAS/Pythonを使った業務効率化などについて発信しています。
参考になりましたらブックマーク登録お願いします!
Power Automate学習教材
▲Kindleと紙媒体両方提供されています。デスクトップフロー、クラウドフロー両方の解説がある書籍です。解説の割合としてはデスクトップフロー7割・クラウドフロー3割程度の比率となっています。両者の概要をざっくり理解するのにオススメです。
▲Power Automate for Desktopの基本をしっかり学習するのにオススメです。この本の一番のメリットはデモWebシステム・デモ業務アプリを実際に使ってハンズオン形式で学習できる点です。本と同じシステム・アプリを使って学習できるので、本と自分の環境の違いによる「よく分からないエラー」で無駄に躓いて挫折してしまう可能性が低いです。この点でPower Automate for desktopの一冊目のテキストとしてオススメします。著者は日本屈指のRPAエンジニア集団である『ロボ研』さんです。
▲Power Automate クラウドフローの入門書です。初心者の方には図解も多く一番わかりやすいかと個人的に思っています。
Microsoft 365/ Power Automate / Power Platform / Google Apps Script…
▲Udemyで数少ないPower Automateクラウドフローを主題にした講座です。セール時は90%OFF(1200円~2000円弱)の価格になります。頻繁にセールを実施しているので絶対にセール時に購入してくださいね。満足がいかなければ返金保証制度がありますので安心してご購入いただけます。