公開日:
(更新日:)
こんにちは。ブックマークレット大好きでお馴染、システム開発グループのよなしろです。
最近ブックマークレットを追加しようとしてまちがってブックマークレットが入ったフォルダをまるっと消してヘコみました…
今回は「kintoneのカスタマイズのJavaScriptをgusuku Customineでのカスタマイズに置き換えする時に、元のJavaScriptをどう読み解けばいいか」というテーマでお話ししたいと思います。
カスタマイズでgusuku Customineを使用することで、属人化を減らし、コーディングが苦手な方でもパパっと便利にカスタマイズしたいのだけど、既存のカスタマイズもgusuku Customineで実装しなおしたい…そういうケースは結構あるかとおもいます。
そういった時にこの記事が参考になれば幸いです。
第0章: 基本的な考え方
gusuku Customineは「条件」と「やること」の組み合わせでカスタマイズを組んでいきます。
そのため、既存のJavaScriptをそのままコピー&ペーストするように移植をすることはできません。また、gusuku Customineですべてのカスタマイズが実装できるわけではありません。
(特に外部連携サービスがある場合や、kintoneの外観を大幅に変更して、パッと見これkintoneなの?みたいな画面をしている場合など)
JavaScriptを読みながら、「これは条件に相当するな」「これはやることに分けられるな」と整理していくのが第一歩です。この記事ではその最初の部分を取り上げます。特に「読み解き方」「変換のポイント」に注目して解説します。
第1章: 条件(kintone.events.onで発火するタイミングの読み方)
JavaScriptのコードを読むときに、まず注目したいのが kintone.events.on() の第一引数です。ここにはイベントIDが入り、これが「いつ処理が動くか」を示しています。つまり、gusuku Customineの「条件」にそのまま対応します。
たとえばこんな記述があれば…
kintone.events.on('app.record.create.show', (event) => {
// 初期値をセット
});
「app.record.create.show」という記述がある場合、「レコード追加画面を表示したとき」に処理が走ります。gusuku Customineでは「条件:追加画面を表示した時」を選びます。
他にも…
kintone.events.on('app.record.edit.submit', (event) => {
// 保存前にチェック
});
「app.record.edit.submit」という記述がある場合、「編集画面で保存直前」に処理が走るので、gusuku Customineでは「条件:レコードを保存する直前(削除時は除く)」を選ぶことになります。
さらに、フィールド変更イベントもよく使います。
kintone.events.on([
'app.record.create.change.name',
'app.record.edit.change.name'
], (event) => {
// 氏名(name)フィールドが変更されたときに発火
console.log('氏名が変更されました:', event.record.name.value);
return event;
});
これは「条件:フィールドの値を編集して値が変わった時」に相当します。gusuku Customineでの典型的な利用シーンは、相関入力やふりがな補完です。
よく使うイベントを整理するとこんな感じです。
JavaScriptの記述 | 発火タイミング | gusuku Customineでの条件 |
---|---|---|
app.record.create.show | 追加画面を表示したとき | 追加画面を表示したとき |
app.record.edit.show | 編集画面を表示したとき | 編集画面を表示したとき |
app.record.detail.show | 詳細画面を表示したとき | 詳細画面を表示したとき |
app.record.index.show | 一覧画面を表示したとき | 一覧画面を表示したとき |
app.record.create.submit | 追加保存の直前 | レコードを保存する直前(削除時は除く) |
app.record.edit.submit | 編集保存の直前 | レコードを保存する直前(削除時は除く) |
app.record.create.submit.success | 追加保存成功後 | レコードを保存した直後(削除後は除く) |
app.record.edit.submit.success | 編集保存成功後 | レコードを保存した直後(削除後は除く) |
app.record.create.change.<フィールド> | 追加画面でフィールド変更時 | フィールドの値を編集して値が変わった時 |
app.record.edit.change.<フィールド> | 編集画面でフィールド変更時 | フィールドの値を編集して値が変わった時 |
第2章: やること(JavaScriptの処理をgusuku Customineのやることに置きかえる)
次に見るのは、イベントハンドラの中身です。ここに書かれた1つひとつの処理を、gusuku Customineの「やること」に置き換えていきます。JavaScriptの処理をどのアクションに変換するかを意識しながら読み解きましょう。
実装上のポイント
1つのイベント内で複数の処理(アクション)を書いている場合、上から順番に実行されます。gusuku Customineでのカスタマイズに置き換えする際は、2つ目以降のアクションの条件を「他のアクションの実行が完了した時」で繋いでください。これにより、非同期処理や画面更新を伴う処理でも、期待どおりの順序で確実に動かせます。
フィールド操作
JavaScriptにこう書いてあったら…
const rec = event.record;
// price(単価)と qty(数量)の値をそのまま使って合計を入れる例
rec.total.value = rec.price.value * rec.qty.value;
return event; // 保存前の補正なのでeventを返す
gusuku Customineのやることは… 「フィールドに値をセットする」。
表示制御
JavaScriptにこう書いてあったら…
kintone.app.record.setFieldShown('detail', false);
gusuku Customineのやることは… 「フィールドやグループを非表示にする」。条件付きで表示/非表示を切り替えたい場合も同じです。
ボタンの設置
JavaScriptにこう書いてあったら…
const btn = document.createElement('button');
btn.textContent = '今日の日付を入れる';
gusuku Customineのやることは… 「ボタンをスペースに配置する」か「ボタンをメニュー位置に配置する」。
条件の「ボタンを押した時」で「フィールドに値をセットする」などの次アクションを連鎖させます。
1) 一覧画面のメニュー位置に設置
kintone.events.on('app.record.index.show', () => {
if (document.getElementById('btn-index-menu')) return; // 二重追加防止
const space = kintone.app.getHeaderMenuSpaceElement(); // 一覧画面のメニュー位置
const btn = document.createElement('button');
btn.id = 'btn-index-menu';
btn.textContent = '一括処理';
btn.addEventListener('click', () => {
// ここで処理を記述
});
space.appendChild(btn);
});
のように「 kintone.app.getHeaderMenuSpaceElement();
」という記述があってボタンを設置してそうだったら「ボタンをメニュー位置に配置する」を使用します。
2) 詳細画面のメニュー位置に設置
kintone.events.on('app.record.detail.show', () => {
if (document.getElementById('btn-detail-menu')) return; // 二重追加防止
const space = kintone.app.record.getHeaderMenuSpaceElement(); // やることは 「ボタンをメニュー位置に配置する」
const btn = document.createElement('button');
btn.id = 'btn-detail-menu';
btn.textContent = '今日の日付を入れる';
btn.addEventListener('click', () => {
// ボタンクリック時に日付フィールドへ今日の日付を入れる
const rec = kintone.app.record.get();
rec.record.date.value = new Date().toISOString().split('T')[0];
kintone.app.record.set(rec);
});
space.appendChild(btn);
});
こちらも「 kintone.app.getHeaderMenuSpaceElement();
」という記述があってボタンを設置しているので「ボタンをメニュー位置に配置する」を使用します。
3) スペースフィールドに設置
フォームにスペース(フィールドコード:actionSpace など)を置いてある場合、その場所にボタンを載せられます。
kintone.events.on(['app.record.create.show', 'app.record.edit.show'], () => {
const spaceEl = kintone.app.record.getSpaceElement('actionSpace');
if (!spaceEl || document.getElementById('btn-in-space')) return; // 二重追加防止
const btn = document.createElement('button');
btn.id = 'btn-in-space';
btn.textContent = '計算する';
btn.addEventListener('click', () => {
// ボタンクリック時に合計を再計算してセット
const r = kintone.app.record.get();
r.record.total.value = r.record.price.value * r.record.qty.value;
kintone.app.record.set(r);
});
spaceEl.appendChild(btn);
});
のように「 kintone.app.record.getSpaceElement('actionSpace')
」がある場合、actionSpaceというスペースフィールドを取得しています。そこにボタンを設置しているのでこの場合は「ボタンをメニュー位置に配置する」を使用します。
入力チェック
JavaScriptにこう書いてあったら…
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(event.record.email.value)) {
event.record.email.error = 'メールアドレス形式が正しくありません';
return event;
}
gusuku Customineのやることは… 「正規表現でエラーチェックを行う」を使用します。
第3章: コードを読んでgusuku Customineでのカスタマイズに変換する実例
最後に、2つの短いサンプルコードを見てみましょう。コメントを入れて、どの部分が「条件」でどの部分が「やること」に対応するかを確認します。
コードのコメントにヒントを書いてあるので、実際のgusuku Customineではどう組むかを考えてみましょう。
1) 詳細画面にボタンを追加して、クリックで日付を入れる
// 条件:詳細画面を表示したとき
kintone.events.on('app.record.detail.show', () => {
if (document.getElementById('fill-today')) return; // 二重追加防止
// やること:「ボタンをメニュー位置に配置する」
const space = kintone.app.record.getHeaderMenuSpaceElement();
const btn = document.createElement('button');
btn.id = 'fill-today';
btn.textContent = '今日の日付を入れる';
// やること:フィールドに値をセットする。条件: 「ボタンを押した時」
btn.addEventListener('click', () => {
const rec = kintone.app.record.get();
rec.record.date.value = new Date().toISOString().split('T')[0];
kintone.app.record.set(rec);
});
space.appendChild(btn);
});
2) フィールド変更で別フィールドを自動補完する
// 条件:「フィールドの値を編集して値が変わった時」
kintone.events.on(['app.record.create.change.name', 'app.record.edit.change.name'], (event) => {
const rec = event.record;
// やること:「大文字を小文字に変換する」
rec.nameKana.value = (rec.name.value ?? '').toLowerCase();
return event; // 保存前の処理なのでeventを返す
});
さいごに
gusuku CustomineでのkintoneのJavaScriptカスタマイズを置き換えするときは、まず イベント=条件、処理=やること の二段階で切り分けて考えることが大切です。この視点を持つだけで、コードの読み解きがぐっと楽になります。
ただし、実際のカスタマイズは複雑な処理が組まれていることも多いですが、一度整理してみるとかなりの部分がgusuku Cusotmineで組むことができることも多いです。
今回の記事ではJavaScriptによるカスタマイズを移植する際のコードの読み方を紹介していきましたが、実際の移植の作業の際には「このkintoneのJavaScriptカスタマイズ、本当に必要?」「kintoneのカスタマイズ、JavaScriptを書くよりgusuku Customineを使ったらもっと便利に・簡単にできるんじゃない?」「kintoneアプリの構成を工夫したほうがもっと使いやすくなるんじゃない?」みたいなことを考えながら移植を行なっています。
弊社ではこのあたりのノウハウを含め、kintoneを活用した業務改善をお手伝いする「キミノマホロ for kintone」を提供しております。

必要なものを、必要なだけ。
業務改善の新しいカタチ。
kintoneを活用した業務改善・システム開発サービス
kintoneを活用した業務改善・システム開発サービス
こちらもご検討いただければ幸いです。
また、kintoneでの業務改善を強力にサポートするツールのgusuku Deploit・gusuku Everysiteもあわせてどうぞ!
投稿者プロフィール

- 沖縄で業務しています。オンプレ生まれ・クラウド育ち。