Best Of
Re: 2026.1 Update: Issue with Simultaneous Logins for 2FA Roles (Admin & Custom)
Hi, i would guess that the user have multiple roles, and that (least) one of the roles does not have 2FA required(?). As I understand all roles connected to a user has to have 2fa enabled on the role, if not, multi session will not work.
BG Ørjan Myhr, Teqva.
Re: Transaction Name is no longer a link in saved searches after 2026.1?
Hello Michael,
The transaction name column "links" have returned within our 2026.1 Release Preview account as well.
So it seems that NetSuite has pushed out a solution, likely part of the Minor Release Schedule dated = 4.16.26.
The Minor Release Schedule SA 103478.
https://suiteanswers.custhelp.com/app/answers/detail/a_id/103478/kw/e-Fix%20Release%20Notification
Thank you for the update.
Todd Niedringhaus
Re: Formulas that work fine in a custom item field, but fail as a saved search column.
Hi @Tom Dalton
In a Custom Item Field, NetSuite already knows the expected output type (because you defined the field as Free-Form Text, Integer, Decimal, etc.).
In a Saved Search, you must manually select the correct Formula type from the Results column dropdown. If your formula outputs text but you select Formula (Numeric), or if it outputs a number but you select Formula (Date), NetSuite will throw an Invalid Expression error.
Formulas that work fine in a custom item field, but fail as a saved search column.
I have a few formulas that work fine as a custom item fields. When I use them in a saved item search, I get ERROR: Invalid Expression. what makes them work in one instance and not the other?
NetSuite Admin Tip | Avoiding setSublistValue Errors in Suitelets
When building a Suitelet using the NetSuite SuiteScript 2.x API, you may encounter this common error: “Missing a required argument: options.value”.
This usually means that at least one setSublistValue() call is receiving an undefined or null value.
Even if you believe your data exists, this error can still happen when:
- A search column returns no value.
- There is a column name mismatch.
- The field is empty in some records.
- The value type is not compatible.
The setSublistValue() method requires a valid value. Passing:
- undefined
- null
- An incompatible type
will immediately trigger an error.
This is especially common when pulling data from:
- search.create()
- result.getValue()
Because it will return null when a field is empty.
Sample Usage
The sample script below logs values before setting them and only sets a value if it has been safely converted to a string, helping avoid the error entirely.
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
*/
define(['N/search', 'N/ui/serverWidget', 'N/log'], function(search, serverWidget, log) {
/**
* Converts null/undefined to empty string for Suitelet sublists.
* @param {any} val
* @returns {string}
*/
function safeValue(val) {
return (val !== undefined && val !== null) ? String(val) : '';
}
/**
* Main Suitelet entry point
*/
function onRequest(context) {
// Create a Suitelet form to display customer data
var form = serverWidget.createForm({ title: 'Customer List' });
// Add a list-type sublist to the form to represent the customer table
var sublist = form.addSublist({
id: 'custpage_customersublist',
type: serverWidget.SublistType.LIST,
label: 'Customers'
});
// Define display columns for the sublist
sublist.addField({
id: 'custpage_entityid',
label: 'Entity ID',
type: serverWidget.FieldType.TEXT
});
sublist.addField({
id: 'custpage_email',
label: 'Email',
type: serverWidget.FieldType.TEXT
});
sublist.addField({
id: 'custpage_phone',
label: 'Phone',
type: serverWidget.FieldType.TEXT
});
// Create a Customer search with the desired columns
var customerSearch = search.create({
type: search.Type.CUSTOMER,
columns: [
search.createColumn({ name: 'entityid' }),
search.createColumn({ name: 'email' }),
search.createColumn({ name: 'phone' })
]
});
// Get the first 10 search results
var results = customerSearch.run().getRange({ start: 0, end: 10 }) || [];
// Loop through each result and safely set sublist values
results.forEach(function(result, i) {
// Always sanitize the value to an empty string if null/undefined
var entityid = safeValue(result.getValue({ name: 'entityid' }));
var email = safeValue(result.getValue({ name: 'email' }));
var phone = safeValue(result.getValue({ name: 'phone' }));
// Log the actual values used for this line
log.debug('Row ' + i, 'entityid: "' + entityid + '", email: "' + email + '", phone: "' + phone + '"');
// Defensive coding: wrap every setSublistValue in try/catch in case a failure occurs
try {
sublist.setSublistValue({
id: 'custpage_entityid',
line: i,
value: entityid
});
} catch (e) {
log.error('Unable to set entityid at line ' + i, e.message);
}
try {
sublist.setSublistValue({
id: 'custpage_email',
line: i,
value: email
});
} catch (e) {
log.error('Unable to set email at line ' + i, e.message);
}
try {
sublist.setSublistValue({
id: 'custpage_phone',
line: i,
value: phone
});
} catch (e) {
log.error('Unable to set phone at line ' + i, e.message);
}
});
// Render the form with the populated sublist
context.response.writePage(form);
}
// Expose the Suitelet function
return { onRequest: onRequest };
});
The sample code described herein is provided on an "as is" basis, without warranty of any kind, to the fullest extent permitted by law. Oracle + NetSuite Inc. does not warrant or guarantee the individual success developers may have in implementing the sample code on their development platforms or in using their own Web server configurations.
Oracle + NetSuite Inc. does not warrant, guarantee or make any representations regarding the use, results of use, accuracy, timeliness or completeness of any data or information relating to the sample code. Oracle + NetSuite Inc. disclaims all warranties, express or implied, and in particular, disclaims all warranties of merchantability, fitness for a particular purpose, and warranties related to the code, or any service or software related thereto.
Oracle + NetSuite Inc. shall not be liable for any direct, indirect or consequential damages or costs of any type arising out of any action taken by you or others related to the sample code.
To know more about deploying SuiteScript, check these New to NetSuite Articles.
- New To NetSuite | How to set a Script Type in SuiteScript 2.x Record?
- New To NetSuite | How to create a Script Record?
- New To NetSuite | How to Deploy a Script Record
Do you have another way on how to automate your transactions using SuiteScript? Feel free to share them here!
Re: Netsuite Bill Capture not populating the expense line Amounts
Thanks—we’ve submitted a ticket with NetSuite Support. In the meantime, I wanted to check with the community to see if anyone else has encountered a similar issue.
Re: Native NetSuite Automated Cash Application
Thank you for the feedback. This is very helpful!
Re: Do future periods have to be opened to set up amortization schedules?
Hi @Divya Unnikrishnan , thanks very much for this. Much appreciated.
Re: Approvals using Employee Centre
Thanks @Judith Culanding-Oracle that certainly was a consideration but this error then changed to Permission Violation: You need a higher level of the 'Transactions -> Purchase Order' permission to access this page. Please contact your account administrator.
This was due to the fact that the approvers are members of a static employee group which also had to be update.






