Using Excel-like Tables for Jira With Scripting Apps
Since the spreadsheet data can be accessed via REST API, third-party scripting and automation tools such as ScriptRunner can interact with information stored in Excel-like Tables for Jira. This makes it possible for administrators and developers to build custom logic that reads cell values, evaluates spreadsheet calculations, or reacts to data maintained inside a table on a Jira issue.
Important Disclaimer
Excel-like Tables for Jira is not associated with ScriptRunner or any other scripting vendor. ScriptRunner is mentioned only as an example of a tool capable of performing REST calls and running custom scripts. Users who wish to implement automation should consult the documentation provided by their chosen scripting or automation app.
Capabilities and Benefits
Excel-like Tables for Jira provides a structured spreadsheet layer inside Jira that can act as both a data source and a calculation engine.
When combined with scripting or automation tools:
Spreadsheet data can be retrieved via REST API
Built-in formulas handle calculations directly in the table
Scripts consume processed values, not raw data
Automation logic stays simpler and more maintainable
Table updates do not require script changes
Key Benefits
Structured spreadsheet data that scripts can reliably read
Consistent table layout across issues
Built-in formulas reduce the need for custom code
REST API access to calculated values
Non-technical users can update data without touching scripts
API Access
The REST API for Excel-like Tables for Jira is currently in beta.
It is suitable for:
Prototyping
Internal automation
Controlled production usage
Note: API structure and behavior may change as the app transitions to the Forge platform.
Support Policy
Please note that we do not provide support for scripting. However, if you have a specific use case you’d like to share and believe it highlights a potential product gap or opportunity, feel free to submit it as a feature request through our support portal. We’re always happy to review and consider feedback that helps improve the product.
Retrieve Table Data
To retrieve table data for an issue, call:
GET https://excel-like-tables-for-jira.herokuapp.com/rest/api/table/{issueKey}?host={your-jira-domain}
For more information of what it returns you can refer to this page: Excel-like Tables for Jira – Simplified REST API Response and Data Structure
Example Usage in Scriptrunner
Below is an example of using ScriptRunner for Jira Cloud to automate actions based on data stored in Excel-like Tables for Jira.
This script runs when a Jira issue is updated. It retrieves table data from the issue, reads values from a specific column, and creates Jira Tasks based on table rows.
Automation Flow
This example demonstrates a common automation pattern:
A Jira issue is updated
A ScriptRunner listener is triggered
The script calls the Excel-like Tables for Jira REST API
The script iterates through table rows
A value is extracted from a specific column
A Jira Task is created for each valid row
What the Script Does
Fetches the Excel-like Table attached to the current issue
Assumes a simple table structure:
Column A: Row number (ignored)
Column B: Task name
Skips the header row
Skips empty rows
Creates one Jira Task per valid row
Uses the cell value as the task summary
Adds a reference to the source issue in the task description
This allows non-technical users to control automation behavior simply by editing table data.
Key Configuration Points
Most users only need to adjust the following values to match their table layout:
def TASK_COLUMN = "1" // Column index containing task names
def HEADER_ROW = 0 // Header row index
No changes to the core logic are required when table content changes.
Example Script
import groovy.json.JsonSlurper
import java.util.Base64
/**
* SAMPLE SCRIPT
* Demonstrates how to:
* - Fetch an Excel-like Table
* - Select cells by column index
* - Skip headers and numbering
* - Create Jira Tasks from table rows
*
* This script is intentionally verbose for documentation clarity.
*/
// =====================================================
// Context
// =====================================================
def issueKey = issue.key
def projectKey = issue.fields.project.key
// =====================================================
// Resolve Jira host (required by Excel-like Tables API)
// =====================================================
def serverInfo = get("/rest/api/3/serverInfo").asObject(Map)
def jiraHost = serverInfo.body.baseUrl.replace("https://", "")
// =====================================================
// Authentication (sample only)
// =====================================================
def username = "ATLASSIAN_EMAIL"
def apiToken = "ATLASSIAN API TOKEN"
def authHeader = "Basic ${"${username}:${apiToken}".bytes.encodeBase64()}"
// =====================================================
// Fetch Excel-like Table JSON
// =====================================================
def apiUrl =
"https://excel-like-tables-for-jira.herokuapp.com" +
"/rest/api/table/${issueKey}?host=${jiraHost}"
def tableResponse = get(apiUrl)
.header("Accept", "application/json")
.header("Authorization", authHeader)
.asObject(Map)
if (tableResponse.status != 200) {
logger.error("Failed to fetch table: ${tableResponse.status}")
return
}
def tableJson = tableResponse.body
// =====================================================
// Choose columns (THIS IS WHAT USERS CHANGE)
// =====================================================
// Column indexes (0-based)
def NUMBER_COLUMN = "0" // Column A (ignored)
def TASK_COLUMN = "1" // Column B (Task Name)
// Header row index
def HEADER_ROW = 0
// =====================================================
// Iterate rows safely
// =====================================================
tableJson.sheets.Sheet1.data.dataTable.each { rowIndex, columns ->
int row = rowIndex.toInteger()
// Skip header row
if (row == HEADER_ROW) {
return
}
// Read task name from Column B
def taskSummary = columns[TASK_COLUMN]?.value
// Skip empty rows
if (!taskSummary) {
return
}
// -------------------------------------------------
// Create Jira Task
// -------------------------------------------------
def createResp = post("/rest/api/3/issue")
.header("Content-Type", "application/json")
.body([
fields: [
project : [ key: projectKey ],
issuetype: [ name: "Task" ],
summary : taskSummary.toString(),
description: [
type : "doc",
version: 1,
content: [[
type : "paragraph",
content: [[
type: "text",
text: "Created from Excel-like Table on ${issueKey}"
]]
]]
]
]
])
.asObject(Map)
if (createResp.status != 201) {
logger.warn("Failed to create task for row ${row}")
}
}
Alternative to Scripting
Excel-like Tables for Jira also supports spreadsheet formulas, allowing simple calculations and logic to be performed directly within the table. When paired with Jira field mapping, these calculated values can automatically populate Jira fields without requiring any scripting.
This approach is suitable when only basic automation is needed and provides a straightforward way to keep Jira fields in sync with spreadsheet data.