如何使用API获取/设置Trello自定义字段?

如何使用API获取/设置Trello自定义字段?,api,trello,Api,Trello,我已经爱上了Trello中的这个功能。有没有办法通过API获取和设置自定义字段 我尝试使用API调用获取字段(在定义了自定义字段“MyCustomField”的板上): curl”https://api.trello.com/1/cards/57c473503a5ef0b76fddd0e5/MyCustomField?key=${TRELLO\u API\u KEY}&token=${TRELLO\u OAUTH\u token}” 无济于事 所以我有一个“某种”答案。这需要一些黑客的帮助才能

我已经爱上了Trello中的这个功能。有没有办法通过API获取和设置自定义字段

我尝试使用API调用获取字段(在定义了自定义字段“MyCustomField”的板上):

curl”https://api.trello.com/1/cards/57c473503a5ef0b76fddd0e5/MyCustomField?key=${TRELLO\u API\u KEY}&token=${TRELLO\u OAUTH\u token}”

无济于事

所以我有一个“某种”答案。这需要一些黑客的帮助才能使它工作,而且在添加属性或值时,需要的不仅仅是一点手动维护——但它是有效的

我是在powershell中这样做的(我还不太熟悉ps,这是我为它编写的第一个真正的“大”脚本),因为我的目的是在TFS构建中使用它来自动移动一些卡并创建发行说明。我们使用自定义字段来帮助我们分类卡片和注释估计/实际小时数等。我将其用作自己编写脚本的基础。我不包括所有内容,但你应该能够将所有内容拼凑在一起

我忽略了与特雷罗的一切联系。我还有很多其他的功能,比如获取列表、移动卡片、添加评论等等。我上面链接的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=582B5EC8DF1572E57241513;idPlugin=56d5e249a98895a9797bebb9; 范围=卡片;idModel=58263201749710ed3c706bef; 值={“字段”:{“ZIn76ljn-4yeYvz”:2,“ZIn76ljn-c2yhZH”:1}; 访问=共享}

@{id=5834536fcff0525f26f9e53b;idPlugin=56d5e249a98895a9797bebb9; 范围=卡片;idModel=567031ea6a01f722978b795d; 值={“字段”:{“ZIn76ljn-4yeYvz”:4,“ZIn76ljn-c2yhZH”:3}; 访问=共享}

字段集合基本上是键/对。随机字符对应于属性,之后的值是在自定义属性上设置的值。在这种情况下,它是下拉列表中值的“索引”。这两个字段对我们来说有“优先级”(低、中、高)和“分类”(Bug、变更请求等)。(我们正在为其他内容使用标签)

因此,您必须创建另一个功能,在其中可以解析这些数据。我相信有更好的方法可以做到这一点,但我现在有:

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

这将返回一个包含插件信息的数组,在其中一个数组项中,它将包含一行,行如下所示:

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

因此,您只需在您的案例中找出自定义字段的插件,就可以检索自定义字段名及其关联id的key->value对

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


这还将为您提供自定义字段的选项(如上面的bdwakefield示例中的下拉列表)。

Trello的自定义字段API现在正式可用()

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


我在这里浏览了一下,但也没有运气:/要么这还没有记录,要么它没有公开。好的,找到了:@jakub-关于该图像的来源有什么想法吗?我很好奇是否有任何进一步的讨论/行动。我正在写一个脚本,帮助根据卡片自动创建发行说明,这将是无效的e给我。嘿@bdwakefield,Trello支持部门在八月底回复了它。不过我不知道还有什么进一步的讨论。我刚才,也许他们会说些什么?mstringer和@jakub--我在这方面取得了一些“进展”…这不太理想…但它“有效”。也许你可以利用我这里的东西,让它为你工作。哈哈我已经有一段时间不需要这个了;但是我会看看更新我的内容和修改我的答案有多难,如果我能够的话;谢谢!创建和更新是不可能的,因为自定义字段访问api是只读的更新它已经移动了:谢谢。我已经更新了答案中的链接。