自定义操作
Note
请注意:此功能与多维模型中的“自定义操作”功能无关。
假设你使用 Selected 对象创建了一个很实用的脚本,并且希望能在资源管理器树中对不同对象重复执行该脚本。 无需每次执行脚本都点击“播放”按钮,Tabular Editor 允许你将其保存为自定义操作:

保存自定义操作后,你会发现它会直接出现在资源管理器树的右键上下文菜单中,这样就能非常方便地对树中选中的任意对象调用该脚本。 你可以按需创建任意数量的自定义操作。 在名称中使用反斜杠(\)可在上下文菜单中创建子菜单结构。

自定义操作存储在 %AppData%\Local\TabularEditor 下的 CustomActions.json 文件中。 在上面的示例中,该文件的内容如下:
{
"Actions": [
{
"Name": "Custom Formatting\\Number with 1 decimal",
"Enabled": "true",
"Execute": "Selected.Measures.ForEach(m => m.FormatString = \"0.0\";",
"Tooltip": "Sets the FormatString property to \"0.0\"",
"ValidContexts": "Measure, Column"
}
]
}
如你所见,Name 和 Tooltip 的值来自保存该操作时所填写的内容。 Execute 是在调用该操作时实际要执行的脚本。 请注意:CustomActions.json 文件中的任何语法错误都会导致 Tabular Editor 完全跳过加载所有自定义操作。因此,在将脚本保存为自定义操作之前,请先确保该脚本能在高级脚本编辑器中成功执行。
ValidContexts 属性包含一个对象类型列表,操作仅会对这些类型的对象可用。 在树中选择对象时,如果当前选择中包含任何不在 ValidContexts 属性列表中的对象类型,该操作将不会显示在上下文菜单中。
控制操作可用性
如果你需要更精细地控制操作何时可从上下文菜单调用,可以将 Enabled 属性设置为一个自定义表达式。该表达式必须返回布尔值,用于指示在当前选择下该操作是否可用。 默认情况下,Enabled 属性的值为 "true",表示在有效上下文中该操作始终可用。 请记住,在 Selected 对象上使用单数对象引用时要特别注意,例如 Selected.Measure 或 Selected.Table,因为如果当前选择未恰好包含一个该类型的对象,就会抛出错误。 在这种情况下,建议使用 Enabled 属性检查当前是否恰好选中了一个所需类型的对象:
{
"Actions": [
{
"Name": "Reset measure name",
"Enabled": "Selected.Measures.Count == 1",
"Execute": "Selected.Measure.Name == \"New Measure\"",
"ValidContexts": "Measure"
}
]
}
这将禁用该上下文菜单项,除非在树状视图中恰好选中了一个度量值。
重用自定义操作
2.7 版本引入了新的脚本方法 CustomAction(...),可用于调用之前保存的自定义操作。 你可以将此方法作为独立方法使用(类似于 Output(...)),也可以将其作为扩展方法用于任意对象集合:
// 对当前选择执行“我的自定义操作”:
CustomAction("My custom action");
// 对模型中的所有表执行“我的自定义操作”:
CustomAction(Model.Tables, "My custom action");
// 对当前选择中名称以“Sum”开头的每个度量值执行“我的自定义操作”:
Selected.Measures.Where(m => m.Name.StartsWith("Sum")).CustomAction("My custom action");
请注意,您必须指定自定义操作的完整名称,包括任何上下文菜单文件夹名称。
如果找不到指定名称的操作,脚本执行时将引发错误。