在 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”