プラグイン開発入門
kintone プラグインは、JavaScript カスタマイズを再利用可能な形でパッケージング したものです。通常の JavaScript カスタマイズとは異なり、アプリごとにコードを書き直す必要がなく、設定画面を通じて管理者が GUI で設定を変更できるという大きなメリットがあります。
しかし、プラグイン開発には独自のディレクトリ構成やマニフェストファイルの仕組みがあり、初めて取り組む場合はその構造の理解が重要です。
この記事では、プラグインの基本構造からパッケージングまで、入門者向けにステップバイステップで解説します。
プラグインと JavaScript カスタマイズの違い
| 項目 | JavaScript カスタマイズ | プラグイン |
|---|---|---|
| 設定対象 | アプリ単位 | アプリ単位(複数アプリに適用可能) |
| 設定の変更 | ファイルの書き換え | 設定画面(GUI)から変更可能 |
| 配布 | ファイルのコピー | ZIP ファイルで一括配布 |
| コードの秘匿性 | ソースコードが閲覧可能 | 暗号化されてソースが見えない |
| 再利用性 | 低い(アプリごとに調整が必要) | 高い(設定画面で柔軟に対応) |
プラグインは「設定画面を持つ再利用可能なカスタマイズ」です。特定のアプリでしか使わない一度きりのカスタマイズであれば、通常の JavaScript カスタマイズで十分です。
プラグインのディレクトリ構成
kintone プラグインは、以下のディレクトリ構成で開発します。
my-plugin/
├── manifest.json # プラグインの定義ファイル(必須)
├── icon.png # プラグインアイコン(必須)
├── css/
│ ├── config.css # 設定画面のCSS
│ └── desktop.css # PC画面のCSS
├── js/
│ ├── config.js # 設定画面のJavaScript
│ ├── desktop.js # PC画面のJavaScript
│ └── mobile.js # モバイル画面のJavaScript
├── html/
│ └── config.html # 設定画面のHTML
└── image/
└── icon.png # プラグインアイコン
プラグインに最低限必要なのは manifest.json と icon.png です。ここに設定画面やカスタマイズ用の
JS/CSS ファイルを追加していきます。
manifest.json の書き方
manifest.json はプラグインの定義ファイルです。プラグインの名前、バージョン、使用するファイルなどを記述します。
{
"manifest_version": 1,
"version": "1.0.0",
"type": "APP",
"name": {
"ja": "サンプルプラグイン",
"en": "Sample Plugin"
},
"description": {
"ja": "プラグイン開発の基本を学ぶためのサンプルです。",
"en": "A sample plugin to learn the basics of plugin development."
},
"icon": "image/icon.png",
"homepage_url": {
"ja": "https://example.com",
"en": "https://example.com"
},
"desktop": {
"js": ["js/desktop.js"],
"css": ["css/desktop.css"]
},
"mobile": {
"js": ["js/mobile.js"]
},
"config": {
"html": "html/config.html",
"js": ["js/config.js"],
"css": ["css/config.css"],
"required_params": ["fieldCode"]
}
}
主要なプロパティ
| プロパティ | 必須 | 説明 |
|---|---|---|
manifest_version | ✅ | マニフェストのバージョン(1 を指定) |
version | ✅ | プラグインのバージョン(セマンティックバージョニング推奨) |
type | ✅ | "APP"(アプリ用プラグイン) |
name | ✅ | プラグイン名(多言語対応可) |
description | ✅ | プラグインの説明(多言語対応可) |
icon | ✅ | プラグインアイコンのパス(PNG / 推奨サイズ 128×128) |
desktop | PC 画面用の JS / CSS ファイル | |
mobile | モバイル画面用の JS / CSS ファイル | |
config | 設定画面用の HTML / JS / CSS ファイル |
desktop.js と config.js
には、ファイルの読み込み順序があります。配列の先頭から順に読み込まれるため、依存関係がある場合はファイルの順序に注意してください。
設定画面の構築
プラグインの大きな特徴として、設定画面(config)を持てる点があります。設定画面では、管理者がフィールドコードや条件などを GUI で設定できます。
設定画面の HTML
<section class="plugin-config">
<h2 class="plugin-config-title">プラグインの設定</h2>
<div class="plugin-config-field">
<label for="fieldCode">対象フィールドコード:</label>
<input type="text" id="fieldCode" class="plugin-config-input" placeholder="例: 金額" />
</div>
<div class="plugin-config-field">
<label for="threshold">しきい値:</label>
<input type="number" id="threshold" class="plugin-config-input" placeholder="例: 10000" />
</div>
<div class="plugin-config-field">
<label for="message">エラーメッセージ:</label>
<input type="text" id="message" class="plugin-config-input" placeholder="例: 金額がしきい値を超えています" />
</div>
<button id="save-button" class="plugin-config-button">保存</button>
<button id="cancel-button" class="plugin-config-button plugin-config-button--cancel">キャンセル</button>
</section>
設定画面の JavaScript
設定の保存と読み込みには、kintone.plugin.app.setConfig() と kintone.plugin.app.getConfig() を使用します。
(() => {
'use strict';
// プラグインIDを取得(自動的に設定される変数)
const PLUGIN_ID = kintone.$PLUGIN_ID;
// 既存の設定を読み込む
const config = kintone.plugin.app.getConfig(PLUGIN_ID);
// フォームに既存の値をセット
if (config.fieldCode) {
document.getElementById('fieldCode').value = config.fieldCode;
}
if (config.threshold) {
document.getElementById('threshold').value = config.threshold;
}
if (config.message) {
document.getElementById('message').value = config.message;
}
// 保存ボタンのクリックイベント
document.getElementById('save-button').addEventListener('click', () => {
const newConfig = {
fieldCode: document.getElementById('fieldCode').value,
threshold: document.getElementById('threshold').value,
message: document.getElementById('message').value,
};
// バリデーション
if (!newConfig.fieldCode) {
alert('対象フィールドコードを入力してください。');
return;
}
// 設定を保存(保存後、自動的にプラグイン一覧画面に戻る)
kintone.plugin.app.setConfig(newConfig);
});
// キャンセルボタンのクリックイベント
document.getElementById('cancel-button').addEventListener('click', () => {
history.back();
});
})();
kintone.$PLUGIN_ID は、プラグインのカスタマイズ JS
ファイル内で自動的に利用できる変数です。プラグイン固有の ID
が格納されており、設定の保存・読み込み時に使用します。
設定画面の CSS
.plugin-config {
max-width: 600px;
margin: 24px;
font-family: 'メイリオ', 'Meiryo', sans-serif;
}
.plugin-config-title {
font-size: 20px;
margin-bottom: 20px;
padding-bottom: 12px;
border-bottom: 2px solid #3498db;
}
.plugin-config-field {
margin-bottom: 16px;
}
.plugin-config-field label {
display: block;
margin-bottom: 4px;
font-weight: bold;
font-size: 14px;
}
.plugin-config-input {
width: 100%;
padding: 8px 12px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 14px;
box-sizing: border-box;
}
.plugin-config-button {
padding: 10px 24px;
font-size: 14px;
border: none;
border-radius: 4px;
cursor: pointer;
margin-right: 8px;
background: #3498db;
color: white;
}
.plugin-config-button:hover {
opacity: 0.8;
}
.plugin-config-button--cancel {
background: #95a5a6;
}
カスタマイズ JS の実装
設定画面で保存された値を使って、アプリ画面でカスタマイズを実行します。
(() => {
'use strict';
const PLUGIN_ID = kintone.$PLUGIN_ID;
// プラグインの設定を読み込む
const config = kintone.plugin.app.getConfig(PLUGIN_ID);
if (!config.fieldCode) {
return;
}
const events = ['app.record.create.submit', 'app.record.edit.submit'];
kintone.events.on(events, (event) => {
const record = event.record;
const fieldCode = config.fieldCode;
const threshold = Number(config.threshold) || 0;
const message = config.message || `${fieldCode} がしきい値を超えています`;
// しきい値チェック
const value = Number(record[fieldCode].value) || 0;
if (value > threshold) {
record[fieldCode].error = message;
}
return event;
});
})();
パッケージングと配布
プラグインの開発が完了したら、ZIP ファイルにパッケージングして kintone に登録します。
@kintone/plugin-packer を使用する(推奨)
公式ツール @kintone/plugin-packer を使うことで、プラグインのパッケージングと署名を一括で行えます。
npm install -g @kintone/plugin-packer
kintone-plugin-packer my-plugin
初回実行時に秘密鍵ファイル(.ppk)が生成されます。このファイルはプラグインの更新に必要なため、大切に保管してください。
kintone-plugin-packer --ppk my-plugin.ppk my-plugin
プラグインの更新には初回パッケージング時に生成された .ppk
ファイルが必要です。このファイルを紛失すると、同じプラグイン ID
で更新することができなくなります。Git で管理するか、安全な場所にバックアップしてください。
kintone への登録手順
- パッケージングで生成された
.zipファイルを用意する - kintone システム管理 → プラグイン を開く
- 「プラグインの読み込み」をクリックし、ZIP ファイルをアップロードする
- 対象のアプリの設定画面 → プラグイン を開く
- 登録済みプラグインの一覧から追加し、設定画面で必要な値を入力する
プラグイン開発のベストプラクティス
1. 設定値の JSON 化
setConfig / getConfig で扱えるのは文字列の Key-Value のみです。複雑な設定(配列やオブジェクト)を扱う場合は、JSON.stringify / JSON.parse で変換します。
// 保存
const config = {
settings: JSON.stringify({
fields: ['金額', '数量'],
conditions: [
{ field: '金額', operator: '>', value: 10000 },
],
}),
};
kintone.plugin.app.setConfig(config);
// 読み込み
const savedConfig = kintone.plugin.app.getConfig(PLUGIN_ID);
const settings = JSON.parse(savedConfig.settings);
2. エラーハンドリング
設定が未完了のまま適用された場合に、エラーが発生しないようガードしましょう。
const config = kintone.plugin.app.getConfig(PLUGIN_ID);
// 設定が空の場合は何もしない
if (!config.fieldCode) {
console.warn('プラグインの設定が完了していません');
return;
}
3. デバッグ
プラグインのデバッグでは、ブラウザの開発者ツール(DevTools)を活用します。
- Console タブ:
console.logで値の確認 - Network タブ: API リクエストの確認
- Sources タブ: ブレークポイントの設置(プラグインソースは暗号化されているため、通常の JS カスタマイズよりデバッグしにくい点に注意)
開発中は通常の JavaScript カスタマイズとしてコードを書いて動作確認し、完成後にプラグインとしてパッケージングする方法が効率的です。
まとめ
- プラグインは JavaScript カスタマイズを 再利用可能な形でパッケージング したもの
manifest.jsonでプラグインの構成(名前、バージョン、使用ファイル)を定義する- 設定画面は
config.html+config.jsで構築し、setConfig/getConfigで設定値を保存・読み込みする kintone.$PLUGIN_IDでプラグイン固有の ID を取得できる- パッケージングには公式ツール
@kintone/plugin-packerを使用する - 秘密鍵(
.ppk)ファイルはプラグインの更新に必要なため、紛失しないよう管理する