結論(先に)
-
NetSuite標準UIだけだと Excelっぽさは足りない
-
予算入力・修正・再提出まで、意外と現実的
ただし、
ロール制約と操作責任は要注意。
これは「便利だから誰でも触れる」にすると危険なやつ。
なぜ「貼り付け」じゃなく「表を出す」のか
貼り付け方式も便利だけど、現場からよく出るのはこれ。
-
「今どの月がいくらか見ながら直したい」
-
「全体を見て微調整したい」
-
「Excel開かずにNetSuiteだけで終わらせたい」
要は👇
Excelを作る場所を、NetSuiteに移したい
今回やりたかった完成形
画面イメージとしては、こんな感じ。
4月 5月 6月
広告費 100000 120000 90000
交通費 30000 28000 35000
通信費 20000 20000 20000
-
セルに直接入力できる
-
Tab / Enter で移動
-
数値だけ受け付ける
-
保存ボタン一発
👉 ほぼExcel
技術的な全体構成
使ったもの
-
Suitelet(UIの土台)
-
HTML + JavaScript
-
スプレッドシート系JSライブラリ
(Handsontable / Tabulator / SlickGrid など) -
NetSuiteサーバスクリプト(保存処理)
※ 今回は Handsontable想定で話す。
Step1:Suiteletで「空の器」を出す
Suiteletは、
-
serverWidget でフォームを作り
-
HTMLフィールドに自由なUIを埋め込む
これが肝。
var html = form.addField({
id: 'custpage_sheet',
type: serverWidget.FieldType.INLINEHTML,
label: '予算入力'
});
👉 ここにスプレッドシートを突っ込む。
Step2:スプレッドシートUIを描画する
HTML側でやることはシンプル。
-
行:勘定科目
-
列:月
-
データ:初期値 or 空
<div id="budgetSheet"></div>
<script>
var data = [
['広告費', 100000, 120000, 90000],
['交通費', 30000, 28000, 35000]
];
new Handsontable(document.getElementById('budgetSheet'), {
data: data,
rowHeaders: true,
colHeaders: ['勘定', '4月', '5月', '6月'],
licenseKey: 'non-commercial-and-evaluation'
});
</script>
この時点で👇
「え、これNetSuite?」
ってなる。
Step3:入力値を取得して保存する
保存ボタンの挙動
-
JSで現在のシート内容を取得
-
JSONに変換
-
hiddenフィールドに詰める
-
Suitelet POSTで送信
var sheetData = hot.getData();
document.getElementById('data').value = JSON.stringify(sheetData);
Step4:サーバ側で予算データに展開
サーバでは、
-
JSONをパース
-
行 × 列でループ
-
月・勘定・金額を分解
-
カスタム予算レコードを作成/更新
👉 Excel1シート = 予算テーブル
Step5:予実対比にそのまま使う
-
実績:通常トランザクション
-
予算:今回のカスタムレコード
-
保存検索でJOIN
-
差額・達成率を計算
入力も参照も、全部NetSuite内で完結。
ここが良かった
特に、
「あ、やっぱこの月もう1万円足そう」
が迷いなくできるのが強い。
⚠ 実運用での注意点(超重要)
① ロール制御は絶対
このUI、
-
普通の入力画面より自由
-
=事故の破壊力も大きい
👉 予算専用ロール必須
② 同時編集は考慮しないと危険
-
複数人同時に開くと
-
最後に保存した人が勝つ
👉 排他制御 or 運用ルールが必要。
③ 標準UIじゃない=監査説明が必要
-
なぜこの画面があるか
-
誰が使うか
-
修正履歴はどう残すか
「便利だから作った」では通らない場面がある。
まとめ
Excel文化を壊さず、
でもデータはちゃんとNetSuiteに残す。
その折衷案として、かなりアリな実験だった。