NETSUITE / SUITESCRIPT

既存コードを読むときに知っておきたい
SuiteScriptモジュール10選

SuiteScriptには、 NetSuite独自のモジュールがたくさんあります。

最初から全部覚える必要はありません。

でも、 よく出てくるものをいくつか知っているだけで、 既存コードを見たときの入り口は かなり作りやすくなります。

FIRST STEP

まず、読み込んでいるモジュールを見る。

SuiteScriptの既存コードを見ると、 最初の方でモジュールを読み込んでいることがあります。

CODE SuiteScript
define([
    'N/record',
    'N/search',
    'N/log'
], function (
    record,
    search,
    log
) {

    // 処理

});

ここを見るだけでも、 そのスクリプトが何をしようとしているのか ある程度想像できます。

N/recordならレコード操作。 N/searchなら検索。 N/logならログ出力。

最初はそれくらいの理解でも十分でした。

01 / N/RECORD

レコードを作る、読む、更新する。

NetSuiteのレコードを操作するときに よく出てくるモジュールです。

CODE N/record
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

分からないときは、
まずログを見る。

処理の途中で値を確認したり、 エラー内容を残したりするときに使います。

CODE N/log
log.debug({
    title: '処理開始',
    details: '顧客レコードを確認します'
});

log.error({
    title: 'ERROR',
    details: 'レコードの更新に失敗しました'
});

コードだけ見ても分からないときに、 実際にどこまで処理が進んでいるのか。

値が想定どおり入っているのか。

そういう確認にログはかなり使いました。

03 / N/SEARCH

必要なレコードを探す。

NetSuite内のレコードを 条件付きで検索するときに使います。

CODE N/search
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側から呼び出して、 その結果を処理することもあります。

CODE Saved Search
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でフォームや入力欄、 サブリストなどを作るときに使います。

CODE N/ui/serverWidget
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

スクリプトからメールを送る。

通知や処理結果などを メールで送信するときに使います。

CODE N/email
email.send({
    author: runtime.getCurrentUser().id,
    recipients: 'recipient@example.com',
    subject: '処理結果',
    body: '処理が完了しました。'
});

バッチ処理の完了通知や、 エラー発生時の連絡など、 業務処理の最後で出てくることがあります。

06 / N/HTTPS

NetSuiteから外部へ通信する。

NetSuite側から 外部APIへリクエストを送るときに使います。

CODE N/https
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

今どんな状態で動いているのかを見る。

実行中のスクリプトや、 現在のユーザー、 スクリプトパラメータなどを取得できます。

CODE 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やテキストファイルなどを扱うときに使います。

CODE N/file
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などを 別の処理から実行するときに使います。

CODE N/task
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サーバーへ接続して、 外部システムとファイルを やり取りするときに使います。

CODE N/sftp
var connection = sftp.createConnection({

    username: 'user',

    url: 'sftp.example.com',

    directory: '/upload',

    hostKey: '...'

});

connection.upload({

    filename: 'sample.csv',

    file: csvFile,

    replaceExisting: true

});

このあたりは、 コードだけ見ても 実際の動きが分かりづらいところでした。

自分はコマンドからSFTPへ接続して、 実際にファイルを置きながら その後の挙動を確認していました。

「ファイルをどこへ置くのか」 「置いたあと何が動くのか」 を実際に確認すると、 コードの意味もかなり追いやすくなります。

SFTP連携を実際に確認した話 →

SUMMARY

モジュール名が分かるだけでも、
コードの見え方は変わる。

SuiteScriptのモジュールを 全部暗記する必要はありません。

N/recordならレコード操作。 N/searchなら検索。

N/ui/serverWidgetなら画面。 N/fileやN/sftpならファイル連携。

N/httpsなら外部との通信。 N/logなら処理確認。

そのくらい分かるだけでも、 初めて見るコードの とっかかりになります。

まず使われているモジュールを見る。
そこから実際の処理を追っていく。

自分はこの見方をするようになってから、 SuiteScriptの既存コードが かなり追いやすくなりました。