この記事では、メール本文から特定の文字列を抽出する方法について解説します。
図のようなメールの中から、”操作者”と”日時”の値を取得したいという要件です。
この記事でわかること
- Power AutomateのindexOf関数の使い方がわかる
- Power Automateのsubstring関数の使い方がわかる
- Power Automateのadd関数の使い方がわかる。
- メール受信した時に自動的にメールの文章から特定の文字列を切り取って他のアクションに使う方法がわかる。
要件・やること
要件
- 下記のメール本文から赤字の部分を切り取り取得します。
- 赤字の文字列はそれぞれ固定の文字数で、操作者IDは10文字、日時はyyyy/mm/ddの10文字で記載されているものとする。
◇◇ 株式会社〇〇 様
いつも、お世話になっております。
このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。このメールはテストメールです。
操作者:F000000000
日時:2021/11/25
以上、宜しくお願いします。
—
株式会社てじらぼ
じょじお
”操作者”、”日時”という固定の文言が記載されているので、これをキーワードとしてメール本文から検索すれば良さそうですね。
文字列抽出に使うPower Automateの関数
今回は下記の関数を使って文字列抽出を行います。実際の使用方法は後述で解説しています。
- indexof
- add
- substring
参考:Power Automate 式関数のリファレンス
https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference
関数 | 用法 | 説明 |
---|---|---|
indexOf | indexOf(‘文字列’, ‘検索文字列’) | 文字列から検索文字列を探して、開始位置を教えてくれます。 |
add | add(数字1,数字2) | 渡した二つの引数の数字を足し算します。 |
substring | substring(‘文字列’, 開始インデックス, 取得する文字列の長さ) | 文字列から、引数1に渡した位置から引数2に渡した文字数分だけ文字列を切り取ります。Excelのmid関数に近いです。 |
Power Automateフロー作成手順
フロー作成前に「試験的な機能」をオンにしています。関数の入力がとってもしやすくなるのでおすすめです。下記の記事で紹介していますのでご存じない方はご参考になさってください。
まず、メール受信をトリガーにする前に関数の動作を確認するために、インスタントクラウドフローでテストフローを作成します。
▲左側のメニューから「作成」を選択して「インスタントクラウドフロー」をクリックします。
▲手動でフローをトリガーします。を選択してフロー名を入力して作成をクリックします。
▲「データ操作」コネクタの中にある「作成」アクションを追加します。見つからない時は「データ操作」と検索して探してください。
「作成」アクションの入力パラメータの中に、先程のメール本文をコピーしてきて張り付けます。
ここで入力している関数については後述で解説しています。
▲アクションを追加したらテキストボックスを1度クリックしたあと、右側に表示される「fx(式を追加)」ボタンをクリックして関数入力モードにします。
▲関数入力モードの状態で下記の関数を入力します。関数入力モードじゃない状態で関数を入力してもただの文字列として認識されてしまうので注意してください。
substring(outputs('作成'),add(indexOf(outputs('作成'),'操作者'),4),10)
▲関数内のoutputs('作成')
という文言は、関数入力ボックスの下に表示されている「動的な値」の一覧から「作成」アクションの「出力」をクリックして入力しています。動的な値は、このようにクリックで関数の中で使うことができます。手入力では入力ミスの可能性が増えるのでなるべくクリックで入力しましょう。
▲有効な関数が入力されると、このようにfxマークがついたカード表示になります。
STEP3と同様に、”日時”の部分を取得するための関数を入力します。
substring(outputs('作成'),add(indexOf(outputs('作成'),'日時'),3),10)
▲フローを実行したらログを見てみましょう。「作成2」アクションの出力には操作者のID”F000000000”、「作成3」のアクションでは”日時”2021/11/25が正しく取得出来ていることがわかります。
Power Automate 関数の解説
substring関数
substring関数は文字列から文字列を切り取る関数です。2つ目の引数に何文字目から切り取るのか、3つ目の引数に何文字切り取るのか、を指定します。たとえば substring('HELLO,WORLD!',7,1)
とすると、HELLO,WORLD!という文字列から7番目の文字を開始位置として1文字切り取ります。0から数え始めますので7番目の文字列はWです。Wから1文字、つまりWのみが取得されます。
substring('HELLO,WORLD!',7,3)
上記のようにすると、Wから3文字切り取りますのでWORが取得されます。
substring('HELLO,WORLD!',7)
というふうに3番目の引数を省略するとWから文章の最後までが取得されます。つまりWORLD!という結果になります。
substring(‘HELLO,WORLD!’,7,1) ⇒ W
substring(‘HELLO,WORLD!’,7,3) ⇒ WOR
substring(‘HELLO,WORLD!’,7) ⇒ WORLD!
indexOf関数
文字列の切り取り方法がわかりましたので、文字列を検索する方法を見てみましょう。今回の要件としては、”操作者”というキーワードを検索してその後ろの操作者IDを切り取りたいです。なのでまず”操作者”というキーワードを検索します。文章から文字列を検索するにはindexOf関数を使います。
indexOf(outputs('作成'),'操作者')
1番目の引数outputs('作成')
は、作成アクションに張り付けたメール本文が入っています。
2番目の引数は検索するキーワードです。
この関数を実行すると365
という数字がかえってきます。この結果から”操作者”というキーワードはメール本文の365文字目にある、ということが分かりました。この数字をsubstringの第2引数に渡せばいい感じにいけそうですね。ただ、365は” 操作者”という言葉の” 操”という文字の位置です。実際に切り取りたいのでは、操作者:F000000000
という文言の操作者うしろのコロンの次の文字から、となりますので、つまり”操”から数えて4文字後ろからです。このため365という結果の数字に4を足す必要があります。足し算を行うには次で紹介するadd関数を使います。
add関数
indexOf(outputs('作成'),'操作者')
に4を足す方法として、 indexOf(outputs('作成'),'操作者') + 4
としてみたところエラーになりました。Power Automateで計算を行うには関数を使うようです。足し算はadd関数
を使います。
add(indexOf(outputs('作成'),'操作者'),4)
上記のようにすると、365に4を足した369という数字を取得することができました。
まとめ
以上の結果を踏まえて、下記の関数が完成しました。
substring(outputs('作成'),add(indexOf(outputs('作成'),'操作者'),4),10)
substringの第1引数には、メール本文を張り付けたoutputs('作成')
substringの第2引数には、 操作者というキーワードで検索した結果に4を足した数字add(indexOf(outputs('作成'),'操作者'),4)
substringの第3引数は、切り取る文字の数です。操作者IDは10桁のため、10
としました。
Outlook受信をトリガーにしてみる
関数の使い方が分かりましたので、メールの受信をトリガーにしたフローに作り変えてみたいと思います!
▲左側のメニューから作成をクリックし、自動化したクラウドフローをクリックします。
▲①フロー名を入力して、②「新しいメールが届いたとき」を選択し「作成」をクリックします。
トリガーとなる条件(フローが発動する条件)を設定します。今回は”操作者IDのテスト”というメールタイトルのメールを受信したときにフローを発動するようにするため、件名フィルターに”操作者IDのテスト”と入力します。
「データ操作」コネクタの中にある「作成」アクションを追加します。見つからない時は「データ操作」と検索して探してください。
substring(triggerOutputs()?['body/body'],add(indexOf(triggerOutputs()?['body/body'],'操作者'),4),10)
▲作成アクションに上記の関数を入力します。関数の中のtriggerOutputs()?['body/body']
は、「新しいメールが届いたとき」トリガーの動的な値です。動的な値一覧からクリックで選択して入力してください。
substring(triggerOutputs()?['body/body'],add(indexOf(triggerOutputs()?['body/body'],'日時'),3),10)
▲2つ目の「作成」アクションを追加します。上記の日時を取得するための関数を入力します。
▲フローが完成しました。
フローを実行しましょう。メール受信をトリガーとしていますので、条件となる「操作者IDのテスト」というメールを自分自身に送信してみます。数秒まつとフローが実行されますのでログを確認してみましょう。
フロー実行ログの「作成」アクション、「作成2」アクションのログを見てみると、それぞれ操作者IDと日時が取得出来ていることが分かるかと思います。
抽出に成功した文字列はもちろんその後のアクションに使えるのでExcelに書き込んだり、Teamsのメッセージに埋め込んだりすることが可能です。
まとめ
以上で、メール受信時にメール本文から文字列を抽出する方法について解説しました。今回は検索する文字が固定長で、さらに記載されている場所もわかりやすかったので、substring関数とindexOf関数を使って比較的に簡単に抽出できたかと思います。
▲次の記事では、商品名のように文字数がバラバラのケースを想定して文字列抽出をトライしてみたいと思います。宜しければそちらもご覧ください。