Power Aurtomateでクエリ文字列から任意の値だけを取り出す

URLに付与されるクエリ文字列というものがあります。

例えば、はてなブログの下書き記事の編集画面ではedit?以降がクエリ文字列になります。

https://blog.hatena.ne.jp/{はてなID}/{ブログID}.hatenablog.com/edit?entry=**********&utm_campaign=new_entry&utm_medium=referral&utm_source=admin-sidebar

クエリ文字列は&で区切られて複数設定されていますが、この中の一つだけ取り出したい、という事があったので、Power Aurtomateで実行する方法を調べてみました。

今回の要件

本記事では、例に挙げた「はてなブログの下書き記事の編集用URL」から、entryで指定されているID(以降、entry_idとする)を取得することを目指します。

※クエリ文字列から特定の値を抽出するケースであれば、はてなブログに関わらず、汎用的に利用できると思います。

事前調査

「はてなブログの下書き記事の編集用URL」について、編集時の状態などによって差異がある事が分かったので、パターンをいくつか集めました。

  • 一度下書きを保存した後で、記事一覧から開いた状態(一番シンプルなURL)
    • https://blog.hatena.ne.jp/{はてなID}/{ブログID}.hatenablog.com/edit?entry=**********
  • 新規作成から記事を作成し、下書き保存したした状態(新規作成画面から移動していない場合)
    • https://blog.hatena.ne.jp/{はてなID}/{ブログID}.hatenablog.com/edit?entry=**********&utm_campaign=new_entry&utm_medium=referral&utm_source=admin-sidebar
  • 新規作成から記事を作成し、編集モードをMarkdownに変更してから下書き保存したした状態(新規作成画面から移動していない場合)
    • https://blog.hatena.ne.jp/{はてなID}/{ブログID}.hatenablog.com/edit?entry=**********&syntax=markdown&title=&utm_campaign=new_entry&utm_medium=referral&utm_source=admin-sidebar

最初のパターンだけであれば、entry=までの文字列をすべて消してしまうという方法でもよかったのですが、他のパターンを考慮するとその方法は使えませんでした。そのため、どのパターンでもentry_idが取得できるような仕組みを考えました。

Power Automateでのフローの作成

トリガーとデータの作成

今回は、URL自体は事前に調査したパターンのものを手動で入力し、手動で実行する形を取ります。

手動でフローをトリガーし、「作成」でURLを入れておきます。

URLには、先ほどのパターンのうち、一番複雑な「新規作成から記事を作成し、編集モードをMarkdownに変更してから下書き保存したした状態」のものをベースに少し文字を置き換えたものを使いました。

https://blog.hatena.ne.jp/hatena_id/blog_id.hatenablog.com/edit?entry=100000000000000000&syntax=markdown&title=&utm_campaign=new_entry&utm_medium=referral&utm_source=admin-sidebar

クエリ文字列全体の抽出

まず、edit?以降のクエリ文字列だけ抽出したいと思います。

アクションの「作成」を追加して、split式とlast式を併用して値を取り出します。

実際の式はこちらです。

last(split(outputs('作成'),'?'))

赤字の?で分割して、後ろの青字の部分だけ残すイメージです。

一旦ここまで実行して結果を確認します。

クエリ文字列の分割

続いて、クエリ文字列をパラメーター単位で分割していきます。

先ほどと同様に、アクションの「作成」を追加してsplit式を使います。ただし、今回はlast式は使いません。

実際の式はこちらです。

split(outputs('作成_2'),'&')

再度、ここまでの段階で一度実行して結果を確認します。

パラメーター毎にデータが整理できました。

必要なパラメーターの選択

今回欲しいのはentry_idだけなので、この値だけを選択したいと思います。

アレイのフィルター処理のアクションでフィルタを行いたいのですが、そのために一度、作成したデータをjsonとして解析します。

「JSONの解析」アクションを追加し、以下のスキーマを入力します。*1

{
    "type": "array",
    "items": {
        "type": "string"
    }
}

つづいて、「アレイのフィルター処理」アクションを追加し、entry_idを抽出します。

これもいったん実行してみましょう。

entry_idだけ抽出する事が出来ました。

entry_idの抽出

最後に、entry=の部分を削除し、実際のentry_idである数字の部分だけ抽出したいと思います。

アクションの「作成」を追加して、first式とsplit式とlast式を併用して値を取り出します。

実際の式です。

last(split(first(body('アレイのフィルター処理')),'='))

first式を使っている理由ですが、アレイのフィルター処理の結果はアレイ型になるので、そのままだと分割できないためです。今回は想定するデータとしてはアレイにならないと分かっているのですが、first式を使ってアレイから単体の値として強制的に取り出しています。

これも実行してみましょう。

無事、entry_idである数字の部分だけ抽出する事が出来ました。

応用編:フローのスリム化

ここまで、ステップを確認しながら進めるために「作成」のアクションを何度も使いましたが、実際には式を複数使ってもう少しシンプルにすることが可能です。

具体的には、先ほどのアクションのうち、「クエリ文字列全体の抽出」と「クエリ文字列の分割」は、「JSONの解析」にまとめてしまう事が可能です。

フロー全体はこのようになります。

「JSONの解析」の「コンテンツ」で以下の式を設定しています。

split(last(split(outputs('作成'),'?')),'&')

おわりに

実際に、テックブログの運用の中で寄稿者に「はてなブログの下書き記事の編集用URL」をレビュー時に申請してもらっていたのですが、後続のフローで意図しない値になることが多発したので、URLのパターンを分析し、どのパターンでもentry_idが取得できるようにしたのが本記事の発端です。

クエリ文字列のパターンは、はてなブログに限らず基本同様になると思うので、汎用的に使える内容になっているかと思います。参考になれば幸いです。

*1:もちろん、前の実行結果を元にサンプルから生成する事も出来ます。

執筆担当者プロフィール
舟越 匠

舟越 匠(日本ビジネスシステムズ株式会社)

人材開発部に所属。社内向けの技術研修をメインにしつつ、JBS Tech BlogやMS認定資格取得の推進役もやっています。資格としてはAzure Solutions Architect Expertを所持。好きなサービスはPower Automate / Logic Apps。好きなアーティストはZABADAK。

担当記事一覧