Convert HTML table data into csv using scriptrunner

Vikrant Yadav
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
March 23, 2022

Hi Guys,

Need your help , i am trying to send jira users list using Scriptrunner jobs which run on every monday using the following script which send complete user list there last login status in email  but it's sending complete table. Instead of table i want to convert it into csv and send email as a attachment. Kindly suggest, how can i covert html table builder into csv. 

 

import com.atlassian.mail.Email
import com.atlassian.mail.server.MailServerManager
import com.atlassian.mail.server.SMTPMailServer
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueManager

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.security.login.LoginManager
import java.text.SimpleDateFormat;
import java.util.Date;
import com.atlassian.jira.user.util.UserUtil
UserUtil userUtil = ComponentAccessor.getUserUtil()
def loginManager = ComponentAccessor.getComponentOfType(LoginManager.class)
def users=ComponentAccessor.getUserUtil().getUsers()
StringBuilder builder=new StringBuilder()
builder.append("<table border = 1><tr><td><b>User Name</b></td><td><b>Full Name</b></td><td><b>eMail Address</b></td><td><b>Last Login</b></td><td><b>Status</b></td></tr>")
users.each{
Long lastLoginTime = loginManager.getLoginInfo(it.username).getLastLoginTime()
String activeStatus=it.active
if(userUtil.getGroupsForUser(it.getName()).size() == 0)
//builder.append("<tr><td>"+it.username+"</td><td>"+it.displayName+"</td><td>"+it.emailAddress+"</td><td>No Group added</td><td>"+it.active+"</td></tr>")
return
else if(activeStatus=="false")
builder.append("<tr><td>"+it.username+"</td><td>"+it.displayName+"</td><td>"+it.emailAddress+"</td><td>Inactive User</td><td>"+it.active+"</td></tr>")
else if(lastLoginTime==null)
builder.append("<tr><td>"+it.username+"</td><td>"+it.displayName+"</td><td>"+it.emailAddress+"</td><td>Logon not found</td><td>"+it.active+"</td></tr>")
else{
Date date=new Date(lastLoginTime);
SimpleDateFormat df2 = new SimpleDateFormat("dd/MM/yy hh:mm");
String dateText = df2.format(date);
builder.append("<tr><td>"+it.username+"</td><td>"+it.displayName+"</td><td>"+it.emailAddress+"</td><td>"+dateText+"</td><td>"+it.active+"</td></tr>")
}

}
builder.append("</table>")
//return builder


def subject = "User data"
def body = "${builder.append("</table>")}"
def emailAddr = "vikrant.yadav@xyz.com"

def sendEmail(String emailAddr, String subject, String body) {
def mailServer = ComponentAccessor.getMailServerManager().getDefaultSMTPMailServer()
if (mailServer) {
Email email = new Email(emailAddr);
email.setMimeType("text/html")
email.setSubject(subject);
email.setBody(body);
mailServer.send(email);
log.warn("Mail sent")
} else {
log.warn("Please make sure that a valid mailServer is configured")
}
}
sendEmail (emailAddr,subject, body)

 

2 answers

1 accepted

1 vote
Answer accepted
Ram Kumar Aravindakshan _Adaptavist_
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
March 25, 2022

Hi @Vikrant Yadav,

To convert the HTML table to CSV, you could try modifying your code and include something like:-

import org.jsoup.Jsoup

def writer = new FileWriter('csv.txt')

def doc = Jsoup.parseBodyFragment(builder.toString())
def rows = doc.getElementsByTag('tr')

rows.each {
it.getElementsByTag('td')
}.collect().each {
writer.write(it.text().concat(', '))
}
writer.write('\n')
writer.close()

You will then need to include the file MimeMultipart and MimeBodyPart.

Below is a sample code of how the MimeMultipart and MimeBodyPart is used:-

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.mail.Email
import com.atlassian.jira.user.ApplicationUser
import groovy.xml.MarkupBuilder
import org.apache.commons.io.FileUtils

import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMultipart

def issue = event.issue

def customFieldManager = ComponentAccessor.customFieldManager
def attachmentManager = ComponentAccessor.attachmentManager

def userPicker = customFieldManager.getCustomFieldObjectsByName('User Account').first()
def userPickerValue = issue.getCustomFieldValue(userPicker) as ApplicationUser
def attachments = attachmentManager.getAttachments(issue)

final def jiraResourcesPath = '/media/ram/Linux_Disk_Space/atlassian/application-data/jira8/data/attachments'
final def project = issue.projectObject
final def projectKey = project.key
final def issueKey = issue.key
final def recipientEmail = userPickerValue.emailAddress
final def destinationPath = '/tmp'
final def subject = 'This is a test mail'

def emailBody = new StringWriter()
def html = new MarkupBuilder(emailBody)

html.html {
body {
h1 'New Employee'
h2 'Sample Content For Testing Purposes'
}
}

def latestAttachment = attachments.findAll {
it.filename.endsWith('.pdf')
}.sort { it.created }.last()


def fileName = latestAttachment.id
def filePath = "${jiraResourcesPath}/${projectKey}/10000/${issueKey}".toString()
def oldFile = new File("${filePath}/${fileName}")
def dest = new File("${destinationPath}/${userPickerValue.displayName}.pdf")
FileUtils.copyFile(oldFile, dest)
creatMessage(recipientEmail, subject, emailBody.toString(), "${dest.canonicalPath}")
FileUtils.forceDelete(dest)


static creatMessage(String to, String subject, String content, String filename) {
def mailServerManager = ComponentAccessor.mailServerManager
def mailServer = mailServerManager.defaultSMTPMailServer

def multipart = new MimeMultipart()
def body = new MimeBodyPart()
def mailAttachment = new MimeBodyPart()

body.setContent(content, 'text/html; charset=utf-8')
mailAttachment.attachFile(new File(filename))

multipart.addBodyPart(body)
multipart.addBodyPart(mailAttachment)

def email = new Email(to)
email.setSubject(subject)
email.setMultipart(multipart)
email.setMimeType("text/html")

def threadClassLoader = Thread.currentThread().contextClassLoader
Thread.currentThread().contextClassLoader = mailServer.class.classLoader
mailServer.send(email)
Thread.currentThread().contextClassLoader = threadClassLoader
}

Also, I would suggest that you try and use the MarkupBuilder to configure your HTML table. There is an example of how the MarkupBuilder can be used in the code above. For more info on creating a table with the MarkupBuilder, you can visit this link.

I hope this helps to solve your question. :)

Thank you and Kind regards,

Ram

Vikrant Yadav
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
March 27, 2022

Hi @Ram Kumar Aravindakshan _Adaptavist_  Thanks for the response. 
First code is fine it’ll create a txt file , right?

But second I am not sure where to append/insert following data :- 

My script is iterating for each user .. how can I write output in csv file Which created using first code . Kindly suggest I am not good in scripting .. 

Or you can suggest any other method like API to get jira user data along with full , email address, user id, status and last login time .. which generate a csv file .

I m using scriptrunner  job which run every Monday and send user data in email in body not attachment . I want to make body into attachment excel or csv both are fine. 

if(userUtil.getGroupsForUser(it.getName()).size() == 0) 
//builder.append("<tr><td>"+it.username+"</td><td>"+it.displayName+"</td><td>"+it.emailAddress+"</td><td>No Group added</td><td>"+it.active+"</td></tr>")
return
else if(activeStatus=="false")
builder.append("<tr><td>"+it.username+"</td><td>"+it.displayName+"</td><td>"+it.emailAddress+"</td><td>Inactive User</td><td>"+it.active+"</td></tr>")
else if(lastLoginTime==null)
builder.append("<tr><td>"+it.username+"</td><td>"+it.displayName+"</td><td>"+it.emailAddress+"</td><td>Logon not found</td><td>"+it.active+"</td></tr>")
else{
Date date=new Date(lastLoginTime);
SimpleDateFormat df2 = new SimpleDateFormat("dd/MM/yy hh:mm");
String dateText = df2.format(date);
builder.append("<tr><td>"+it.username+"</td><td>"+it.displayName+"</td><td>"+it.emailAddress+"</td><td>"+dateText+"</td><td>"+it.active+"</td></tr>")

Thanks 

VY

Ram Kumar Aravindakshan _Adaptavist_
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 7, 2022

Hi @Vikrant Yadav

To answer your question, you can try something like this:-

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.security.login.LoginManager
import com.atlassian.mail.Email
import groovy.xml.MarkupBuilder
import org.jsoup.Jsoup

import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMultipart
import java.text.SimpleDateFormat

def loginManager = ComponentAccessor.getComponentOfType(LoginManager.class)
def groupManager = ComponentAccessor.groupManager
def userUtil = ComponentAccessor.userUtil

def adminGroup = groupManager.getUsersInGroup('jira-administrators')
def softwareGroup = groupManager.getUsersInGroup('jira-software-users')
def serviceDeskGroup = groupManager.getUsersInGroup('jira-servicedesk-users')

def users = adminGroup + softwareGroup + serviceDeskGroup
users.unique()

final def filePath = '/tmp'

def emailBody = new StringWriter()

def html = new MarkupBuilder(emailBody)
html.html {
head {
style(type:'text/css', """
table {
border-collapse: collapse;
width: 100%;
}

th, td {
text-align: left;
padding: 8px;
}

tr:nth-child(even){background-color: #f2f2f2}

th {
background-color: #04AA6D;
color: white;
}
""".toString() )
}
body {
table {
thead {
tr {
th 'User Name'
th 'Full Name'
th 'Email Address'
th 'Last Login'
th 'Status'
}
users.each {
def lastLoginTime = loginManager.getLoginInfo(it.username).lastLoginTime
def username = it.username
def displayName = it.displayName
def emailAddress = it.emailAddress
def active = it.active

if (userUtil.getGroupsForUser(it.name).size() > 0) {

tr {
if (!active) {
td ( username )
td ( displayName )
td ( emailAddress )
td ('Inactive User' )
td ( active )
} else if (!lastLoginTime) {
td ( username )
td ( displayName )
td ( emailAddress )
td ('Logon not found' )
td ( active )
} else {
def date = new Date(lastLoginTime)
def df2 = new SimpleDateFormat("dd/MM/yy hh:mm")
def dateText = df2.format(date)
td ( username )
td ( displayName )
td ( emailAddress )
td ( dateText )
td ( active )
}
}
}
}
}
}
}
}

def dest = new File("${filePath}/output.csv")
dest.createNewFile()

def subject = 'User data'
def emailAddr = 'sample@user.com'

def fileWriter = new FileWriter("${filePath}/output.csv")
fileWriter.write(generateCSV(emailBody.toString()))
fileWriter.close()

final static String generateCSV(String tableDetails) {
def stringWriter = new StringWriter()
def doc = Jsoup.parseBodyFragment(tableDetails)
def rows = doc.getElementsByTag('tr')

rows.each {
def header = it.getElementsByTag('th')
def cells = it.getElementsByTag('td')

header.each { headerCell ->
stringWriter.append(headerCell.text().concat(', '))
}
cells.each { cell ->
stringWriter.append(cell.text().concat(', '))
}
stringWriter.append('\n')
}
stringWriter.toString()
}


final static creatMessage(String to, String subject, String content, File file) {
def mailServerManager = ComponentAccessor.mailServerManager
def mailServer = mailServerManager.defaultSMTPMailServer

def multipart = new MimeMultipart()
def body = new MimeBodyPart()
def mailAttachment = new MimeBodyPart()

body.setContent(content, 'text/html; charset=utf-8')
mailAttachment.attachFile(file)

multipart.addBodyPart(body)
multipart.addBodyPart(mailAttachment)

def email = new Email(to)
email.setSubject(subject)
email.setMultipart(multipart)
email.setMimeType("text/html")

def threadClassLoader = Thread.currentThread().contextClassLoader
Thread.currentThread().contextClassLoader = mailServer.class.classLoader
mailServer.send(email)
Thread.currentThread().contextClassLoader = threadClassLoader
}

creatMessage(emailAddr, subject, emailBody.toString(), dest)

Please note that the sample working code above is not 100% exact to your environment. Hence, you will need to modify it accordingly.

If you observe in the code, I have created two different static methods, i.e. the first is to generate the CSV file, and the second is to send the email. Also, instead of getting the users by using the UserUtil class, which is deprecated as shown below:-

def userUtil = ComponentAccessor.userUtil
def user = userUtil.users

I have instead got the users from the Group using the Group Manager as shown below:-

def groupManager = ComponentAccessor.groupManager
....

def adminGroup = groupManager.getUsersInGroup('jira-administrators')
def softwareGroup = groupManager.getUsersInGroup('jira-software-users')
def serviceDeskGroup = groupManager.getUsersInGroup('jira-servicedesk-users')

def users = adminGroup + softwareGroup + serviceDeskGroup

The Collection of users from all the groups will be merged into a single Collection, and any duplicates will be removed.

Below is a print screen of the Jobs configuration:-

jobs_config.png

Below is the output that is returned in the email. If you observe, the table formatted is added to the email's body and included as an attachment in the CSV file format.

email_output.png

And the CSV file data are shown on the print screen below:-

csv_output.png

I hope this helps to solve your question. :)

Thank you and Kind regards,

Ram

Like Vikrant Yadav likes this
Vikrant Yadav
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 7, 2022

Hi @Ram Kumar Aravindakshan _Adaptavist_  Thanks for a lot for spending your precious time on my query. 

Script runner job is showing green,,but not sure why it's throwing an error :- 

 

java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy461.doInTransaction(Unknown Source)
at com.atlassian.plugin.osgi.bridge.external.HostComponentFactoryBean$DynamicServiceInvocationHandler.invoke(HostComponentFactoryBean.java:130)
at com.sun.proxy.$Proxy461.doInTransaction(Unknown Source)
at com.atlassian.sal.core.transaction.HostContextTransactionTemplate.execute(HostContextTransactionTemplate.java:18)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56)
at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:136)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:124)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70)
at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:136)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:124)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy3166.execute(Unknown Source)
at com.atlassian.sal.api.transaction.TransactionTemplate$execute.call(Unknown Source)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob$_execute_closure1.doCall(AbstractCustomScheduledJob.groovy:113)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob$_execute_closure1.doCall(AbstractCustomScheduledJob.groovy)
at com.onresolve.scriptrunner.runner.diag.DiagnosticsManagerImpl$DiagnosticsExecutionHandlerImpl$_execute_closure1.doCall(DiagnosticsManagerImpl.groovy:370)
at com.onresolve.scriptrunner.runner.diag.DiagnosticsManagerImpl$DiagnosticsExecutionHandlerImpl$_execute_closure1.doCall(DiagnosticsManagerImpl.groovy)
at com.onresolve.scriptrunner.runner.ScriptExecutionRecorder.withRecording(ScriptExecutionRecorder.groovy:13)
at com.onresolve.scriptrunner.runner.ScriptExecutionRecorder$withRecording.call(Unknown Source)
at com.onresolve.scriptrunner.runner.diag.DiagnosticsManagerImpl$DiagnosticsExecutionHandlerImpl.execute(DiagnosticsManagerImpl.groovy:368)
at com.onresolve.scriptrunner.runner.diag.DiagnosticsExecutionHandler$execute$3.call(Unknown Source)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob.execute(AbstractCustomScheduledJob.groovy:126)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob$execute.callCurrent(Unknown Source)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob.execute(AbstractCustomScheduledJob.groovy:102)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob.execute(AbstractCustomScheduledJob.groovy)
at com.onresolve.scriptrunner.canned.AbstractCannedScript.doScript(AbstractCannedScript.groovy:81)
at com.onresolve.scriptrunner.canned.CannedScript$doScript$1.call(Unknown Source)
at com.onresolve.scriptrunner.runner.AbstractScriptRunner.validateAndRunCannedInternal(AbstractScriptRunner.groovy:638)
at com.onresolve.scriptrunner.runner.ScriptRunnerImpl.super$2$validateAndRunCannedInternal(ScriptRunnerImpl.groovy)
at com.onresolve.scriptrunner.runner.ScriptRunnerImpl.validateAndRunCannedInternal(ScriptRunnerImpl.groovy:124)
at com.onresolve.scriptrunner.runner.AbstractScriptRunner.validateAndRunCanned(AbstractScriptRunner.groovy:594)
at com.onresolve.scriptrunner.runner.ScriptRunner$validateAndRunCanned$6.call(Unknown Source)
at com.onresolve.scriptrunner.runner.rest.AbstractBaseRestEndpoint.previewOrExecCanned(AbstractBaseRestEndpoint.groovy:81)
at com.onresolve.scriptrunner.runner.rest.AbstractBaseRestEndpoint$previewOrExecCanned$1.callCurrent(Unknown Source)
at com.onresolve.scriptrunner.runner.rest.AbstractBaseRestEndpoint.previewOrExecCanned(AbstractBaseRestEndpoint.groovy:46)
at com.onresolve.scriptrunner.runner.rest.common.ScheduledJobsEndpoint.preview(ScheduledJobsEndpoint.groovy:78)
at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper$ResponseOutInvoker.lambda$_dispatch$0(DispatchProviderHelper.java:181)
at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper.lambda$invokeMethodWithInterceptors$0(DispatchProviderHelper.java:81)
at com.atlassian.plugins.rest.common.interceptor.impl.DefaultMethodInvocation.invoke(DefaultMethodInvocation.java:53)
at com.atlassian.plugins.rest.common.expand.interceptor.ExpandInterceptor.intercept(ExpandInterceptor.java:42)
at com.atlassian.plugins.rest.common.interceptor.impl.DefaultMethodInvocation.invoke(DefaultMethodInvocation.java:53)
at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper.invokeMethodWithInterceptors(DispatchProviderHelper.java:106)
at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper$ResponseOutInvoker._dispatch(DispatchProviderHelper.java:180)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558)
at com.atlassian.plugins.rest.module.RestDelegatingServletFilter$JerseyOsgiServletContainer.doFilter(RestDelegatingServletFilter.java:162)
at com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:829)
at com.atlassian.plugins.rest.module.RestDelegatingServletFilter.doFilter(RestDelegatingServletFilter.java:72)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:55)
at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:43)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.plugins.rest.module.servlet.RestServletUtilsUpdaterFilter.doFilterInternal(RestServletUtilsUpdaterFilter.java:23)
at com.atlassian.plugins.rest.module.servlet.RestServletUtilsUpdaterFilter.doFilter(RestServletUtilsUpdaterFilter.java:35)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.mywork.client.filter.ServingRequestsFilter.doFilter(ServingRequestsFilter.java:32)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.jira.plugin.mobile.web.filter.MobileAppRequestFilter.doFilter(MobileAppRequestFilter.java:59)
at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.jira.plugin.mobile.login.MobileLoginSuccessFilter.doFilter(MobileLoginSuccessFilter.java:54)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.diagnostics.internal.platform.monitor.http.HttpRequestMonitoringFilter.doFilter(HttpRequestMonitoringFilter.java:55)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.analytics.client.filter.UniversalAnalyticsFilter.doFilter(UniversalAnalyticsFilter.java:75)
at com.atlassian.analytics.client.filter.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:33)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFixupFilter.doFilter(PrettyUrlsSiteMeshFixupFilter.java:32)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.prettyurls.filter.PrettyUrlsDispatcherFilter.doFilter(PrettyUrlsDispatcherFilter.java:55)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFilter.doFilter(PrettyUrlsSiteMeshFilter.java:80)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.prettyurls.filter.PrettyUrlsMatcherFilter.doFilter(PrettyUrlsMatcherFilter.java:51)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.labs.botkiller.BotKillerFilter.doFilter(BotKillerFilter.java:35)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:55)
at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:43)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.atlassian.jira.web.filters.MobileAppRequestFilter.doFilter(MobileAppRequestFilter.java:36)
at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.atlassian.jira.web.filters.accesslog.AccessLogFilter.executeRequest(AccessLogFilter.java:93)
at com.atlassian.jira.web.filters.accesslog.AccessLogFilter.doFilter(AccessLogFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.atlassian.jira.web.filters.pagebuilder.PageBuilderFilter.doFilter(PageBuilderFilter.java:81)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.atlassian.jira.web.filters.CommittedResponseHtmlErrorRecoveryFilter.doFilter(CommittedResponseHtmlErrorRecoveryFilter.java:55)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:39)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.ratelimiting.internal.filter.RateLimitFilter.doFilter(RateLimitFilter.java:73)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.troubleshooting.thready.filter.AbstractThreadNamingFilter.doFilter(AbstractThreadNamingFilter.java:46)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57)
at com.atlassian.prettyurls.filter.PrettyUrlsCombinedMatchDispatcherFilter.doFilter(PrettyUrlsCombinedMatchDispatcherFilter.java:56)
at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62)
at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37)
Ram Kumar Aravindakshan _Adaptavist_
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 7, 2022

Hi @Vikrant Yadav

From the log, the only ScriptRunner related error message is:-

at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob$_execute_closure1.doCall(AbstractCustomScheduledJob.groovy:113)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob$_execute_closure1.doCall(AbstractCustomScheduledJob.groovy)
at com.onresolve.scriptrunner.runner.diag.DiagnosticsManagerImpl$DiagnosticsExecutionHandlerImpl$_execute_closure1.doCall(DiagnosticsManagerImpl.groovy:370)
at com.onresolve.scriptrunner.runner.diag.DiagnosticsManagerImpl$DiagnosticsExecutionHandlerImpl$_execute_closure1.doCall(DiagnosticsManagerImpl.groovy)
at com.onresolve.scriptrunner.runner.ScriptExecutionRecorder.withRecording(ScriptExecutionRecorder.groovy:13)
at com.onresolve.scriptrunner.runner.ScriptExecutionRecorder$withRecording.call(Unknown Source)
at com.onresolve.scriptrunner.runner.diag.DiagnosticsManagerImpl$DiagnosticsExecutionHandlerImpl.execute(DiagnosticsManagerImpl.groovy:368)
at com.onresolve.scriptrunner.runner.diag.DiagnosticsExecutionHandler$execute$3.call(Unknown Source)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob.execute(AbstractCustomScheduledJob.groovy:126)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob$execute.callCurrent(Unknown Source)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob.execute(AbstractCustomScheduledJob.groovy:102)
at com.onresolve.scriptrunner.jobs.AbstractCustomScheduledJob.execute(AbstractCustomScheduledJob.groovy)
at com.onresolve.scriptrunner.canned.AbstractCannedScript.doScript(AbstractCannedScript.groovy:81)
at com.onresolve.scriptrunner.canned.CannedScript$doScript$1.call(Unknown Source)
at com.onresolve.scriptrunner.runner.AbstractScriptRunner.validateAndRunCannedInternal(AbstractScriptRunner.groovy:638)
at com.onresolve.scriptrunner.runner.ScriptRunnerImpl.super$2$validateAndRunCannedInternal(ScriptRunnerImpl.groovy)
at com.onresolve.scriptrunner.runner.ScriptRunnerImpl.validateAndRunCannedInternal(ScriptRunnerImpl.groovy:124)
at com.onresolve.scriptrunner.runner.AbstractScriptRunner.validateAndRunCanned(AbstractScriptRunner.groovy:594)
at com.onresolve.scriptrunner.runner.ScriptRunner$validateAndRunCanned$6.call(Unknown Source)
at com.onresolve.scriptrunner.runner.rest.AbstractBaseRestEndpoint.previewOrExecCanned(AbstractBaseRestEndpoint.groovy:81)
at com.onresolve.scriptrunner.runner.rest.AbstractBaseRestEndpoint$previewOrExecCanned$1.callCurrent(Unknown Source)
at com.onresolve.scriptrunner.runner.rest.AbstractBaseRestEndpoint.previewOrExecCanned(AbstractBaseRestEndpoint.groovy:46)
at com.onresolve.scriptrunner.runner.rest.common.ScheduledJobsEndpoint.preview(ScheduledJobsEndpoint.groovy:78)

There are no errors related to the sample code I have provided.

Could you temporarily disable all other Jobs you have configured, i.e. Escalation Service, Custom Scheduled Jobs, and Issue Archiving Jobs and try to test it again?

Thank you and Kind regards,

Ram

Like Vikrant Yadav likes this
Vikrant Yadav
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 7, 2022

Hi @Ram Kumar Aravindakshan _Adaptavist_ Thanks a lot for helping me! 
Script is fine, i think some issue in my file path

now i am getting following error :-

I am using the same path shared by you :- final def filePath = '/tmp'

Caused by: java.io.IOException: The system cannot find the path specified at java_io_File$createNewFile$1.call(Unknown Source) at Script1051.run(Script1051.groovy:99)

Ram Kumar Aravindakshan _Adaptavist_
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 7, 2022

Hi @Vikrant Yadav ,

The /tmp file path is the sample path I was using in my instance. It is applicable any Unix / Linux environment to store temporary files.

If you are using a Windows environment, you will need to change the directory accordingly.

Alternatively you are on Mac OS, you could change it to your Download directory for instance. 

Thank you and Kind regards,

Ram

Vikrant Yadav
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 7, 2022

Hi @Ram Kumar Aravindakshan _Adaptavist_  thanks… I am using windows .Do I need to define the complete path like C:/Atlassian/JIRA or only folder name is enough ?

Ram Kumar Aravindakshan _Adaptavist_
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 7, 2022

Hi @Vikrant Yadav 

For Windows, you need to specify the full path.

Hence, you need to take the former approach, i.e. C:/Atlassian/JIRA, or you could put it in a temp folder, for example, C:/Temp.

I hope this helps to solve your question. :)

Thank you and Kind regards,

Ram

Like Vikrant Yadav likes this
Vikrant Yadav
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
April 8, 2022

@Ram Kumar Aravindakshan _Adaptavist_  Awesome, it's perfect now. 

Have a Great Weekend! 

0 votes
Ravi Sagar _Sparxsys_
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
March 23, 2022

Hi @Vikrant Yadav 

Yes possible.

Create a file using.

 File file = new File(filePath)

Write the content to this file like this.

 file.write(contentOfTheFile)

Here contentOfTheFile could be your csv which you need to generate, you already have most of the code which you need to modify to create this simple csv file.

For sending the mail with attachment search for "MimeMultipart" or "MimeBodyPart". I don't have the code handy with me right now but I hope I have given you some pointers.

Ravi

Suggest an answer

Log in or Sign up to answer