背景
単に、URL Decode をしようとして、Uri.UnescapeDataString がなかったので、どうすれば?ってことを調べた記録
結論
- Uri.Parts() の [Query] を利用して Decode を行う。
例
Uri.Parts("http://contoso?a=" & data)[Query][a]
但し、URL パラメーターが複数あって、それらを必要とする場合には、以下のようにして、パラメーターを接続する必要がある。
Uri.Parts("http://contoso?a=" & data)[Query][a] & Uri.Parts("http://contoso?a=" & data)[Query][{second parameter}]
説明
Uri.Parts の Query解析を利用する
MS-Learn に、以下の例で載っている・・・が分かりにくい・・
let
UriUnescapeDataString = (data as text) as text => Uri.Parts("http://contoso?a=" & data)[Query][a]
in
UriUnescapeDataString("%2Bmoney%24")
Uri.Parts の Query とは
https://***.sharepoint.com/sites/TestForTeams/Shared%20Documents/Forms/AllItems.aspx?id=%2Fsites%2FTestForTeams%2FShared%20Documents%2F%E4%BD%9C%E6%A5%AD%E7%AE%A1%E7%90%86&viewid=7c268b5c%2Dc958%2D412c%2D91f8%2D4b365959236a
こんな感じの Share の URL があったとsて、単純に Uri.Parts({uri})に喰わせると以下になる。
これで以下のことが分かる
- Query では、URL Parameter を抽出してくれる
- Query では、Decode されている
そう、これを利用して、MS-Learn のサンプルでは、以下の部分で Decode してる。
Uri.Parts("http://contoso?a=" & data)[Query][a]
但し、この場合、data に、URL Parameter が含まれている場合、二番目のパラメーター以降は、[Query][{parameter}] として分離されてしまう。
今回の例であれば、以下
- 一つ目のパラメーター id は、そのまま [a] に付随。アクセスするには [Query][a]。サンプルはこれ
- 二つ目のパラメーター viewid は、viewid として分離。アクセスするには [Query][viewid]
今回のURL例に対する利用例
let
ソース = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("ZYxBDoIwEEXvQjJbCpVWamJMFUxc6w5ZlFpDIwXCFPX4Flcmrv68+TOvqqLW+xE3hGBrnXrMTsXYqsmMg+19rAdH0HqD5GLQH4fpYpRDcl4ubkCTYtCzM71HErpQyK47eeMwVji+d/a2BXr8/of8NQT8d4QllBnsCxAHKDlIBrKAcg2yBJkug0gg59c5SSh/WvMK/rWmPG+YBlpowfIQWUoXEun9S82KM8EEXXEV1fUH", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [CopiedURL = _t]),
変更された型 = Table.TransformColumnTypes(ソース,{ {"CopiedURL", type text}}),
DecodedURL = Table.AddColumn(変更された型, "DecodedURL", each Uri.Parts("https://contso.com?url_1stParam=" & [CopiedURL])[Query][url_1stParam], Text.Type),
uri = Table.AddColumn(DecodedURL, "uri", each (Uri.Parts([CopiedURL])), Text.Type),
id = Table.AddColumn(uri, "id", each ([uri][Query][id]), Text.Type),
viewid = Table.AddColumn(id, "viewid", each ([uri][Query][viewid]), Text.Type),
SiteURL = Table.AddColumn(viewid, "SiteURL", each ([uri][Scheme] & "://" & [uri][Host] & "/sites/" & Text.BetweenDelimiters([DecodedURL], "/sites/", "/") & "/"), Text.Type),
FolderURL = Table.AddColumn(SiteURL, "FolderURL", each ([uri][Scheme] & "://" & [uri][Host] & [id]), Text.Type)
in
FolderURL
あとがき
単純に、UnescapeDataString() が欲しいよね