0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Microsoft Power PlatformAdvent Calendar 2023

Day 1

Power Query: URL Decode (Uri.UnescapeDataString) は、Uri.Parts()[Query] を利用する

Posted at

背景

単に、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})に喰わせると以下になる。

image.png

これで以下のことが分かる

  • 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]

image.png

今回のURL例に対する利用例

SiteURL や FolderURL を取得する例
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() が欲しいよね :sweat:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?