Expand your SuiteScript skills in the Sustainable SuiteScript community for NetSuite developers.

SuiteScript Example - Rendering Query Results in a PDF

Created: November 14, 2020

With the advent of Analytics Workbooks and the N/query module, NetSuite has also added a method for rendering your query results within your PDF templates. Let's say you have a function to define your query, like so:

function findIndividuals () {
  const customerQuery = q.create({
    type: q.Type.CUSTOMER,
    columns: [
      { fieldId: 'email' },
      { fieldId: 'firstname' },
      { fieldId: 'lastname' }
  customerQuery.condition = customerQuery.createCondition({
    fieldId: 'isperson',
    operator: q.Operator.IS,
    values: true
  return customerQuery

Notice we don't actually run the query; we just create the Query instance. From there, we can leverage a TemplateRenderer from the N/render module and its addQuery() method, like so:

function renderPdf (response) {
  const xmlContent = file.load({ id: './custom-query.ftl' }).getContents()
  const renderer = render.create()
  renderer.templateContent = xmlContent
    templateName: 'individuals',
    query: findIndividuals(),
    pageIndex: 0,
    pageSize: 10
  const pdf = renderer.renderAsPdf()
  response.writeFile({ file: pdf, isInline: true })

where ./custom-query.ftl (our custom template) contains a section like this:

  <#list individuals![]>
      <th>Email Address</th>
    <#items as ind>
      <td>${ind[1]} ${ind[2]}</td>

The templateName we specify in addQuery() is the same variable name we use within our template to access the query results; in our example, that's individuals. From there, we can loop through (#list) the results, and we access values from individual columns with Array indexes (e.g. ind[1]). The order of the columns in the template is the same order in which they were defined when we created the Query.

Combining all those components renders a PDF like so:



This is an example from the Rendering PDFs with SuiteScript Cookbook.