如何在 M 语言 PowerQuery 中包含变量

如何在 M 语言 PowerQuery 中包含变量

在 Excel365 中,我尝试构建一个包含一些 POST 数据的查询,并且一切正常,直到我尝试将这些值设为来自工作簿中命名单元格的变量。在下面的示例中,我有ApiKey变量的值成功填充在第二行,但当我到达将其添加到列表的那一行时myContent,我不知道如何插入该值。如何在第 5 行的“M 语言”中指定“ApiKey”是一个变量,以便它不会被解释为字符串,但仍括在引号中?

let
    ApiKey = Excel.CurrentWorkbook(){[Name="ApiKey"]}[Content]{0}[Column1],
    BaseURL = "https://www.example.com/api",
    myContent = "{
        ""key"": ""ApiKey"",
        ""datarequest"": ""all""
        }",
    myData=Json.Document(myContent),
    Source = Json.Document( 
        Web.Contents(
            BaseURL,
            [
                Headers=[#"Content-Type" = "application/x-www-form-urlencoded"],
                Content=Text.ToBinary(Uri.BuildQueryString(myData))
            ]
        )
    )
    
in
    Source

如果我像这样将 API 密钥“硬编码”到内容列表中,一切都会正常……但我需要它作为我存储的变量的值:

 myContent = "{
        ""key"": ""H5t9sdf7K-FAKEAPIKEY-LHkeQr2"",
        ""datarequest"": ""all""
        }",

我尝试过的方法包括:

 myContent = "{
        ""key"": """&ApiKey&""",
        ""datarequest"": ""all""
        }",

 myContent = "{
        ""key"": ""@ApiKey"",
        ""datarequest"": ""all""
        }",

我从 Microsoft 找到的文档(从我的角度来看)相当缺乏

答案1

不能 100% 确定这是否会起作用,因为 PQ 中没有使用 API 密钥。

使用函数来获取命名范围数据。
我调用了以下函数fGetNamedRange

let GetNamedRange=(NamedRange) => 
    let
        name = Excel.CurrentWorkbook(){[Name=NamedRange]}[Content],
        value = name{0}[Column1]
    in
        value
in GetNamedRange  

将您的命名范围传递到您的查询中:

let
    myContent = "{
        ""key"": """ & Text.From(fGetNamedRange("MyNamedRange")) & """,
        ""datarequest"": ""all""
        }"

in
    myContent

在此处输入图片描述

再次阅读您的问题并看到您的工作簿参考正在查看 ApiKey 后,请尝试:

let
    ApiKey = Excel.CurrentWorkbook(){[Name="ApiKey"]}[Content]{0}[Column1],
    BaseURL = "https://www.example.com/api",
    myContent = "{
        ""key"": """ & Text.From(ApiKey) & """,
        ""datarequest"": ""all""
        }",
    myData=Json.Document(myContent),
    Source = Json.Document( 
        Web.Contents(
            BaseURL,
            [
                Headers=[#"Content-Type" = "application/x-www-form-urlencoded"],
                Content=Text.ToBinary(Uri.BuildQueryString(myData))
            ]
        )
    )
    
in
    Source

答案2

将代码片段拆分成不同的查询确实有助于以后进行故障排除,而不是将所有代码塞进一些超长的巧妙 M 代码中。我针对这种情况的方法是:

在 Excel 中创建一个包含 API 密钥的表。从该表中“获取数据”。在显示 API 密钥值的位置,右键单击并选择“向下钻取”。这会将值转换为一个值,而不是表中的一行或一列。将此查询重命名为“APIKey”。您现在可以像使用参数一样使用它,但对于最终用户来说,在 Excel 工作表中更新比编辑 PQ 更容易。

M 代码如下所示:

let
Source = Excel.CurrentWorkbook(){[Name="ParametersTable"]}[Content],
#"Filtered Rows" = Table.SelectRows(Source, each [Name] = "API Key"),
Value = #"Filtered Rows"{0}[Value]
in 
Value

在您的其他代码中,只需将您的“APIKey”替换为 APIKey。例如,我有一个测试表,并希望过滤名称列以查找等于我的 APIKey 的值(而不是“APIKey”):

let
Source = Excel.CurrentWorkbook(){[Name="TestTable"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Names", type text}, {"Test", type text}}),
#"Filtered Rows" = Table.SelectRows(#"Changed Type", each [Names] = APIKey) 
in 
#"Filtered Rows"

如果您希望使用空格来调用您的值 API Key,那么您需要用引号括起来,然后用 # 告诉 PQ 这是一个值的名称,而不是文字字符串 - [名称] = #“API Key”

相关内容