Power Query函数开发:生成含列名及值长度的新列
问题描述
我有多个包含不同属性的文件(部分含Job Name,部分含Location,部分含Grade等)。
示例数据
| Job Name | Job Location | Job Grade |
|---|---|---|
| Controller | 若干值 | High |
| Director | 无值 | Low |
| Analyst | 其他若干值 | |
| VP Of Finance | 空值 | Medium |
| Director |
需求
开发一个Power Query函数,新增一列,每个单元格内容为列名(如示例中的Job Name)+ 该列对应单元格值的长度。
期望输出
| Job Name | Job Location | Job Grade | Desired Output |
|---|---|---|---|
| Controller | 若干值 | High | Job Name 10 |
| Director | 无值 | Low | Job Name 8 |
| Analyst | 其他若干值 | Job Name 7 | |
| VP Of Finance | 空值 | Medium | Job Name 13 |
| Director | Executive | Job Name 8 |
当前代码及问题
当前函数代码:
(MyColumn) as text => let Source = Text.Length(MyColumn), NewSource = Number.ToText(Source), FinalText = Text.Combine({MyColumn,NewSource}," ") in FinalText
错误输出:
| Job Name | 当前输出(错误) |
|---|---|
| Engineer | Engineer 1 |
| Director | Director 2 |
| Analyst | Analyst 3 |
| Engineer | Engineer 1 |
尝试用Record.Field(_, MyColumn)引用列名时,出现错误:
An error occurred in the ‘‘ query. Expression.Error: The name '_' wasn't recognized. Make sure it's spelled correctly.
解决方案
问题出在原函数只接收了列的单元格值,没有传入列名参数。要同时获取列名和对应值的长度,需要调整函数参数,让它接收每行的完整记录和目标列名两个参数,这样就能同时拿到列名和对应单元格的值。
修正后的函数代码
(RecordRow as record, TargetColumnName as text) as text => let // 获取当前行中目标列的值,空值转为空文本避免报错 ColumnValue = Record.FieldOrDefault(RecordRow, TargetColumnName, ""), // 计算值的长度 ValueLength = Text.Length(ColumnValue), // 拼接列名和长度 FinalOutput = Text.Combine({TargetColumnName, Number.ToText(ValueLength)}, " ") in FinalOutput
使用方法
- 在Power Query中加载你的数据表格
- 点击添加列 -> 自定义列
- 在自定义列公式中调用该函数,比如基于
Job Name列生成结果,输入:
(把= GetColumnWithLength([当前行], "Job Name")GetColumnWithLength替换成你保存的函数名称) - 点击确定即可得到符合要求的输出列。
关键说明
RecordRow as record:接收每行的完整数据记录,通过列名提取对应单元格的值TargetColumnName as text:明确传入目标列的名称,直接用于最终文本拼接Record.FieldOrDefault:处理单元格为空的情况,避免空值导致的运行错误
内容的提问来源于stack exchange,提问作者MarekMarek
相关产品推荐
相关产品推荐

