所以我对此有一个“有点”的答案。它需要一些hackery来使它工作,并且在添加属性或值时不仅仅需要一些手动维护 - 但它可以工作。
我在powershell中这样做(我还没精通ps,这是我第一个真正'大'的脚本,我已经把它拉到一起了)因为我的目的是将它与TFS Builds一起使用来自动移动一些卡片和创建发行说明。我们使用自定义字段来帮助我们对卡片进行分类并记下估计/实际时间等。我使用了这个 伙计们工作 作为我自己脚本的基础。我没有包括所有东西,但你应该能够将所有东西拼凑在一起。
连接到Trello以及所有这些都遗漏了一切。我有很多其他函数用于获取列表,移动卡片,添加注释等。我上面链接的ps模块也有许多内置的内置。
function Get-TrelloCardPluginData { [CmdletBinding()] param ( [Parameter(Mandatory,ValueFromPipelineByPropertyName)] [ValidateNotNullOrEmpty()] [Alias('Id')] [string]$CardId ) begin { $ErrorActionPreference = 'Stop' } process { try { $uri = "$baseUrl/cards/$CardId/pluginData?$($trelloConfig.String)" $result = Invoke-RestMethod -Uri $uri -Method GET return $result } catch { Write-Error $_.Exception.Message } } }
您将获得如下所示的数据:
@ {ID = 582b5ec8df1572e572411513; idPlugin = 56d5e249a98895a9797bebb9; 范围=卡; idModel = 58263201749710ed3c706bef; 值= { “字段”:{ “ZIn76ljn-4yeYvz”:2 “ZIn76ljn-c2yhZH”:1}}; 访问共享=} @ {ID = 5834536fcff0525f26f9e53b; idPlugin = 56d5e249a98895a9797bebb9; 范围=卡; idModel = 567031ea6a01f722978b795d; 值= { “字段”:{ “ZIn76ljn-4yeYvz”:4 “ZIn76ljn-c2yhZH”:3}}; 访问共享=}
@ {ID = 582b5ec8df1572e572411513; idPlugin = 56d5e249a98895a9797bebb9; 范围=卡; idModel = 58263201749710ed3c706bef; 值= { “字段”:{ “ZIn76ljn-4yeYvz”:2 “ZIn76ljn-c2yhZH”:1}}; 访问共享=}
@ {ID = 5834536fcff0525f26f9e53b; idPlugin = 56d5e249a98895a9797bebb9; 范围=卡; idModel = 567031ea6a01f722978b795d; 值= { “字段”:{ “ZIn76ljn-4yeYvz”:4 “ZIn76ljn-c2yhZH”:3}}; 访问共享=}
字段集合基本上是密钥/对。随机字符对应于属性,之后的值是自定义属性上设置的值。在这种情况下,它是下拉列表中值的“索引”。这两个字段对我们来说具有“优先级”(低,中,高)和“分类”(错误,变更请求等)。 (我们正在使用其他标签)。
所以你必须创建另一个功能,你可以解析这些数据。我相信有更好的方法可以做到 - 但这就是我现在所拥有的:
function Get-TrelloCustomPropertyData($propertyData) { $data = $propertyData.Replace('{"fields":{', '') $data = $data.Replace('}}', '') $data = $data.Replace('"', '') $sepone = "," $septwo = ":" $options = [System.StringSplitOptions]::RemoveEmptyEntries $obj = $data.Split($sepone, $options) $cardCustomFields = Get-TrelloCustomFieldObject foreach($pair in $obj) { $field = $pair.Split($septwo,$options) if (-Not [string]::IsNullOrWhiteSpace($field[0].Trim())) { switch($field[0].Trim()) { 'ZIn76ljn-4yeYvz' { switch($field[1].Trim()) { '1'{ $cardCustomFields.Priority = "Critical" } '2'{ $cardCustomFields.Priority = "High" } '3'{ $cardCustomFields.Priority = "Medium" } '4'{ $cardCustomFields.Priority = "Low" } } } 'ZIn76ljn-c2yhZH' { switch($field[1].Trim()) { '1'{ $cardCustomFields.Classification = "Bug" } '2'{ $cardCustomFields.Classification = "Change Request" } '3'{ $cardCustomFields.Classification = "New Development" } } } 'ZIn76ljn-uJyxzA'{$cardCustomFields.Estimated = $field[1].Trim()} 'ZIn76ljn-AwYurD'{$cardCustomFields.Actual = $field[1].Trim()} } } } return $cardCustomFields }
的 GET-TrelloCustomFieldObject 强> 是另一个ps函数,我设置为基于我已经定义的属性构建对象。
function Get-TrelloCustomFieldObject { [CmdletBinding()] param() begin { $ErrorActionPreference = 'Stop' } process { $ccf = New-Object System.Object $ccf | Add-Member -type NoteProperty -name Priority -value "None" $ccf | Add-Member -type NoteProperty -name Classification -value "None" $ccf | Add-Member -type NoteProperty -name Estimated -value "" $ccf | Add-Member -type NoteProperty -name Actual -value "" return $ccf } }
这只是为了增加bdwakefield的答案。他的解决方案涉及对字段ID的名称进行硬编码。
如果你还要检索字段本身的名称(例如,在Trello中获取“ZIn76ljn-4yeYvz”实际上是“优先级”,而不需要对其进行硬编码,请调用以下端点:
board / {trello board id} / pluginData
这将返回一个包含插件信息的数组,在其中一个数组项中,它将包含以下行的行:
[value] => {“fields”:[{“n”:“〜自定义字段名称::”,“t”:0,“b”:1,“id”:“〜自定义字段ID,这是卡级别的奇怪内容〜”, “friendlyType”: “文本”}]}
所以你只需要在你的情况下找出自定义字段的插件,你就可以检索密钥 - >自定义字段名称的值对和与之关联的ID。
这意味着,如果添加/删除字段或重命名字段,则可以在运行时处理它而不是更改代码。
这也将为您提供自定义字段的选项(如下面的bdwakefield示例中的下拉菜单)。