Как применить цикл в ScripRunner?

У меня есть задача, заключающаяся в том, чтобы реализовать механизм, который позволит суммировать значения тестового поля выбора из подзадач к тестовому полю родительской задачи. При этом важно, чтобы, если значение уже присутствует, оно не добавлялось повторно. 

Я планирую написать цикл в scriptrunner, который будет выполнять следующие шаги:  
1. Перебирать все подзадачи текущей задачи.  
2. Извлекать значение пользовательского текстового поля выбора.  
3. Сравнивать это значение с уже имеющейся переменной, проверяя, содержится ли оно в ней.  
4. Если значение отсутствует, добавлять его к переменной.  
5. По завершении перебора подзадач выводить полученную переменную.
  • 8 октября 2024 г. 14:25
Ответы на вопрос 1
Для реализации вашего сценария в ScriptRunner для Jira, можно использовать Groovy — язык программирования, который используется в ScriptRunner. Ниже приведен пример скрипта, который выполняет ваши требования.

Этот скрипт будет перебрать все подзадачи родительской задачи и суммировать значения пользовательского поля выбора, если значение еще не было добавлено:

```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.issue.util.IssueChangeHolder
import com.atlassian.jira.issue.MutableIssue

// Получаем текущую задачу (родительскую задачу)
MutableIssue parentIssue = issue // Это ссылается на текущую задачу, если вы запускаете скрипт из контекста задачи

// Получаем менеджеры
IssueManager issueManager = ComponentAccessor.getIssueManager()
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()

// Указываем имя пользовательского поля выбора
def customFieldName = "Ваше пользовательское поле выбора"
def customField = customFieldManager.getCustomFieldObjectByName(customFieldName)

if (!customField) {
    log.error("Пользовательское поле '${customFieldName}' не найдено.")
    return
}

// Инициализация переменной для хранения уникальных значений
Set<String> uniqueValues = [] as Set

// Получаем список подзадач родительской задачи
def subTasks = parentIssue.getSubTaskObjects()

// Перебираем все подзадачи и извлекаем значения пользовательского поля выбора
subTasks.each { Issue subTask ->
    def value = subTask.getCustomFieldValue(customField)

    if (value && !uniqueValues.contains(value)) {
        uniqueValues.add(value)
    }
}

// Формируем результат из уникальных значений
def result = uniqueValues.join(", ") // Используйте запятую или другой разделитель по желанию

// Выводим результат
log.info("Уникальные значения для пользовательского поля '${customFieldName}': ${result}")

// Вы можете сохранить результат в родительское поле выбора, если это необходимо
// Например, если у вас есть отдельное поле для записи суммы:
def resultField = customFieldManager.getCustomFieldObjectByName("Ваше поле для записи результата")

if (resultField) {
    parentIssue.setCustomFieldValue(resultField, result)
    IssueChangeHolder changeHolder = new DefaultIssueChangeHolder()
    issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), parentIssue, EventDispatchOption.DO_NOT_DISPATCH, changeHolder)
}
```

### Пояснения к коду:

1. **Импортируем необходимые классы:** Загружаем необходимые классы из библиотеки Jira для работы с задачами и пользовательскими полями.
2. **Получаем родительскую задачу:** Используем переменную `issue`, чтобы получить текущую задачу, если скрипт выполняется в контексте задачи.
3. **Инициализация пользовательского поля:** Находим поле выбора по имени.
4. **Перебор подзадач:** Получаем все подзадачи текущей задачи и извлекаем значения указанного пользовательского поля выбора.
5. **Проверка уникальности:** Используем `Set` для хранения уникальных значений.
6. **Запись результата:** Если требуется, записываем полученные уникальные значения в отдельное пользовательское поле (можно убрать, если нет необходимости).

### Примечание:
- Убедитесь, что у вас есть необходимые права на выполнение этого скрипта и что названия пользовательских полей прописаны верно.
- Проверьте, что вы обрабатываете типы значений, которые ожидаются для вашего пользовательского поля (например, строковые значения, если это текстовое поле).
Похожие вопросы