こんにちは。Oracle NetSuiteパートナー EvangSolの湯浅です。
前回から引き続き、弊社エンジニアが直面した、ユーザーイベントスクリプト(User Event Script:以下UE)からUEが呼び出せない事象についてご紹介したいと思います。
今回はより具体的な対応策についてご紹介いたします。
対応策1. スケジュールドスクリプトを使う(最も王道!)
UE内でスケジュールドスクリプト(Scheduled Script)を起動し、実際の処理は後段のスケジュールドスクリプト側で行うという方法です。イベント時の処理と重たいロジックを分離することで、パフォーマンスや保守性が向上します。
手順例:
- UE(afterSubmitなど)内でスケジュールドスクリプトをキック
- スケジュールドスクリプトでレコード更新やロジックを実行
コード例:
**〇ユーザーイベントスクリプト(UEがスケジュールドスクリプトに処理依頼する)**
define(['N/task'], function(task) {
function afterSubmit(context) {
if (context.type === context.UserEventType.CREATE) {
var scheduledTask = task.create({
taskType: task.TaskType.SCHEDULED_SCRIPT,
scriptId: 'customscript_your_sched_script',
deploymentId: 'customdeploy_your_sched_deploy',
params: { custscript_record_id: context.newRecord.id }
});
scheduledTask.submit();
log.debug('依頼完了!', 'スケジュールドスクリプトがキューに入りました!');
}
}
return { afterSubmit: afterSubmit };
});
〇スケジュールドスクリプト(UEから呼び出されて処理を行う)
define(['N/record'], function(record) {
function execute(context) {
var recordId = context.scriptParameters.custscript_record_id;
var rec = record.load({ type: 'customrecord_your_type', id: recordId });
rec.setValue({ fieldId: 'custrecord_status', value: 'Processed' });
rec.save();
log.debug('処理完了!', '対象レコードの処理が完了しました!');
}
return { execute: execute };
});
これなら、イベント発生時にスムーズにスクリプトが実行されます。
対応策2. RESTletを活用する(即時性が必要ならコレ!)
リアルタイムに近い形で処理したい場合はRESTletスクリプトを利用し、API経由で次の処理を呼び出す方法が有効です。
手順例:
- RESTletスクリプトを作成し、データ更新や計算ロジックを実装
- UE内でREST APIを呼び出して、RESTlet側に処理を委譲
コード例:
**〇RESTletスクリプト**
define(['N/record'], function(record) {
function post(data) {
var rec = record.load({ type: data.recordType, id: data.recordId });
rec.setValue({ fieldId: 'custrecord_status', value: 'Processed' });
rec.save();
return { success: true, message: 'データ処理成功!' };
}
return { post: post };
});
〇ユーザーイベントスクリプト
define(['N/https'], function(https) {
function afterSubmit(context) {
https.post.promise({
url: 'https://your_account.restlets.api.netsuite.com/...restlet_endpoint',
body: JSON.stringify({
recordType: 'customrecord_your_type',
recordId: context.newRecord.id
}),
headers: { 'Content-Type': 'application/json' }
})
.then(function(response) {
log.debug('成功!', response.body);
})
.catch(function(error) {
log.error('エラー', error);
});
}
return { afterSubmit: afterSubmit };
});
これなら、ほぼリアルタイムに次の処理を実行できます!
いかがだったでしょうか。今回はNetSuiteのUEからUEを呼び出せない事象の対応策の前半部分をご紹介させていただきました。次回は、対応策の後半部分とまとめについてご紹介させていただきます。ぜひ次回もご覧ください。