前回の記事、前々回の記事では、決まったフォーマットの中にある文章から文字列を抽出しました。
これらは機械的に出力された文章を想定していたため、例えば商品名は「・商品名:〇〇〇〇」という風に”・商品名”という文言の右側に商品名があるということが担保されていました。
今回は、手入力されたメールやTeamsの文章で、ある程度ルールは決まっているけど、ふんわりとしかルールがなくて検索をしづらいケースを想定して文字列抽出を行いたいと思います。
この記事でわかること!
- Power Automateで正規表現を使って文字列抽出を行う方法がわかる
- TeamsやOutlookメール本文から文字列を柔軟に抽出する方法の概要がざっくりわかる。
今回やりたいこと・要件
Power Automate for DesktopでRPAチャレンジにチャレンジ☺️記録は89秒弱でした🥲(動画は4倍速です)#PowerAutomateDesktop#PAD #RPAChallenge #RPAチャレンジ pic.twitter.com/qjqjNLfsdm
— じょじお(定時に帰りたい人) (@teijilabo) November 16, 2021
特定のタグが含まれているTwitterのメッセージを、Teamsのチャネルに転送して収集しているのですが、そのツイートにどのようなタグが含まれているのか、ハッシュタグをすべて取得してみたいと思います。
サンプルとして、上の私のツイートをターゲットにします。また、今回は文字列抽出の解説をメインとしたいため、Twitterトリガーからツイートメッセージを取得するのではなく、「作成」アクションにあらかじめ張り付けた状態で文字列抽出を行います。
上記のツイートから、下記のように含まれた4つのタグを全て配列形式で抽出することを今回のゴールとします。
[ "#PowerAutomateDesktop", "#PAD", "#RPAChallenge", "#RPAチャレンジ" ]
正規表現とは?
今回の要件の場合、先にお伝えしたようにsubstring関数で実現するには難しいです。このため正規表現を使おうと思いました。
正規表現とは、正規表現特有の記号を組み合わせて、検索する文字列のパターンを表現できる仕組みです。
例えば、Twitterのハッシュタグであれば下記のような特徴があります。
Twitterのハッシュタグの要件
- #か#(半角か全角のシャープ)から始まる単語
- スペースや句読点を含めることはできない。
- 「!」「?」「‐」「&」などの記号は使用できない。
- 記号は「_(アンダーバー)」のみ含めることができる。
上記を正規表現を使って表現すると下記のようになります。
一見文字化けしてバグった文章に見えますが記号の羅列でハッシュタグを表現しています。正規表現の記号の意味をひとつひとつ解説をすると長くなってしまうのでここでは省略しますが、上記のようにパターン検索を行える仕組みが正規表現です。
正規表現を0から学ぶにはUdemy動画講座がオススメです。Udemyの正規表現をテーマにした動画講座は3つ受講しましたが、その中でも下記の講座が一番わかりやすかったです。
正規表現入門 作業効率アップに役立つ38個の方法購入される場合は、Udemyは頻繁にセールを開催しますので講座をお気に入りに登録しておき、セール時に購入することをオススメします。
Power Automateで正規表現を使う方法
Power Automateのアクションでは2021年11月25日現状、標準では、正規表現をつかって検索するアクションがありません。このため少し裏技的なExcel on the webのマクロ言語であるOfficeスクリプト(Office Scripts)を使ってプログラムコードファイルを作成して実現します。
フロー作成の流れ
下記の2ステップで作業をします!
手順
- Office Scriptを作成する。
- Power Automateフローを作成する。
(STEP1)Office Scriptの準備
▲自動化タブを開き、新しいスクリプトをクリックします。Excelをブラウザで開いていないと自動化タブは表示されませんので注意してください。デスクトップアプリケーション版のExcelでは表示されません。
▲コードエディタが開きますので、赤枠のコードペインのところに下記のソースコードを入力します。(デフォルトで入力されているコードはまるっと削除してから貼り付けてください。)
function main(workbook: ExcelScript.Workbook, targetText: string, pattern: string, flags:string): string[] { let ptn:string = new RegExp(pattern,flags); return targetText.match(ptn) ?? []; }
①スクリプトファイルに名前を付けます。②「スクリプトを保存」をクリックしてスクリプトを保存します。
続いてPower Automateでフローを作成していきます。
Office Scriptsの正規表現プログラムのコード解説
function main(workbook: ExcelScript.Workbook, targetText: string, pattern: string, flags:string): string[] { let ptn:string = new RegExp(pattern,flags); return targetText.match(ptn) ?? []; }
ハッシュタグ以外にも汎用的に使えるように正規表現パターンとフラグを外部から受け取るようにしました。(pattern引数)
検索する文字列と正規表現パターンとフラグの3つを受け取って、検索してマッチした結果を文字列配列で返却します。
??
は、Null合体演算子と呼ばれるものです。??の左辺targetText.match(ptn)
でnullが返ってきた場合つまりハッシュタグのマッチが無かった場合、??の右辺[]
(空の配列)を戻り値にしています。
Null 合体演算子は、左辺の値が null もしくは undefined のどちらか (その他の falsy な値は含みません) に評価された場合にのみ右辺の値を返すことで、この潜在的な危険を回避します:
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
(STEP2)Power Automateフローを作成します。
▲左側のメニューから「作成」をクリックして、「インスタントクラウドフロー」をクリックします。
▲①フロー名を入力します。②「手動でフローをトリガーします。」をクリックして③作成をクリックします。
▲作成アクションを追加します。作成アクションは「データ操作」グループの中にあります。「データ操作」というキーワードで検索して探してください。
作成アクションに下記のツイートメッセージをコピーしてきて張り付けます。
Power Automate for DesktopでRPAチャレンジにチャレンジ☺️記録は89秒弱でした🥲(動画は4倍速です) #PowerAutomateDesktop #PAD #RPAChallenge #RPAチャレンジ
- 場所:Excelを保存した場所をリストから選択します。
- ドキュメントライブラリ:Excelを保存したライブラリをリストから選択します。(Sharepointサイト/OneDrive)
- ファイル:Excelのファイルをリストから選択します。
- スクリプト:STEP1で作成したスクリプトファイルを選択します。
- targetText:作成アクションの動的な値(出力)を入力します。
- pattern:正規表現のパターンを入力します。
[##][A-Za-zA-Za-z一-鿆0-90-9ぁ-ヶヲ-゚ー]+
- flags:gと入力します。
パラメータの下の3つの名前は、作成したスクリプトファイルの引数の名前と対応しています。
flagsにgを渡すことによってマッチするすべての語句を取得しています。gを渡さないとマッチする最初の1個のみの取得となります。
正規表現パターンとフラグについては下記などを参考にしてください。
基本的な正規表現
https://murashun.jp/article/programming/regular-expression.html
正規表現のフラグ
https://ja.javascript.info/regexp-introduction
▲フローを実行したら実行履歴のログを開き、「スクリプトの実行」アクションのカードをクリックします。
▲「スクリプトの実行」アクションの実行ログを見てみると、「出力」セクションのresultに正規表現にマッチした文字列、つまりすべてのハッシュタグが確認できました。
まとめ
以上で正規表現を使ってパターン検索を行う方法について解説しました。