NETSUITE / SUITESCRIPT
既存コードを読むときに知っておきたい
SuiteScriptモジュール10選
SuiteScriptには、
NetSuite独自のモジュールがたくさんあります。
最初から全部覚える必要はありません。
でも、
よく出てくるものをいくつか知っているだけで、
既存コードを見たときの入り口は
かなり作りやすくなります。
FIRST STEP
まず、読み込んでいるモジュールを見る。
SuiteScriptの既存コードを見ると、 最初の方でモジュールを読み込んでいることがあります。
define([
'N/record',
'N/search',
'N/log'
], function (
record,
search,
log
) {
// 処理
});
ここを見るだけでも、 そのスクリプトが何をしようとしているのか ある程度想像できます。
N/recordならレコード操作。 N/searchなら検索。 N/logならログ出力。
最初はそれくらいの理解でも十分でした。
01 / N/RECORD
レコードを作る、読む、更新する。
NetSuiteのレコードを操作するときに よく出てくるモジュールです。
var customerRecord = record.create({
type: record.Type.CUSTOMER
});
customerRecord.setValue({
fieldId: 'companyname',
value: 'サンプル株式会社'
});
var recordId = customerRecord.save();
log.debug({
title: 'customerId',
details: recordId
});
新規作成だけでなく、
load() で既存レコードを読み込んだり、
値を変更して保存したりします。
既存コードで N/record が出てきたら、
まず「どのレコードを触っているのか」を見ると
処理が追いやすくなります。
02 / N/LOG
分からないときは、
まずログを見る。
処理の途中で値を確認したり、 エラー内容を残したりするときに使います。
log.debug({
title: '処理開始',
details: '顧客レコードを確認します'
});
log.error({
title: 'ERROR',
details: 'レコードの更新に失敗しました'
});
コードだけ見ても分からないときに、 実際にどこまで処理が進んでいるのか。
値が想定どおり入っているのか。
そういう確認にログはかなり使いました。
03 / N/SEARCH
必要なレコードを探す。
NetSuite内のレコードを 条件付きで検索するときに使います。
var customerSearch = search.create({
type: search.Type.CUSTOMER,
filters: [
['companyname', 'is', 'サンプル株式会社']
],
columns: [
'internalid',
'companyname'
]
});
var results = customerSearch.run().getRange({
start: 0,
end: 10
});
filters を見ると検索条件、
columns を見ると
何を取得しようとしているのかが分かります。
保存検索をSuiteScript側から呼び出して、 その結果を処理することもあります。
var savedSearch = search.load({
id: 'customsearch_customer_list'
});
savedSearch.run().each(function(result) {
var internalId = result.getValue({
name: 'internalid'
});
log.debug({
title: 'internalId',
details: internalId
});
return true;
});
検索結果を画面側へ一覧表示するような処理では、
次の N/ui/serverWidget と
一緒に見ることもありました。
04 / N/UI/SERVERWIDGET
Suiteletの画面を作る。
Suiteletでフォームや入力欄、 サブリストなどを作るときに使います。
var form = serverWidget.createForm({
title: '顧客検索'
});
form.addField({
id: 'custpage_keyword',
type: serverWidget.FieldType.TEXT,
label: '検索条件'
});
var sublist = form.addSublist({
id: 'custpage_result',
type: serverWidget.SublistType.LIST,
label: '検索結果'
});
form.addSubmitButton({
label: '検索'
});
context.response.writePage(form);
N/search で取得した結果を
サブリストへ表示するような処理でも使えます。
自分の中では、 「NetSuiteのデータを取る処理」と 「その結果を画面に見せる処理」が ここでつながった印象があります。
05 / N/EMAIL
スクリプトからメールを送る。
通知や処理結果などを メールで送信するときに使います。
email.send({
author: runtime.getCurrentUser().id,
recipients: 'recipient@example.com',
subject: '処理結果',
body: '処理が完了しました。'
});
バッチ処理の完了通知や、 エラー発生時の連絡など、 業務処理の最後で出てくることがあります。
06 / N/HTTPS
NetSuiteから外部へ通信する。
NetSuite側から 外部APIへリクエストを送るときに使います。
var response = https.post({
url: 'https://api.example.com/data',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
id: 123
})
});
log.debug({
title: 'response',
details: response.body
});
URL、Header、Body、Responseを見ていくと、 外部システムと何をやり取りしているのか 追いやすくなります。
APIそのもののテストや、 Postman・APIDOGを使った確認については、 APIカテゴリ側で詳しく扱う予定です。
07 / N/RUNTIME
今どんな状態で動いているのかを見る。
実行中のスクリプトや、 現在のユーザー、 スクリプトパラメータなどを取得できます。
var currentScript = runtime.getCurrentScript();
var fileId = currentScript.getParameter({
name: 'custscript_file_id'
});
log.debug({
title: 'fileId',
details: fileId
});
「この値はどこから来ているんだろう」 と思って追っていくと、 スクリプトパラメータから取得していた、 ということもあります。
実行環境を確認するときの とっかかりになるモジュールです。
08 / N/FILE
ファイルを作る、読む、保存する。
NetSuite内で CSVやテキストファイルなどを扱うときに使います。
var csvFile = file.create({
name: 'sample.csv',
fileType: file.Type.CSV,
contents:
'id,name\n' +
'1,Sample'
});
csvFile.folder = 123;
var fileId = csvFile.save();
CSV連携やSFTP連携の処理では、
N/file でファイルを作ってから
次の処理へ渡すような流れもあります。
09 / N/TASK
別の処理を起動する。
Scheduled Scriptや Map/Reduce Scriptなどを 別の処理から実行するときに使います。
var mapReduceTask = task.create({
taskType: task.TaskType.MAP_REDUCE
});
mapReduceTask.scriptId =
'customscript_sample_mr';
mapReduceTask.deploymentId =
'customdeploy_sample_mr';
var taskId = mapReduceTask.submit();
コードを追っていて、 「ここで処理が終わったように見える」 というときでも、 実は別のスクリプトを起動していることがあります。
処理がどこへ続いているのかを見るときに 知っておくと便利でした。
10 / N/SFTP
外部とファイルをやり取りする。
SFTPサーバーへ接続して、 外部システムとファイルを やり取りするときに使います。
var connection = sftp.createConnection({
username: 'user',
url: 'sftp.example.com',
directory: '/upload',
hostKey: '...'
});
connection.upload({
filename: 'sample.csv',
file: csvFile,
replaceExisting: true
});
このあたりは、 コードだけ見ても 実際の動きが分かりづらいところでした。
自分はコマンドからSFTPへ接続して、 実際にファイルを置きながら その後の挙動を確認していました。
「ファイルをどこへ置くのか」 「置いたあと何が動くのか」 を実際に確認すると、 コードの意味もかなり追いやすくなります。
SUMMARY
モジュール名が分かるだけでも、
コードの見え方は変わる。
SuiteScriptのモジュールを 全部暗記する必要はありません。
N/recordならレコード操作。 N/searchなら検索。
N/ui/serverWidgetなら画面。 N/fileやN/sftpならファイル連携。
N/httpsなら外部との通信。 N/logなら処理確認。
そのくらい分かるだけでも、 初めて見るコードの とっかかりになります。
まず使われているモジュールを見る。
そこから実際の処理を追っていく。
自分はこの見方をするようになってから、 SuiteScriptの既存コードが かなり追いやすくなりました。