如何使用 API get/set Trello 自定义字段?

How to get/set Trello custom fields using the API?

我已经爱上了 Trello 中的 Custom Fields 功能。有没有办法通过 API?

获取和设置自定义字段

我尝试使用 get field API 调用来获取一个字段(在一个自定义字段定义为 "MyCustomField" 的板上):

curl "https://api.trello.com/1/cards/57c473503a5ef0b76fddd0e5/MyCustomField?key=${TRELLO_API_KEY}&token=${TRELLO_OAUTH_TOKEN}"

无济于事。

所以我有一个 "sort of" 答案。它需要您的一些 hacker 技能才能使其工作,并且在您添加属性或值时需要更多的手动维护——但它确实有效。

我在 powershell 中这样做(我还不精通 ps,这是我第一个真正的 'big' 脚本,我已经为它拼凑起来)因为我的目的是使用这与 TFS Builds 一起自动移动一些卡片并创建发行说明。我们正在使用自定义字段来帮助我们对卡片进行分类并记录 estimate/actual 小时等。我使用此 guys work 作为我自己脚本编写的基础。我没有包括所有内容,但您应该能够将所有内容拼凑起来。

我已经省略了连接到 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; scope=card; idModel=58263201749710ed3c706bef; value={"fields":{"ZIn76ljn-4yeYvz":2,"ZIn76ljn-c2yhZH":1}}; access=shared}

@{id=5834536fcff0525f26f9e53b; idPlugin=56d5e249a98895a9797bebb9; scope=card; idModel=567031ea6a01f722978b795d; value={"fields":{"ZIn76ljn-4yeYvz":4,"ZIn76ljn-c2yhZH":3}}; access=shared}

字段集合基本上是key/pair。随机字符对应属性,后面的值是自定义属性上设置的值。在本例中,它是下拉列表中值的 'index'。这两个字段对我们来说有一个 'priority'(低、中、高)和一个 'classification'(错误、变更请求等)。 (我们将标签用于其他用途)。

所以你必须创建另一个函数来解析这些数据。我确信有更好的方法来做到这一点——但这就是我现在所拥有的:

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" 实际上是 "priority",无需对其进行硬编码,请调用以下端点:

boards/{trello board id}/pluginData

这将 return 一个包含插件信息的数组,并且在其中一个数组项中,它将包含一行:

[值] => {"fields":[{"n":"~自定义字段名称~:","t":0,"b":1, "id":"~自定义字段 ID,这是卡片级别的奇怪东西~","friendlyType":"Text"}]}

所以你只需要在你的案例中弄清楚自定义字段的插件,你就可以检索自定义字段名称的键 -> 值对和与之关联的 ID。

这意味着如果您添加/删除字段或重命名它们,您可以在 运行 时间处理它而不是更改代码。

这也会为您提供自定义字段的选项(当它是一个下拉列表时,就像上面 bdwakefield 的例子一样)。

Trello 的自定义字段 API 现已正式可用 (announcement blog post here)。

它允许用户操作看板的自定义字段项和卡片上的自定义字段项值。

Custom Fields API documentation

Getting customFieldItems For Cards

Setting & Updating CustomFieldItems