# 在自定义发布工作流中利用 FeatureScript 自动更新释放项元数据
## 核心机制:使用 updateItemPropertiesFromFeatureScript
在 Onshape 的自定义发布工作流中,若需在工作流转换(transition)或状态(state)的入口/出口动作中自动修改释放项的属性,可使用 `updateItemPropertiesFromFeatureScript` 工作流动作。该动作允许调用位于同一工作区内的 Feature Studio 中的函数,以编程方式更新每个释放项的属性。
## 构建返回 Map 对象的关键规则
要正确设置不同 ID 的释放项属性,必须严格遵循以下 Map 结构规范:
1. **顶层键(Key)**:必须是**释放项 ID**(Release item ID)。
2. **内层键(Inner Key)**:必须是**元数据属性 ID**(Metadata property ID),而非属性名称。
3. **值(Value)**:必须与目标元数据属性的定义类型完全匹配。
### 示例结构
假设需要更新两个释放项的属性,返回的 Map 应如下所示:
```json
{
"item1": {
"57f3fb8efa3416c06701d616": "New value",
"customIntProperty": 42
},
"item2": {
"57f3fb8efa3416c06701d617": "Some other value"
}
}
```
在此示例中:
- `"item1"` 和 `"item2"` 是释放项的唯一标识符。
- `"57f3fb8efa3416c06701d616"` 等字符串是元数据属性的系统 ID。
- `"New value"` 是字符串类型,`42` 是整数类型,必须与属性定义中的 `valueType` 一致。
## 数据类型匹配的重要性
返回 Map 中的值类型必须严格对应元数据属性的定义类型。常见类型包括:
- **STRING**:使用字符串字面量。
- **INT**:使用整数(如 `42`)。
- **BOOL**:使用布尔值(`true`/`false`)。
- **USER**:必须是包含用户 ID 对象的数组,格式为 `{"id": [userId]}`。注意,此处仅接受用户 ID,不接受团队或角色 ID;若从工作流属性映射,需筛选 `entryType` 为 0 的用户条目。
若类型不匹配(例如将整数赋值给字符串属性),更新操作将失败,错误会被记录在审计日志中。
## 调试与容错
如果属性更新因无效的 `propertyID` 或值而失败,工作流动作会终止并记录失败项的 ID、HREF 及错误信息。开发者可通过工作流审计日志(Audit log)查看 `Item metadata updates failed` 类型的条目进行排查。此外,FeatureScript 执行过程中的任何异常也会导致动作失败,但不会中断整个发布流程(仅影响属性更新部分)。
## 总结
通过 `updateItemPropertiesFromFeatureScript` 实现自动化元数据更新时,关键在于构建符合规范的 Map 对象:以释放项 ID 为外层键,以属性 ID 为内层键,并确保值类型与属性定义严格一致。遵循这些规则可避免更新失败,并有效利用 FeatureScript 增强发布工作流的灵活性。