ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

Power AutomateでURLのクエリストリングを配列として取得する

下記投稿で、Power Automate の関数を使ってMicrosoft Forms のフォームのURLからフォームIDを抜き取るアクションについて触れました。
wataruf.hatenablog.com

これについて、こんな指摘を頂きました。

Forms回答取得のsplitのところなんですが、「&id=」と「?id=」が混ざってないですか?恐らくコメント反映で、取得すべきURLを変更した際にブレているものと思います


気付かなかった。

Σ(´・ω・`)エッ


ほんとだ混ざっている。。※ これを書いている時点でまだなおしてません

(´・ω・`)ショボーン


なおすついでに、クエリストリングのKeyとValueを扱う汎用的な手法を確立しようと考えた結果が今回の投稿です。

クエリストリングとは

URLの末尾につくkeyとvalueの部分の文字列です。

e-Words から引用

クエリ文字列 【query string】 クエリストリング / URLパラメータ

  • クエリ文字列とは、WebブラウザなどがWebサーバに送信するデータを、送信先を指定するURLの末尾に特定の形式で表記したもの。
  • URLの末尾に「?」(クエスチョンマーク)を付け、続けて「名前=値」の形式で内容を記述する。値が複数あるときは「&」(アンパサンド)で区切り、「?名前1=値1&名前2=値2&名前3=値3」のように続ける。
  • HTMLのフォーム(form要素)に記入された内容をHTTPのGETメソッドでWebサーバに送信する形式として定められたもので、Webアプリケーションなどでクライアントからサーバにデータを送信する方式として広く利用されている。

クエリ文字列(クエリストリング / URLパラメータ)とは - 意味をわかりやすく - IT用語辞典 e-Words

Microsoft Forms におけるフォームのURL

Microsoft Forms には2つのフォームがあります。それぞれURLのクエリストリングの構造が異なります。どちらにもフォームのIDが含まれています。

管理用フォーム

回答フォームを作成したり、回答の集計結果を参照するためのフォームです。

例:
https://forms.office.com/pages/designpagev2.aspx?lang=ja-JP&origin=OfficeDotCom&route=Start&sessionid=e8cf49bf-ba21-4e5e-ba79-fc0c861eab7d&subpage=design&id=o96MaMLu10q2WzsrLlNYiJXYCzX_j15Gss7zlDt9K0N
UOEtPS0QzVVNTVTNSN1NFWVUwSU5LNDdaVy4u
&analysis=true


回答用フォーム

こちらは回答を行うためのフォームです。

例:
https://forms.office.com/Pages/ResponsePage.aspx?id=o96MaMLu10q2WzsrLlNYiJXYCzX_j15Gss7zlDt9K0NUOEtPS0QzVVNTVTNSN1NFW
VUwSU5LNDdaVy4u


注意:短縮URLにはクエリストリングがない

回答フォームの短縮URLにはURLの末尾にクエリストリングがありません。そのため、今回の手法の対象になりません。

例:
https://forms.office.com/r/6h8AaRbwG8

手法の概要

Power Auttomate のフローを使って以下の処理を行います。

  • 先頭から「?」までの文字列を削除する
    • https://forms.office.com/pages/designpagev2.aspx?lang=ja-JP&(省略)
  • 「&」で区切って「(key)=(value)」の配列にする
  • 「(key)=(value)」の配列を簡易版JSON Dictionary の形式に変形する

簡易版JSON Dictionary の形式にした配列にKey を渡すことによって目的のValue を得ることがきます。

例:

入力:
outputs('作成-簡易版JSON_Dictionaryを作る')?['id']


出力:
o96MaMLu10q2WzsrLlNYiJXYCzX_j15Gss7zlDt9K0NUOEtPS0QzVVNTVTNSN1NFWVUwSU5LNDdaVy4u

作成したフローの図


説明

このアクションが整形対象のURLです。末尾にクエリストリングがついています。

そのURLを「選択」アクションによってKeyとValueの形式にします。

コードのプレビュー:

"from": "@split(split(outputs('クエリストリング付きのURL'),'.aspx?')[1],'&')",
"select": {
"@{substring(item(),0,indexOf(item(),'='))}": "@substring(item(),add(indexOf(item(),'='),1))"
}

「選択」アクションの出力は以下の通りです。


それをさらに変形して簡易版JSON Dictionary の形式にします。

コードのプレビュー:

json(concat('{',replace(replace(replace(replace(string(body('選択-フォームURLのクエリストリングをkeyとvalueの配列にする')),'{',''),'}',''),'[',''),']',''),'}'))

その出力がこちらです。

この簡易版JSON Dictionary の形式にした配列にKey を渡すことによって目的のValue を得ることがきます。

例(再掲):

入力:
outputs('作成-簡易版JSON_Dictionaryを作る')?['id']


出力:
o96MaMLu10q2WzsrLlNYiJXYCzX_j15Gss7zlDt9K0NUOEtPS0QzVVNTVTNSN1NFWVUwSU5LNDdaVy4u

最後に

この方法はMicrosoft Formsに関わらずパラメータ付きのURLから目的のValueを取得した場面で応用できると思います。ご活用ください。

今回は以上です。