Как получить/установить пользовательские поля Trello с помощью API?

Я уже влюблен в функцию Custom Fields в Trello. Есть ли способ получить и установить настраиваемые поля через API?

Я попытался использовать вызов get field для получения поля (на плате с настраиваемым полем, называемым "MyCustomField" ):

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

безрезультатно.

Ответ 1

Итак, у меня есть "своего рода" ответ на этот вопрос. Это требует некоторого взлома с вашей стороны, чтобы заставить его работать, и при добавлении свойств или значений есть небольшое количество ручного содержания, но оно работает.

Я делаю это в powershell (я еще не очень хорошо разбираюсь в ps, и это мой первый действительно "большой" script, который я собрал для него), так как я намерен использовать это с TFS Builds для автоматизации перемещение некоторых карт и создание заметок. Мы используем настраиваемые поля, чтобы помочь нам классифицировать карточку и подсчитать оценку/фактические часы и т.д. Я использовал этот ребята, работающие в качестве основы для своих собственных сценарии. Я не включаю все, но вы должны иметь возможность собрать все вместе.

Я упустил все, связавшись с Трелло и все такое. У меня есть множество других функций для списков счетов, перемещения карт, добавления комментариев и т.д. Модуль 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}}; Доступ = общий}

Коллекция полей - это в основном ключ/пара. Случайные символы соответствуют свойству и значение после этого - это то, что было установлено в пользовательском свойстве. В этом случае это "индекс" для значения в раскрывающемся списке. Эти два поля имеют для нас приоритет (низкий, средний, высокий) и "классификация" (ошибка, запрос на изменение и т.д.). (Мы используем метки для чего-то еще).

Итак, вам нужно будет создать еще одну функцию, в которой вы сможете разобрать эти данные. Я уверен, что есть лучшие способы сделать это, но это то, что у меня есть сейчас:

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
    }
}

Ответ 2

Это просто добавить к ответу bdwakefield. Его решение включает жесткое кодирование имен идентификаторов полей.

Если вы хотите также получить имя самих полей (например, получить, что "ZIn76ljn-4yeYvz" на самом деле является "приоритетом" в Trello, без необходимости его жесткого кода вызвать следующую конечную точку:

boards/{trello board id}/pluginData​​p >

Это возвращает массив с информацией о плагинах и в одном из элементов массива, он будет содержать строку вдоль строк:

[value] = > { "fields": [{ "n": "~ имя настраиваемого поля ~:", "t": 0, "b": 1, "id": "~ пользовательский идентификатор поля, который это странный материал на уровне карты ~", "friendlyType": "Text" }]}

Итак, вам просто нужно выяснить плагин для настраиваемых полей в вашем случае, и вы можете получить пару ключей → значение для имени настраиваемого поля и связанного с ним идентификатора.

Это означает, что если вы добавляете/удаляете поля или переименовываете их, вы можете обрабатывать их во время выполнения или изменять свой код.

Это также даст вам параметры для настраиваемого поля (когда это выпадающее меню, например, в приведенном выше примере bdwakefield).