【Power Automate】メール本文の注文内容をExcelに転記

Power Automate
この記事は約13分で読めます。

Outlookの注文内容メールをExcelに転記したいけど、
注文商品・注文数が毎回違うときはどうしたら良いの?

もちぱん
もちぱん

For eachによる繰り返し処理で、
毎回異なる商品数でも出力することができますよ

本記事では、件名に「注文受付」というキーワードが含まれたOutlookメールを受信すると、Excelに番号を自動転記するフローを紹介します。

この記事でわかること
  • 文字の抽出方法
  • Excelへの転記方法
  • 注文商品が複数個ある場合の転記方法



作成するフローの内容

本記事では、下記のフローを作成します。


  

フロー全体のショット

抽出したい注文情報が多いほど、フローは長くなります。

トリガー ~ 注文番号・注文日の取得


顧客情報 取得


商品情報 取得

  • 本記事では、注文商品の数に応じてExcelの行数が増えるフローを作成します。
    そのため、同じ顧客名の行が複数存在する場合があります。(同じ顧客名で異なる商品名の行)
  • 商品の数だけループ処理を行う関係上、商品情報を転記するアクションはフローの最後に配置します。


 

事前準備

注文転記用Excel

注文番号転記用のExcel(テーブルあり)が必要です。
テーブル名は、わかりやすい名前に変更することをお勧めします。

クラウド版のPower AutomateでExcelを処理する際は、必ず対象のExcelファイルを「テーブル」に変換する必要があります。


 

注文受付メール

情報を転記したいメールを準備します。
本記事では、Chat GPTが生成してくれた下記のメールを利用します。

  • 各項目は、定型文で記載されている必要があります。
    (例:「注文番号:」、【商品詳細】)
  • 各商品名は同じ記号で区切られている必要があります。
    (例: 「・」)


 

自動化したクラウドフローの作成

フローの作成に入ります。
作成画面で「自動化したクラウドフロー」を選択します。



下記画面でフロー名とトリガーを設定します。
トリガーは「新しいメールが届いたとき」です。

「Outlook.com」と「Office 365 Outlook」があるので、適切な方を選んでください。


 

「新しいメールが届いたとき」の設定

パラメータを設定します。

差出人注文受付メールがいつも特定の差出人から届く場合は、
そのメールアドレスを入力してください。
件名フィルター「注文受付」と入力します。
フォルダー注文受付メールが届くフォルダーを指定してください。


 

「Htmlからテキスト」アクション追加

HTML形式で受信するメールを、プレーンテキストに変換するため、「Htmlからテキスト」アクションを追加します。
これにより、HTMLの様々なタグやスタイル情報を取り除くことができます。


「Content Conversion」の「Htmlからテキスト」アクションを選択します。



パラメータを設定します。

「コンテンツ」内では、動的なコンテンツより「本文」を選択してください。
 

注文番号と注文日を抽出

最初に、下記情報を抽出します。


 

注文番号(桁数定型)の抽出

注文番号は決まって6桁であることを前提として抽出しています。
※注文番号の桁数が異なる場合は、「注文日」の抽出方法を参照にしてください。


プレーンテキストに変換後の文章から「注文番号:」という文字列を検索するため、
「Text Functions」より「テキストの位置の検索」アクションを追加します。


 
パラメータを設定します。

テキスト検索対象テキストを設定します。
動的なコンテンツより、「Htmlからテキスト」項目下の「プレーンテキストコンテンツ」を選択します。
検索するテキスト「注文番号:」と手入力します。


「注文番号:」の後の番号6桁を抽出するため、「部分文字列」アクションを追加します。



パラメータを設定します。

テキスト動的なコンテンツより、「Htmlからテキスト」項目下の「プレーンテキストコンテンツ」を選択します。
開始位置抽出したい文字の開始位置を設定します。
番号の先頭が、「注文番号:」の「注」を0としたときに、何文字目になるかをadd関数で指定します。

本記事では半角スペースも含めて6文字目です。
※半角スペースを除く処理を後で行うため、スペースを含めずにカウントしてもOK


そのため、以下の式を入力します。
add(body('テキストの位置の検索_注文番号検索'),6)

body('テキストの位置の検索_注文番号検索')の箇所は、動的なコンテンツから「注文番号:」の位置を検索した結果を利用します。
長さ注文番号は6桁なので、「6」と半角で入力します。


 

このように文字の抽出は、下記ステップで行います。

  1. 「テキスト位置の検索」で探したい文字手前の定型文の位置を検索
  2. 「部分文字列」でその位置から何文字後の文字をどのくらい抽出するかを設定


 

注文日(桁数不定)の抽出

注文日は、月日を0埋めされておらず、桁数が一定ではないことを前提として抽出します。


プレーンテキストに変換後の文章から「注文日:」という文字列を検索するため、
「Text Functions」より「テキストの位置の検索」アクションを追加します。


 
パラメータを設定します。

テキスト動的なコンテンツより、「Htmlからテキスト」項目下の「プレーンテキストコンテンツ」を選択します。
検索するテキスト「注文日:」と手入力します。



抽出したい文字の長さが一定ではない場合、その文字の後に来る定型文字の位置を検索します
本記事では、注文日の後の項目は【商品詳細】なので、その文字の位置を検索します。


プレーンテキストに変換後の文章から【商品詳細】という文字列を検索するため、
「Text Functions」より「テキストの位置の検索」アクションを追加します。



パラメータを設定します。

テキスト動的なコンテンツより、「Htmlからテキスト」項目下の「プレーンテキストコンテンツ」を選択します。
検索するテキスト【商品詳細】と手入力します。


注文日の日付を抽出するため、「部分文字列」アクションを追加します。



パラメータを設定します。

テキスト動的なコンテンツより、「Htmlからテキスト」項目下の「プレーンテキストコンテンツ」を選択します。
開始位置日付の先頭が、「注文日:」の「注」を0としたときに、何文字目になるかをadd関数で指定します。
本記事の場合、半角スペースを含めると5文字目です。
※半角スペースを除く処理を後で行うため、スペースを含めずにカウントしてもOK


そのため、以下の関数を入力します。
add(body('テキストの位置の検索_注文日検索'),5)

body('テキストの位置の検索_注文日検索')の箇所は、動的なコンテンツから「注文日:」の位置を検索した結果を利用します。
長さ桁数が不定の場合、sub関数を使用して抽出したい日付の文字数を動的に算出します。
日付の後に続く【商品詳細】の位置から、日付の開始位置(「開始位置」の関数と同じ)を引きます。


そのため、以下の式を入力します。
sub(body('テキストの位置の検索_商品詳細位置'),add(body('テキストの位置の検索_注文日検索'),5))
→間の15文字「2024年7月16日 」が動的に取得できます。
※半角スペースも含まれた状態で取得されますが、後で対応するのでOKです。



これで、注文番号と注文日抽出のための設定は完了です。
フローのスクリーンショットはこちらを見てください。

顧客情報の抽出

メール本文では、注文商品情報より後に記載されている顧客情報ですが、
フローの便宜上、ループ処理が必要な商品情報は一番最後に抽出します。


そのため、先に顧客情報を抽出します。


各必要情報に、「テキスト位置の検索」アクションを追加します。
※パラメーターの「テキスト」では、動的なコンテンツより、「Htmlからテキスト」の「プレーンテキストコンテンツ」を選択します。

氏名検索するテキスト:
「氏名:」
住所検索するテキスト:
「住所:」
郵便番号検索するテキスト:
「〒」
電話番号検索するテキスト:
「電話番号:」
メール検索するテキスト:
「メール:」
顧客情報の後に記載されている定型文検索するテキスト:
「この注文を」

※本記事では、下記の定型文のテキスト位置を抽出するため


続いて各顧客情報に対し、「部分文字列」アクションを追加します。
パラメーターの「テキスト」では、動的なコンテンツより、「Htmlからテキスト」の「プレーンテキストコンテンツ」を選択します。

氏名抽出する文字の長さは不定です。

開始位置:
add(body('テキストの位置の検索_氏名'),4)

長さ:
sub(body('テキストの位置の検索_住所'),add(body('テキストの位置の検索_氏名'),4))
郵便番号抽出する文字の長さは定型です。

開始位置:
add(body('テキストの位置の検索_郵便番号'),1)

長さ:
8
住所郵便番号以降の住所を取得します。
抽出する文字の長さは不定です。

開始位置:
add(body('テキストの位置の検索_郵便番号'),10)

長さ:
sub(body('テキストの位置の検索_電話番号'),add(body('テキストの位置の検索_郵便番号'),10))
電話番号抽出する文字の長さは不定です。

開始位置:
add(body('テキストの位置の検索_電話番号'),6)

長さ:
sub(body('テキストの位置の検索_メール'),add(body('テキストの位置の検索_電話番号'),6))
メール抽出する文字の長さは不定です。

開始位置:
add(body('テキストの位置の検索_メール'),5)

長さ:
sub(body('テキストの位置の検索_定型文'),add(body('テキストの位置の検索_メール'),5))



これで、顧客情報抽出のための設定は完了です。
フローのスクリーンショットはこちらを見てください。

  

商品情報の抽出

フローの最後に商品情報を抽出し、今までのステップで取得してきた注文日時や顧客情報も合わせてExcelに出力します。


注文商品や注文数等は、各注文に合わせて動的に取得できるようにします。


  1. まず、【商品詳細】~【顧客情報】の間にある全体の商品情報を取り出します。
  2. その後、注文商品の数だけループして各商品の商品名、数量、価格を抽出します。
  3. 最後に、Excelに出力します。


 

商品全体の情報を抽出

注文商品一覧が記載されている後は、決まって【顧客情報】が記載されていることを前提とし、
テキスト位置の検索」アクションより【顧客情報】の文字の位置を検索します。

テキスト動的なコンテンツより、「Htmlからテキスト」項目下の「プレーンテキストコンテンツ」を選択します。
検索するテキスト【顧客情報】



続いて、【商品詳細】~【顧客情報】の間にある全体の商品情報を、「部分文字列」アクションで取り出します。

テキスト動的なコンテンツより、「Htmlからテキスト」項目下の「プレーンテキストコンテンツ」を選択します。
開始位置最初の商品の先頭が、【商品詳細】の【を0としたときに、何文字目になるかをadd関数で指定します。本記事の場合、半角スペースを含めると7文字目です。
※半角スペースを除く処理を後で行うため、スペースを含めずにカウントしてもOK

そのため、以下の式を入力します。
add(body('テキストの位置の検索_商品詳細位置'),7)

body('テキストの位置の検索_商品詳細位置')の箇所は、動的なコンテンツから注文日抽出の際に検索した【商品詳細】位置の結果を利用します。
長さsub関数を使用して抽出したい商品全体の情報を動的に算出します。
注文商品の後に記載されている【顧客情報】の位置から、最初の商品の開始位置(「開始位置」の関数と同じ)を引きます。

そのため、以下の式を入力します。
sub(body('テキストの位置の検索_顧客情報'),add(body('テキストの位置の検索_商品詳細位置'),7))


 
これで、注文商品全体の情報を抽出できました。

 

各商品情報を抽出

商品全体の情報から、今度は各商品情報に分割して抽出します。



「Data Operation」の「作成」アクションを追加します。

入力本記事では、注文商品の先頭に「・」があるため、この記号ごとにsplit関数で商品を区切ります。
split(trim(body('部分文字列_商品情報')),'・')

body('部分文字列_商品情報')の箇所は、動的なコンテンツから「商品情報」の部分文字列を抽出した結果を利用します。
※trim関数を利用すると、商品全体の情報の前後にある改行コード「\n」を除外することができます。



「作成」アクションで商品情報を分割すると、文頭・文末の改行コードはなくなるものの、
配列内の値に空白を含む場合があります。



この空白を出力することを防ぐため、「Data Operation」の「アレイのフィルター処理」アクションを利用します。

From動的なコンテンツより、「作成」項目下の「出力」を選択します。
Filter Query空白の値を除外するため、以下の内容を設定します。

左辺:動的なコンテンツより「current item」を選択します
演算子: is not equal to
右辺: 空白のままでOKです



そうしてフィルタリングした商品リストがこちらです。



このリストの1つ1つに後続処理を実行するため、
「Control」アクションの「それぞれに適用する」を選択します。

Select An Output…動的なコンテンツより「アレイのフィルター処理」の「Body」を選択します。


 
数量を抽出するため、「テキスト位置の検索」アクションを追加します。

テキスト動的なコンテンツより、「それぞれに適用する」の「current item」を選択します。
検索するテキスト:「- 数量:」



続いて、価格を抽出するため、「テキスト位置の検索」アクションを追加します。

テキスト動的なコンテンツより、「それぞれに適用する」の「current item」を選択します。
検索するテキスト:「- 価格:」



続いて各商品の必要情報を取得するため、「部分文字列」アクションを追加します。
パラメーターの「テキスト」では全て、動的なコンテンツより、「それぞれに適用する」の「current item」を選択します。

商品名開始位置:
0

長さ:
商品名の次に記載されている「- 数量」の1文字手前まで抽出するため、以下の式を入力します。
sub(body('テキストの位置の検索_数量'),1)
数量開始位置:
add(body('テキストの位置の検索_数量'),6)

長さ:
数量の次に記載されている「- 価格」の手前まで抽出するため、以下の式を入力します。
sub(body('テキストの位置の検索_価格'),add(body('テキストの位置の検索_数量'),6))
価格開始位置:
add(body('テキストの位置の検索_価格'),7)

長さ:
指定なし


取得した情報をExcelに出力

前までのステップで取得した注文番号~商品までのすべての情報をExcelに出力します。
「Excel」のコネクタより「表に行を追加」アクションを追加します。
※「それぞれに適用する」内に組込んでください。

場所本記事では、OneDrive for Business を選択します。
SharePointでも可。
ドキュメントライブラリ本記事ではOneDriveを選択します。
ファイル注文管理表が格納されているファイルを選択します。
テーブル適切なテーブルを選択します。



詳細パラメータを設定します。
trim関数を利用することで、部分文字列で抽出した文字の前後にある空白を削除することができます。

注文日trim(body('部分文字列_注文日'))
注文番号trim(body('部分文字列_注文番号'))
商品名trim(body('部分文字列_商品名'))
数量trim(body('部分文字列_価格'))
価格trim(body('部分文字列_価格'))
顧客氏名trim(body('部分文字列_氏名'))
郵便番号trim(body('部分文字列_郵便番号'))
住所trim(body('部分文字列_住所'))
電話番号trim(body('部分文字列_電話番号'))
メールアドレスtrim(body('部分文字列_メール'))



これで、商品情報取得~Excel出力のための設定は完了です。
フローのスクリーンショットはこちらを見てください。

フローの保存とテスト

保存をし、テストを実行してみてください。
必要情報が全て転記されていたら成功です。


 

コメント