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編集長を兼任。2024年8月からキーマンズネットでPower Automateの連載を開始。好きなサービスはPower AutomateやLogic Apps。好きなアーティストはZABADAKとSound Horizon。
担当記事一覧