6.6 KiB
| title | sidebar_label | description | pagination_prev | pagination_next |
|---|---|---|---|---|
| Spreadsheets in NetSuite SuiteScripts | NetSuite | Automate the NetSuite ERP platform with SuiteScripts. Effortlessly read and write spreadsheets using SheetJS. Modernize Excel-powered business processes with confidence. | demos/local/index | demos/extensions/index |
import current from '/version.js'; import CodeBlock from '@theme/CodeBlock';
NetSuite is a suite of cloud-based software systems for Enterprise Resource Planning (ERP). It has a robust scripting interface.1
SheetJS is a JavaScript library for reading and writing data from spreadsheets.
This demo explores the SuiteScript scripting features in NetSuite. We'll explore how to use SheetJS in SuiteScripts for reading and writing files in NetSuite.
:::note
This demo was verified by NetSuite consultants in the following deployments:
@NScriptType |
@NApiVersion |
Date |
|---|---|---|
| ScheduledScript | 2.1 | 2023-08-18 |
| Restlet | 2.1 | 2023-04-20 |
| Suitelet | 2.1 | 2023-07-21 |
| MapReduceScript | 2.1 | 2023-07-31 |
:::
Installation
In SuiteScript parlance, third-party scripts are "Custom Modules"2.
The SheetJS AMD script can be uploaded
to the file cabinet and referenced in the define call in SuiteScripts.
:::info pass
SheetJS scripts have been tested against the Rhino engine3 and work in both SuiteScript 2.0 and SuiteScript 2.1.
:::
Adding SheetJS Scripts
The SheetJS standalone script should be uploaded to the File Cabinet.
:::note pass
It is strongly recommended to keep the original filename xlsx.full.min.js.
:::
JSON Configuration
Assuming the uploaded file was named xlsx.full.min.js, the paths object in
the JSON configuration should reference xlsx.full.min. The reference can be
absolute or relative4.
For example, if the script xlsx.full.min.js was placed in the SuiteScripts
top-level directory, the config should use "/SuiteScripts/xlsx.full.min":
{
"paths": {
// highlight-next-line
"xlsx": "/SuiteScripts/xlsx.full.min"
}
}
Relative references are also supported. If the entire project is stored in one
folder, the config can use "./xlsx.full.min":
{
"paths": {
// highlight-next-line
"xlsx": "./xlsx.full.min"
}
}
SuiteScript Usage
The JSON configuration file should be referenced in SuiteScripts using
@NAmdConfig. The path alias "xlsx" should be passed to define:
/**
* @NApiVersion 2.x
// highlight-next-line
* @NAmdConfig ./JsLibraryConfig.json
* ... more options ...
*/
// highlight-next-line
define(['N/file', 'xlsx'], function(file, XLSX) {
// ... use XLSX here ...
});
Sheets in the File Cabinet
The NetSuite File Cabinet5 is the primary feature for storing documents.
N/file is the primary module for interacting with the File Cabinet6.
This section assumes that N/file is bound to the variable file:
define(
['N/file', 'xlsx'],
function(
// highlight-next-line
file, // 'N/file'
XLSX // 'xlsx'
) {
// ...
}
);
Reading Files
There are three steps to reading files:
-
Pull files from the file cabinet using
file.load7. The method returns afile.Fileobject which represents the file metadata. -
Read raw data from the file using
File#getContents8. The method returns the data as a Base64-encoded string. -
Parse the data with the SheetJS
readmethod9. This method returns a SheetJS workbook object.
file.load expects an id property, which can be the internal ID (displayed in
the File Cabinet web interface) or an absolute or relative path string.
/* file ID or path */
var id_of_file = 7262; // Internal ID 7262
/* load file */
var f = file.load({ id: id_of_file });
/* read file */
var b64 = f.getContents();
/* parse */
var workbook = XLSX.read(b64, { type: "base64" });
At this point, standard SheetJS utility functions10 can extract data from the workbook object.
Writing Files
There are three steps to writing files:
-
Write the data with the SheetJS
writemethod11. Using thebase64output type12, the method will return a Base64 string. -
Create a new file using
file.create13. The recommended file type isfile.Type.EXCEL. The method returns afile.Fileobject. -
Upload data to the File Cabinet with
File#save14
/* write XLSX workbook as Base64 string */
var out = XLSX.write(workbook, { bookType: "xlsx", type: "base64" });
/* create file */
var newfile = file.create({
name: 'test.xlsx', // replace with desired name
fileType: file.Type.EXCEL,
contents: out
});
/* save */
newfile.save();
-
See "SuiteScript 2.x API Introduction" in the NetSuite documentation. ↩︎
-
See "SuiteScript 2.x Custom Modules" in the NetSuite documentation. ↩︎
-
See "Module Dependency Paths" in the NetSuite documentation. ↩︎
-
See "File Cabinet Overview" in the NetSuite documentation. ↩︎
-
See
N/fileModule in the NetSuite documentation. ↩︎ -
See
File.getContents()in the NetSuite documentation. ↩︎ -
See
file.createin the NetSuite documentation. ↩︎ -
See
File.save()in the NetSuite documentation. ↩︎