繁体   English   中英

如何将多个 web 请求组合成一个查询/表?

[英]How to combine multiple web requests into one query/table?

我想创建多年的加拿大假期日历。 为此,我正在使用canada-holidays.ca/api 问题是,如果我想要多年,我需要为每年创建一个请求,然后 append 它们,但这样做会创建很多我不想要或不需要的请求。

这就是为什么我试图在 Power Query 的单个查询中同时集成多个源。

我发现这篇文章是我想做的事情的灵感来源,但它基于 Excel,因此需要稍微调整一下。

这就是为什么,我写了这段代码:

let
//2021 Holidays
    Source1 = Json.Document(Web.Contents("https://canada-holidays.ca/api/v1/holidays?year=2021")),
    #"Converti en table1" = Table.FromRecords({Source1}),
    #"ExpandList1" = Table.ExpandListColumn(#"Converti en table1", "holidays"),
    #"ExpandRecord1" = Table.ExpandRecordColumn(#"ExpandList1", "holidays", {
        "id", 
        "date", 
        "nameEn", 
        "nameFr", 
        "federal", 
        "observedDate"}, {
            "id", 
            "date", 
            "nameEn", 
            "nameFr", 
            "federal", 
            "observedDate"}),
    #"Type modifié1" = Table.TransformColumnTypes(#"ExpandRecord1",{
        {"id", Int64.Type}, 
        {"date", type date}, 
        {"nameEn", type text}, 
        {"nameFr", type text}, 
        {"federal", Int64.Type}, 
        {"observedDate", type date}}),
    #"Lignes filtrées1" = Table.SelectRows(#"Type modifié1", each (
        [nameEn] = "Boxing Day" or 
        [nameEn] = "Canada Day" or 
        [nameEn] = "Christmas Day" or 
        [nameEn] = "Day of Mourning for Queen Elizabeth II" or 
        [nameEn] = "Easter Monday" or 
        [nameEn] = "Good Friday" or 
        [nameEn] = "Labour Day" or 
        [nameEn] = "National Day for Truth and Reconciliation" or 
        [nameEn] = "New Year’s Day" or 
        [nameEn] = "Remembrance Day" or 
        [nameEn] = "Saint-Jean-Baptiste Day" or 
        [nameEn] = "Thanksgiving" or 
        [nameEn] = "Victoria Day")),

//2022 Holidays
    Source2 = Json.Document(Web.Contents("https://canada-holidays.ca/api/v1/holidays?year=2022")),
    #"Converti en table2" = Table.FromRecords({Source2}),
    #"ExpandList2" = Table.ExpandListColumn(#"Converti en table2", "holidays"),
    #"ExpandRecord2" = Table.ExpandRecordColumn(#"ExpandList2", "holidays", {
        "id", 
        "date", 
        "nameEn", 
        "nameFr", 
        "federal", 
        "observedDate"}, {
            "id", 
            "date", 
            "nameEn", 
            "nameFr", 
            "federal", 
            "observedDate"}),
    #"Type modifié2" = Table.TransformColumnTypes(#"ExpandRecord2",{
        {"id", Int64.Type}, 
        {"date", type date}, 
        {"nameEn", type text}, 
        {"nameFr", type text}, 
        {"federal", Int64.Type}, 
        {"observedDate", type date}}),
    #"Lignes filtrées2" = Table.SelectRows(#"Type modifié2", each (
        [nameEn] = "Boxing Day" or 
        [nameEn] = "Canada Day" or 
        [nameEn] = "Christmas Day" or 
        [nameEn] = "Day of Mourning for Queen Elizabeth II" or 
        [nameEn] = "Easter Monday" or 
        [nameEn] = "Good Friday" or 
        [nameEn] = "Labour Day" or 
        [nameEn] = "National Day for Truth and Reconciliation" or 
        [nameEn] = "New Year’s Day" or 
        [nameEn] = "Remembrance Day" or 
        [nameEn] = "Saint-Jean-Baptiste Day" or 
        [nameEn] = "Thanksgiving" or 
        [nameEn] = "Victoria Day")),

    #"TableAppend" = Table.Combine({#"Lignes filtrées1"}, {#"Lignes filtrées2"})

in
    #"TableAppend"

可悲的是,当我尝试运行它时出现此错误:“Expression.Error:columns 参数必须为 null,请指定列数,指定列名列表或指定表类型。详细信息:[List]”

那么,有没有人知道我可以做些什么来将多个源和 append 集成到一个请求中?

这是一个很常见的问题:

  1. 为 Year 创建一个参数并将其设置为 2021
  2. 在您的查询中引用该参数一年
  3. 让 PowerQuery 根据结果创建自定义 function (右键单击“创建函数”)。
  4. 在另一个查询的年份列中输入您感兴趣的所有年份
  5. 通过调用您的自定义 function 并使用年份列作为参数来添加新列。
  6. 展开结果表,你就完成了

在官方文档中阅读有关 使用自定义函数的更多信息。

这是您的GetHolidays自定义 function 的样子:

(Year as text) =>
let
    Source1 = Json.Document(
        Web.Contents(
            "https://canada-holidays.ca/api/v1/holidays?year=" & Year
        )
    ),
    #"Converti en table1" = Table.FromRecords({Source1}),
    #"ExpandList1" = Table.ExpandListColumn(#"Converti en table1", "holidays"),
    #"ExpandRecord1" = Table.ExpandRecordColumn(#"ExpandList1", "holidays", {
        "id", 
        "date", 
        "nameEn", 
        "nameFr", 
        "federal", 
        "observedDate"}, {
            "id", 
            "date", 
            "nameEn", 
            "nameFr", 
            "federal", 
            "observedDate"}),
    #"Type modifié1" = Table.TransformColumnTypes(#"ExpandRecord1",{
        {"id", Int64.Type}, 
        {"date", type date}, 
        {"nameEn", type text}, 
        {"nameFr", type text}, 
        {"federal", Int64.Type}, 
        {"observedDate", type date}}),
    #"Lignes filtrées1" = Table.SelectRows(#"Type modifié1", each (
        [nameEn] = "Boxing Day" or 
        [nameEn] = "Canada Day" or 
        [nameEn] = "Christmas Day" or 
        [nameEn] = "Day of Mourning for Queen Elizabeth II" or 
        [nameEn] = "Easter Monday" or 
        [nameEn] = "Good Friday" or 
        [nameEn] = "Labour Day" or 
        [nameEn] = "National Day for Truth and Reconciliation" or 
        [nameEn] = "New Year’s Day" or 
        [nameEn] = "Remembrance Day" or 
        [nameEn] = "Saint-Jean-Baptiste Day" or 
        [nameEn] = "Thanksgiving" or 
        [nameEn] = "Victoria Day"))
in
     #"Lignes filtrées1"

这是 2017-2026 年所有可用年份的假期日历:

let
    Source = Table.FromList({2017 .. 2026}, Splitter.SplitByNothing(), {"Year"}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Year", type text}}),
    #"Invoked Custom Function" = Table.AddColumn(
        #"Changed Type", "GetHolidays", each GetHolidays([Year])),
    #"Expanded GetHolidays" = Table.ExpandTableColumn(
        #"Invoked Custom Function", 
        "GetHolidays", 
        {"id", "date", "nameEn", "nameFr", "federal", "observedDate"}, 
        {"id", "date", "nameEn", "nameFr", "federal", "observedDate"}
    )
in
    #"Expanded GetHolidays"

在此处输入图像描述

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM