If you have a User Event Script that is giving you an error like this:
{
"type":"error.SuiteScriptError",
"name":"SCRIPT_OF_API_VERSION_2X_MUST_IMPLEMENT_A_SCRIPT_TYPE_INTERFACE",
"message":"SuiteScript 2.1 entry point scripts must implement one script type function.",
"id":"",
"stack":["Error\n at Object.beforeLoad (/SuiteScripts/XXX/your_usereventscript_file.js:YY:ZZ)"],
"cause":
{
"type":"internal error",
"code":"SCRIPT_OF_API_VERSION_2X_MUST_IMPLEMENT_A_SCRIPT_TYPE_INTERFACE",
"details":"SuiteScript 2.1 entry point scripts must implement one script type function.",
"userEvent":null,
"stackTrace":["Error\n at Object.beforeLoad (/SuiteScripts/XXX/your_usereventscript_file.js:YY:ZZ)"],
"notifyOff":false
},
"notifyOff":false,
"userFacing":true
}
There are several things you can check to find out what’s causing the real problem:
- If you’re pointing to a Client Script, where the User Event Script is loading up a button on the form check that the header area of your Client Script doesn’t specify
@NApiVersion 2.1(note the.1), it needs to read@NApiVersion 2.x(or@NApiVersion 2.0).
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
*/
// etc
- Another thing to check if your User Event Script is pointing to a Client Script is to check the path if you’re using the
context.form.clientScriptModulePathapproach.
// ...
context.form.clientScriptModulePath = "./my_cs_script.js";
// ...
If you’re using the relative path it needs to be relative to the location of the User Event Script file it is being referenced from.
You don’t necessarily need to append the .js extension to the file, but I do it out of a good habit.
- Don’t forget the other obvious check if you’re using TypeScript and compiling that to Javascript: ensure you’re using
exporton yourbeforeSubmit,afterSubmitand/orbeforeLoadfunctions in your Typescript code.
Confirm the required entry point
The exported function must match the script type declared by @NScriptType:
| Script type | At least one typical entry point |
|---|---|
| User Event | beforeLoad, beforeSubmit or afterSubmit |
| Suitelet | onRequest |
| Scheduled Script | execute |
| RESTlet | get, post, put or delete |
| Client Script | pageInit or another supported client entry point |
| Map/Reduce | getInputData, map, reduce or summarize as required by the design |
For an AMD-style JavaScript file, return the entry-point object:
define([], () => {
const beforeLoad = (context) => {
// Add form changes here.
};
return { beforeLoad };
});
For a TypeScript SuiteCloud project, make sure the compiled JavaScript still exposes the function expected by the deployment. Inspect the generated file rather than assuming the source-level export was emitted in the required format.
Also confirm that the deployed script record points to the newly compiled file. An older file with the correct name but no exported entry point produces the same message.