Sync between Select List (single choice) and text custom field for Jira Cloud

    This article shows how to synchronize data between a select list and a text custom field.

    Exalate allows syncing any kind of custom field type combination.

    Select-list to Text Custom Field

    For example, you have a custom field called Sports List (select list Single Choice) and you want to sync it to the custom field Sport Type (text field).

    Sending side

    Outgoing sync

    Send the select-list value to the remote side.

    1 replica.customFields."Sports List"  = issue.customFields."Sports List"

    Receiving side

    Incoming sync

    replica.customFields."Sports List".value is an object of type optionThe option contains a value, which is the string of the option.  The issue.customFields."Sport Type".value is a text type custom field, which includes string value.

    1 issue.customFields."Sport Type".value = replica.customFields."Sports List".value.value

    Text Custom Field to Select-list

    The scripts below help to send the text custom field value to the destination side and add a new option to the existing select list field if there is no such option yet.

    Sending side

    Outgoing sync

    1 // SETTINGS
    2 final def textFieldCfName = "Text Custom Field Name"
    3 // END SETTINGS
    4
    5 def localOptionValue = issue.customFields[textFieldCfName]?.value
    6 if (localOptionValue == null) {
    7     throw new com.exalate.api.exception.IssueTrackerException(
    8     "Can not synchronize 
    9             `"+textFieldCfName+"` 
    10                to destination jira since there is no value set for issue 
    11            `"+ issueKey.URN +"` 
    12            ("+issueKey.id+"
    13     )"
    14   )
    15 }
    16 replica.customKeys."Text field Value" = localOptionValue

    Receiving side

    Incoming sync

    1 // SETTINGS
    2 final def nygSelectListCfName = "Select List Custom Field Name" 
    3 // END SETTINGS
    4
    5
    6 import com.atlassian.jira.component.ComponentAccessor
    7 import com.atlassian.jira.issue.context.IssueContext
    8
    9  def cfm = ComponentAccessor.getCustomFieldManager()
    10 def om = ComponentAccessor.getOptionsManager()
    11
    12 def remoteOptionValue = replica.customKeys."Text field Value" as String
    13 def cf = cfm.getCustomFieldObjectsByName(nygSelectListCfName).find()
    14 def fCfg = cf.getRelevantConfig(IssueContext.GLOBAL)
    15 def localOptions = om.getOptions(fCfg)
    16 if (!localOptions.any { o -> o.value == remoteOptionValue }) {
    17     //FieldConfig fieldConfig, Long parentOptionId, Long sequence, String value
    18     om.createOption(fCfg, null, 0L, remoteOptionValue)
    19 }

    In case an issue is not synchronized and you want to trigger synchronization by updating the issue filed, you need to create a JQL trigger.