下記投稿で、Power Automate の関数を使ってMicrosoft Forms のフォームのURLからフォームIDを抜き取るアクションについて触れました。
wataruf.hatenablog.com
これについて、こんな指摘を頂きました。
Forms回答取得のsplitのところなんですが、「&id=」と「?id=」が混ざってないですか?恐らくコメント反映で、取得すべきURLを変更した際にブレているものと思います
気付かなかった。
Σ(´・ω・`)エッ
ほんとだ混ざっている。。※ これを書いている時点でまだなおしてません
(´・ω・`)ショボーン
なおすついでに、クエリストリングのKeyとValueを扱う汎用的な手法を確立しようと考えた結果が今回の投稿です。
クエリストリングとは
URLの末尾につくkeyとvalueの部分の文字列です。
e-Words から引用
クエリ文字列 【query string】 クエリストリング / URLパラメータ
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
手法の概要
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