添加自定义和动态列

Add Custom and Dynamic columns

我有两个 table,我正在尝试弄清楚如何创建自定义代码以添加具有自定义名称的动态列,这些名称基于另一个 table 中的行值。然后,我需要使用 Table 2 中行的值,不仅要创建列名,还要用 Table 2 中另一列的值填充新的动态列。希望我下面的图片有所帮助

Table 1 具有不同的行数,具体取决于用户输入的内容。 Table 2 具有不同的行数,具体取决于用户输入的值的数量。

Table 1 之前

Col1 Col2 Col 3
stuff 1 stuff 2 stuff 3
stuff 4 stuff 5 stuff 6
. . .
. . .

Table 2

Name Values
Name1 100
Name2 500
. .
NameX Y

Table 1 之后

Col1 Col2 Col 3 "Column" & Name1 "Column"& Name2 ... "Column"& NameX
stuff 1 stuff 2 stuff 3 100 500 ... Y
stuff 4 stuff 5 stuff 6 100 500 ... Y
. . . 100 500 ... Y
. . . 100 500 ... Y

“Column”和 Name1 表示我想将 Column 与 Table 中 Name 列中的值连接 2.

您可以通过不引用绝对列名称,而是使用 Table.ColumnNames 函数来 return 这些名称来使其动态化。

我假设 Table 2 中的列名是固定的。如果不是,可以更改该代码。

阅读代码注释并检查应用步骤 window 以更好地理解所使用的方法。有设置数据类型的示例,还有 re-naming 列而不引用 hard-coded 列名。

M码

let
//read in the  two tables and set the data types
    Source1 = Excel.CurrentWorkbook(){[Name="Table_2"]}[Content],
    Table2 =Table.TransformColumnTypes(Source1,
        {{"Name", type text},{"Values", type any}}),

    Source = Excel.CurrentWorkbook(){[Name="Table_1_Before"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,
        List.Transform(Table.ColumnNames(Source), each {_, type text})),

//create the extra columns by
    //Transpose Table2
    //  Use first row as headers
    xpose = Table.Transpose(Table2),
    #"Promoted Headers" = Table.PromoteHeaders(xpose, [PromoteAllScalars=true]),
    #"Changed Type1" = Table.TransformColumnTypes(#"Promoted Headers",
        List.Transform(Table.ColumnNames(#"Promoted Headers"), each {_, type any})),

    //rename the columns
    renameNameCols = Table.RenameColumns(#"Changed Type1", 
        List.Zip(
            {Table.ColumnNames(#"Changed Type1"), 
            List.Transform(Table.ColumnNames(#"Changed Type1"), each "Column " & _)})),

//Combine the tables
    combine = Table.Combine({#"Changed Type",renameNameCols}),

//fill up the original table 2 columns and remove the blank Table 1 rows
    #"Filled Up" = Table.FillUp(combine,Table.ColumnNames(renameNameCols)),
    #"Filtered Rows" = Table.SelectRows(#"Filled Up", each ([Col1] <> null))
    
in
    #"Filtered Rows"

原文Tables

结果

请注意,我没有添加逻辑来避免在 ... 前面加上单词列,如您所需的输出所示,但如果确实需要,可以轻松添加

我的版本

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
custom = Table.FromColumns(Table.ToColumns(Source) &Table.ToColumns(Table2), List.Combine({Table.ColumnNames(Source),Table.ColumnNames(Table2)})  ),
#"Filled Down" = Table.FillDown(custom,Table.ColumnNames(Table2))
in  #"Filled Down"