docs.sheetjs.com/docz/docs/03-demos/09-cloud/02-netsuite.md

195 lines
6.6 KiB
Markdown
Raw Normal View History

2022-06-11 17:21:26 +00:00
---
2023-08-03 02:49:32 +00:00
title: Spreadsheets in NetSuite SuiteScripts
sidebar_label: NetSuite
2023-07-21 09:17:32 +00:00
description: Automate the NetSuite ERP platform with SuiteScripts. Effortlessly read and write spreadsheets using SheetJS. Modernize Excel-powered business processes with confidence.
2023-02-28 11:40:44 +00:00
pagination_prev: demos/local/index
pagination_next: demos/extensions/index
2022-06-11 17:21:26 +00:00
---
2023-05-03 03:40:40 +00:00
import current from '/version.js';
import CodeBlock from '@theme/CodeBlock';
2023-07-21 09:17:32 +00:00
[NetSuite](https://www.netsuite.com/) is a suite of cloud-based software systems
for Enterprise Resource Planning (ERP). It has a robust scripting interface.[^1]
[SheetJS](https://sheetjs.com) 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.
2023-05-03 03:40:40 +00:00
2023-07-21 09:17:32 +00:00
:::note
2022-06-11 17:21:26 +00:00
2023-07-21 09:17:32 +00:00
This demo was verified by NetSuite consultants in the following deployments:
2022-06-11 17:21:26 +00:00
2023-07-21 09:17:32 +00:00
| `@NScriptType` | `@NApiVersion` | Date |
|:----------------|:---------------|:-----------|
| ScheduledScript | 2.1 | 2023-03-09 |
| Restlet | 2.1 | 2023-04-20 |
| Suitelet | 2.1 | 2023-07-21 |
2023-08-03 02:49:32 +00:00
| MapReduceScript | 2.1 | 2023-07-31 |
2023-07-21 09:17:32 +00:00
:::
2022-06-11 17:21:26 +00:00
2022-11-18 18:22:01 +00:00
## Installation
2022-06-11 17:21:26 +00:00
2023-07-21 09:17:32 +00:00
In SuiteScript parlance, third-party scripts are "Custom Modules"[^2].
The [SheetJS AMD script](/docs/getting-started/installation/amd) 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 engine[^3] and work in both
SuiteScript 2.0 and SuiteScript 2.1.
:::
#### Adding SheetJS Scripts
2023-05-03 03:40:40 +00:00
<p><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`}>The
2023-07-21 09:17:32 +00:00
SheetJS standalone script</a> should be uploaded to the File Cabinet.</p>
2022-06-11 17:21:26 +00:00
2023-07-21 09:17:32 +00:00
:::note pass
2022-06-11 17:21:26 +00:00
2023-07-21 09:17:32 +00:00
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 relative[^4].
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"`:
```json title="JsLibraryConfig.json"
2022-06-11 17:21:26 +00:00
{
"paths": {
// highlight-next-line
"xlsx": "/SuiteScripts/xlsx.full.min"
}
}
```
2023-07-21 09:17:32 +00:00
Relative references are also supported. If the entire project is stored in one
folder, the config can use `"./xlsx.full.min"`:
```json title="JsLibraryConfig.json"
{
"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`:
2022-06-11 17:21:26 +00:00
```js
/**
* @NApiVersion 2.x
// highlight-next-line
* @NAmdConfig ./JsLibraryConfig.json
* ... more options ...
*/
// highlight-next-line
define(['N/file', 'xlsx'], function(file, XLSX) {
2022-11-08 05:43:21 +00:00
// ... use XLSX here ...
2022-06-11 17:21:26 +00:00
});
```
2023-07-21 09:17:32 +00:00
## Sheets in the File Cabinet
2022-06-11 17:21:26 +00:00
2023-07-21 09:17:32 +00:00
The NetSuite File Cabinet[^5] is the primary feature for storing documents.
2022-06-11 17:21:26 +00:00
2023-07-21 09:17:32 +00:00
`N/file` is the primary module for interacting with the File Cabinet[^6].
This section assumes that `N/file` is bound to the variable `file`:
2022-06-11 17:21:26 +00:00
```js
2023-07-21 09:17:32 +00:00
define(
['N/file', 'xlsx'],
function(
// highlight-next-line
file, // 'N/file'
XLSX // 'xlsx'
) {
// ...
}
);
```
### Reading Files
There are three steps to reading files:
1) Pull files from the file cabinet using `file.load`[^7]. The method returns a
`file.File` object which represents the file metadata.
2) Read raw data from the file using `File#getContents`[^8]. The method returns
the data as a Base64-encoded string.
3) Parse the data with the SheetJS `read` method[^9]. This method returns a
SheetJS workbook object.
2023-08-16 18:54:32 +00:00
`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.
2023-07-21 09:17:32 +00:00
```js
/* file ID or path */
var id_of_file = 7262; // Internal ID 7262
2022-06-11 17:21:26 +00:00
/* load file */
var f = file.load({ id: id_of_file });
2023-07-21 09:17:32 +00:00
/* read file */
var b64 = f.getContents();
2022-06-11 17:21:26 +00:00
/* parse */
2023-07-21 09:17:32 +00:00
var workbook = XLSX.read(b64, { type: "base64" });
2022-06-11 17:21:26 +00:00
```
2023-07-21 09:17:32 +00:00
At this point, standard SheetJS utility functions[^10] can extract data from the
workbook object.
2022-06-11 17:21:26 +00:00
2023-07-21 09:17:32 +00:00
### Writing Files
2022-06-11 17:21:26 +00:00
2023-07-21 09:17:32 +00:00
There are three steps to writing files:
1) Write the data with the SheetJS `write` method[^11]. Using the `base64` output
type[^12], the method will return a Base64 string.
2) Create a new file using `file.create`[^13]. The recommended file type is
`file.Type.EXCEL`. The method returns a `file.File` object.
3) Upload data to the File Cabinet with `File#save`[^14]
2022-06-11 17:21:26 +00:00
```js
2022-08-25 08:22:28 +00:00
/* write XLSX workbook as Base64 string */
2022-06-11 17:21:26 +00:00
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();
```
2023-07-21 09:17:32 +00:00
[^1]: See ["SuiteScript 2.x API Introduction"](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_4387172221.html) in the NetSuite documentation.
[^2]: See ["SuiteScript 2.x Custom Modules"](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_4704097697.html) in the NetSuite documentation.
[^3]: See ["Java + Rhino" demo](/docs/demos/engines/rhino)
[^4]: See ["Module Dependency Paths"](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4430268304.html#Module-Dependency-Paths) in the NetSuite documentation.
[^5]: See ["File Cabinet Overview"](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_N541319.html) in the NetSuite documentation.
[^6]: See [`N/file` Module](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4205693274.html) in the NetSuite documentation.
[^7]: See [`file.load`](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4226574300.html) in the NetSuite documentation.
[^8]: See [`File.getContents()`](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4229269811.html) in the NetSuite documentation.
[^9]: See [`read` in "Reading Files"](/docs/api/parse-options)
[^10]: See ["Utility Functions"](/docs/api/utilities/)
[^11]: See [`write` in "Writing Files"](/docs/api/write-options)
[^12]: See ["Supported Output Formats"](/docs/api/write-options#supported-output-formats)
[^13]: See [`file.create`](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4223861820.html) in the NetSuite documentation.
[^14]: See [`File.save()`](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4229271179.html) in the NetSuite documentation.