Update table field via Scriptrunner (Java API)
This script can update:
table’s existing rows
update table with a new row
import com.atlassian.jira.com.rproxy.goskope.component.ComponentAccessor
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.util.ErrorCollection
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
// Get the necessary Jira components
def issueService = ComponentAccessor.getIssueService();
def userManager = ComponentAccessor.getUserManager();
def issueManager = ComponentAccessor.getIssueManager();
def customFieldManager = ComponentAccessor.getCustomFieldManager();
// Specify the user to perform the update
def user = userManager.getUserByName("admin");
// Specify the issue to update
def issue = issueManager.getIssueObject("BD-6");
// Specify the table field to update (replace 10347l with the actual custom field ID)
def customField = customFieldManager.getCustomFieldObject(10347l);
def issueInputParameters = issueService.newIssueInputParameters();
// Retrieve the current value of the table field for the given issue
def oldValue = customField.getCustomFieldType().getActualValue(customField, issue) as String;
/* New */
// Check if value is NULL
if (oldValue == null) {
    oldValue = '{"values":[]}';
}
// Parse the current value as JSON
def jsonSlurper = new JsonSlurper();
def object = jsonSlurper.parseText(oldValue);
// Assert that the parsed object is a map and its values are a list
assert object instanceof Map
assert object.values instanceof List
// Iterate over each row in the table
object.values.each { row ->
    // Assert that the row is a map
    assert row instanceof Map
    
    // Check if the value of "field-219" in the row is "text"
    if (row.get("field-219") == "text") {
        // Update the value of "field-219" to "change text"
        row.put("field-219", "change text")
    }
    
    // Log the updated row
    log.warn(row);
}
/* New */
// Add new row to existing rows
object.values.push([
    "field-191": [105],
    "field-219": "text2",
    "field-192": "BD-7",
    "field-190": ["admin"],
    "field-247": "45.5",
    "field-189": false,
    "id": -1 // to add new row
]);
// Build the JSON with the updated rows
JsonBuilder builder = new JsonBuilder(object);
// Set the table value using the new JSON value
issueInputParameters.addCustomFieldValue(customField.getId(), builder.toString());
// Skip the check screen
issueInputParameters.setSkipScreenCheck(true);
// Retain existing values when the parameter is not provided
issueInputParameters.setRetainExistingValuesWhenParameterNotProvided(true, true);
// Perform the update
log.warn("start")
// Validate the update parameters
IssueService.UpdateValidationResult validationResult = issueService.validateUpdate(user, issue.getId(), issueInputParameters);
// Check if the validation is successful
if (validationResult.isValid()) {
    // Update the issue with the new values
    IssueService.IssueResult issueResult = issueService.update(user, validationResult);
    // Check if the issue update is successful
    if (!issueResult.isValid()) {
        log.error(issueResult.getErrorCollection().toString());
    }
} else {
    log.error(validationResult.getErrorCollection().toString());
}
log.warn("end")