ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

【質問回答】【Power Automate】メールに添付されたCSVとPDFをSharePointリストに取り込みたい

ましゅまろで質問をいただいたので回答します。

こんなましゅまろをいただきました。

実現したことの要素を箇条書きでまとめました

  • メールを受信したことをフローのトリガーにしたい
    • そのメールにはCSVとPDFが添付されている
  • CSVの中身のデータをもとにリストアイテムを投稿したい
  • かつ、投稿したリストアイテムにPDFを添付したい


ポイントになるのは以下の2つです。

  • どうやってメールに添付されたファイルの実体(= データの中身)を取得するか
  • どうやってデータの形式によって扱いを分けるか
    • CSVはリストアイテムの列項目として転記する
    • PDFはリストアイテムに添付する

回答します。

まずはましゅまろに記載いただいた以下の部分について。

CSV取り込みのブログ記事大変ありがたく読ませていただいております。


この記事ですね。読んでいただきありがとうございます。
wataruf.hatenablog.com

このフローをベースにして今回質問いただいている「メールに添付されているPDFをリストアイテムに添付する」という要素を追加したフローをつくってみました。
(`・ω・´)シャキーン


今回作成したフローをGitHubにアップロードしました。動作確認用のCSVとPDFも同じフォルダにいれました。
github.com

フローの解説をします。

注意

今回作成したフローはベースにしているフローのロジックを流用しているため、今回の要件に対しては一部冗長な作りになっています。

そのため、このフローを使用するときにはそのまま使うのではなくフローの各アクションの入力と出力を把握したうえで不要なものを適宜見直してください。

フロー図

アクションの設定を閉じた状態のフロー図


開いた状態のフロー図


フローの使用イメージ

事前準備

今回のフローのトリガーは「メールボックスにある特定のサブフォルダにメールが保存されること」です。

トリガー用に「書籍情報」というサブフォルダを作っておきます。

次にメールの振り分けルールを作ります。
ここでは例として「メールの件名に"書籍情報"という文字が含まれる場合は、サブフォルダ”書籍情報”にメールを移動する」という内容のルールを作ります。

「新しいメールが届いたとき 」トリガーが監視の対象にするフォルダを「書籍情報」にします。

フローの実行

メールの新規作成を行い、CSVとPDFを添付します。振り分けルールを適用させるために件名を「書籍情報」にします。


添付するCSVの中身は1行のデータです。


CSVテキストエディタで開くとこうなっています。各項目をダブルクォーテーションで囲んでいます。


メールを受信しました。振り分けルールによってメールが「書籍情報」フォルダに移動されました。


「書籍情報」フォルダにメールが保存されたことをトリガーにして、ワークフローが実行されました。


フローによってリストアイテムが新規に作成されました。CSVの各列にあるデータがリストの各列に転記されました。PDFファイルがアイテムに添付されました。OK

ポイント解説

フローのポイントをピックアップして解説します。

ポイント1:メールに添付されたファイルの実体は「添付ファイルの取得」アクションで取得できる

「新しいメールが届いたとき 」トリガーの出力には添付ファイルの情報が含まれています。このトリガーが出力する情報には添付ファイルの実体は含まれていませんが、添付ファイルのIDが含まれています。

添付ファイルIDを「Office 365 Outlook」>「添付ファイルの取得」アクションに渡すと添付ファイルの実体を得ることができます。

 ※ 2022/8/11 追記:
  ContentTypeプロパティを使った判定形式には穴があったため、拡張子で判定するように改良版のフローを作りました。
   https://wataruf.hatenablog.com/entry/2022/08/11/224558


「添付ファイルの取得」アクションの出力が持つプロパティのひとつである「コンテンツのバイト数」がファイルの実体(= データの中身)を表します。

CSVの「コンテンツのバイト数」プロパティの値をbase64ToString関数に渡すとデータの中身を取得することができます。

split(replace(base64ToString(outputs('添付ファイルの取得_(V2)-CSVファイルを取得')?['body/contentBytes']), decodeUriComponent('%EF%BB%BF'), ''), decodeUriComponent('%0D%0A'))


ポイント2:このフローではCSVのデータは1行を前提にしている

このフローでは「CSVの各列のデータを列項目に転記しつつ、PDFファイルを添付する」という仕組み上、CSVのデータが1行のみであることを前提にしています。そのため、下図の通り、CSVのデータを表す配列からfirst関数を使ってデータを取り出しています。

ポイント3:アイテムへのファイル添付は「添付ファイルの追加」アクションで行う

SharePointリストアイテムへのファイル添付は「SharePoint Online」>「添付ファイルの追加」を使って行います。このアクションの「ファイル コンテンツ」欄にPDFの実体を入力します。

"PDFの実体"とは「添付ファイルの取得 (V2)-PDFファイルを取得」アクションの出力のひとつである「コンテンツのバイト数」プロパティです。


フローをGitHubで公開しました(再掲)

このフローをGitHubにアップロードしました。
github.com


今回は以上です。

2022/8/5追記:この投稿を見た質問者のかたから連絡をいただきました

ありがとうございます。小人の靴屋です。
(`・ω・´)シャキーン


2022/8/11 追記:改良版のフローを作りました

ファイルの判定方法を改良しました。
wataruf.hatenablog.com