forked from sheetjs/docs.sheetjs.com
		
	netsuite
This commit is contained in:
		
							parent
							
								
									272cecf23c
								
							
						
					
					
						commit
						be15eb3620
					
				@ -30,7 +30,7 @@ function SheetJSXSpread() {
 | 
			
		||||
  const [url, setUrl] = React.useState("https://sheetjs.com/pres.numbers");
 | 
			
		||||
  const [done, setDone] = React.useState(false);
 | 
			
		||||
  const ref = React.useRef(); // ref to DIV container
 | 
			
		||||
  const set_url = React.useCallback((evt) => setUrl(evt.target.value));
 | 
			
		||||
  const set_url = (evt) => setUrl(evt.target.value);
 | 
			
		||||
 | 
			
		||||
  return ( <>
 | 
			
		||||
    <div height={300} width={300} ref={ref}/>
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,7 @@ function SheetJSCDG() {
 | 
			
		||||
  const [url, setUrl] = React.useState("https://sheetjs.com/pres.numbers");
 | 
			
		||||
  const [done, setDone] = React.useState(false);
 | 
			
		||||
  const ref = React.useRef(); // ref to DIV container
 | 
			
		||||
  const set_url = React.useCallback((evt) => setUrl(evt.target.value));
 | 
			
		||||
  const set_url = (evt) => setUrl(evt.target.value);
 | 
			
		||||
  const [cdg, setCdg] = React.useState(null); // reference to grid object
 | 
			
		||||
 | 
			
		||||
  return ( <>
 | 
			
		||||
 | 
			
		||||
@ -94,7 +94,7 @@ is strongly recommended to convert that array to a worksheet directly.
 | 
			
		||||
```jsx live
 | 
			
		||||
function SheetJStorage() {
 | 
			
		||||
  const [url, setUrl] = React.useState("https://sheetjs.com/pres.numbers");
 | 
			
		||||
  const set_url = React.useCallback((evt) => setUrl(evt.target.value));
 | 
			
		||||
  const set_url = (evt) => setUrl(evt.target.value);
 | 
			
		||||
  const [out, setOut] = React.useState("");
 | 
			
		||||
  const xport = React.useCallback(async() => {
 | 
			
		||||
    // get first worksheet data as array of objects
 | 
			
		||||
 | 
			
		||||
@ -119,7 +119,7 @@ function SheetJSQLWriter() {
 | 
			
		||||
    })).filter(x => x).slice(0, 6);
 | 
			
		||||
  }
 | 
			
		||||
  const [url, setUrl] = React.useState("https://sheetjs.com/data/cd.xls");
 | 
			
		||||
  const set_url = React.useCallback((evt) => setUrl(evt.target.value));
 | 
			
		||||
  const set_url = (evt) => setUrl(evt.target.value);
 | 
			
		||||
  const [out, setOut] = React.useState("");
 | 
			
		||||
  const xport = React.useCallback(async() => {
 | 
			
		||||
    const ab = await (await fetch(url)).arrayBuffer();
 | 
			
		||||
 | 
			
		||||
@ -1,37 +1,72 @@
 | 
			
		||||
---
 | 
			
		||||
title: NetSuite
 | 
			
		||||
sidebar_title: NetSuite
 | 
			
		||||
description: Automate the NetSuite ERP platform with SuiteScripts. Effortlessly read and write spreadsheets using SheetJS. Modernize Excel-powered business processes with confidence.
 | 
			
		||||
pagination_prev: demos/local/index
 | 
			
		||||
pagination_next: demos/extensions/index
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
# Spreadsheets in NetSuite SuiteScripts
 | 
			
		||||
 | 
			
		||||
import current from '/version.js';
 | 
			
		||||
import CodeBlock from '@theme/CodeBlock';
 | 
			
		||||
 | 
			
		||||
The [AMD script](/docs/getting-started/installation/amd) can be uploaded to the
 | 
			
		||||
file cabinet and referenced in the `define` call in SuiteScripts.
 | 
			
		||||
[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]
 | 
			
		||||
 | 
			
		||||
This demo discusses the key SheetJS operations.  Familiarity with SuiteScript 2
 | 
			
		||||
is assumed.  The following sections of the SuiteScript documentation should be
 | 
			
		||||
perused before reading this demo:
 | 
			
		||||
[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing
 | 
			
		||||
data from spreadsheets.
 | 
			
		||||
 | 
			
		||||
- [SuiteScript 2.x API Introduction](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_4387172221.html)
 | 
			
		||||
  is an introduction that includes a simple example with deployment details,
 | 
			
		||||
- [SuiteScript 2.x Custom Modules](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_4704097697.html)
 | 
			
		||||
  covers custom modules and adding third party scripts to modules.
 | 
			
		||||
- [`N/file` Module](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4205693274.html)
 | 
			
		||||
  covers the `N/file` module.  It is the main API for interacting with files.
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
The library plays nice with each script type, including RESTlets and Suitelets.
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was verified by NetSuite consultants in the following deployments:
 | 
			
		||||
 | 
			
		||||
| `@NScriptType`  | `@NApiVersion` | Date       |
 | 
			
		||||
|:----------------|:---------------|:-----------|
 | 
			
		||||
| ScheduledScript | 2.1            | 2023-03-09 |
 | 
			
		||||
| Restlet         | 2.1            | 2023-04-20 |
 | 
			
		||||
| Suitelet        | 2.1            | 2023-07-21 |
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
<p><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`}>The
 | 
			
		||||
standalone script</a> should be downloaded and uploaded to the File Cabinet.</p>
 | 
			
		||||
SheetJS standalone script</a> should be uploaded to the File Cabinet.</p>
 | 
			
		||||
 | 
			
		||||
After uploading, create a JSON configuration file (or add the alias to an
 | 
			
		||||
existing config file).  The reference points to the file and omits the `.js`.
 | 
			
		||||
:::note pass
 | 
			
		||||
 | 
			
		||||
```json
 | 
			
		||||
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"
 | 
			
		||||
{
 | 
			
		||||
  "paths": {
 | 
			
		||||
    // highlight-next-line
 | 
			
		||||
@ -40,8 +75,22 @@ existing config file).  The reference points to the file and omits the `.js`.
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
This config file should be referenced in SuiteScripts using `@NAmdConfig`. This
 | 
			
		||||
part is documented in ["Import a third-party JavaScript Library"](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4704111062.html#bridgehead_4738199877):
 | 
			
		||||
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`:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/**
 | 
			
		||||
@ -56,28 +105,67 @@ define(['N/file', 'xlsx'], function(file, XLSX) {
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Reading Files
 | 
			
		||||
## Sheets in the File Cabinet
 | 
			
		||||
 | 
			
		||||
`N/file` provides [`file.load`](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4226574300.html)
 | 
			
		||||
for pulling files:
 | 
			
		||||
The NetSuite File Cabinet[^5] is the primary feature for storing documents.
 | 
			
		||||
 | 
			
		||||
[`File#getContents`](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4229269811.html)
 | 
			
		||||
returns the data as a Base64-encoded string which can be read with `XLSX.read`:
 | 
			
		||||
`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`:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* load file */
 | 
			
		||||
var f = file.load({ id: id_of_file });
 | 
			
		||||
/* parse */
 | 
			
		||||
var workbook = XLSX.read(f.getContents(), {type: "base64"});
 | 
			
		||||
define(
 | 
			
		||||
  ['N/file', 'xlsx'],
 | 
			
		||||
  function(
 | 
			
		||||
    // highlight-next-line
 | 
			
		||||
    file, // 'N/file'
 | 
			
		||||
    XLSX  // 'xlsx'
 | 
			
		||||
  ) {
 | 
			
		||||
    // ...
 | 
			
		||||
  }
 | 
			
		||||
);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Writing Files
 | 
			
		||||
### Reading Files
 | 
			
		||||
 | 
			
		||||
`N/file` provides [`file.create`](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4223861820.html)
 | 
			
		||||
and `file.load` for creating and loading files respectively.
 | 
			
		||||
There are three steps to reading files:
 | 
			
		||||
 | 
			
		||||
Binary content must be Base64-encoded.  Fortunately, `XLSX.write` with `base64`
 | 
			
		||||
type will generate compatible Base64 strings:
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
`file.load` expects an `id` property, which can be be the internal ID (displayed
 | 
			
		||||
in the File Cabinet web interface) or an absolute or relative path string.
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* 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 functions[^10] can extract data from the
 | 
			
		||||
workbook object.
 | 
			
		||||
 | 
			
		||||
### Writing Files
 | 
			
		||||
 | 
			
		||||
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]
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* write XLSX workbook as Base64 string */
 | 
			
		||||
@ -91,3 +179,18 @@ var newfile = file.create({
 | 
			
		||||
/* save */
 | 
			
		||||
newfile.save();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
[^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.
 | 
			
		||||
@ -115,7 +115,7 @@ This demo was tested in the following deployments:
 | 
			
		||||
 | 
			
		||||
| Architecture | Date       |
 | 
			
		||||
|:-------------|:-----------|
 | 
			
		||||
| `darwin-x64` | 2023-07-05 |
 | 
			
		||||
| `darwin-x64` | 2023-07-19 |
 | 
			
		||||
| `darwin-arm` | 2023-07-05 |
 | 
			
		||||
| `linux-x64`  | 2023-07-05 |
 | 
			
		||||
 | 
			
		||||
@ -129,10 +129,10 @@ cd sheetjs-boa
 | 
			
		||||
cargo run
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
2) Add the `boa` crate from the Git repository:
 | 
			
		||||
2) Add the `boa_engine` crate:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
cargo add --git https://github.com/boa-dev/boa boa_engine
 | 
			
		||||
cargo add boa_engine
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
3) Download the [Standalone build](/docs/getting-started/installation/standalone):
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user