プラグイン開発入門

にメンテナンス済み

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.jsonicon.png です。ここに設定画面やカスタマイズ用の JS/CSS ファイルを追加していきます。

manifest.json の書き方

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)
desktopPC 画面用の JS / CSS ファイル
mobileモバイル画面用の JS / CSS ファイル
config設定画面用の HTML / JS / CSS ファイル
チェック

desktop.jsconfig.js には、ファイルの読み込み順序があります。配列の先頭から順に読み込まれるため、依存関係がある場合はファイルの順序に注意してください。

設定画面の構築

プラグインの大きな特徴として、設定画面(config)を持てる点があります。設定画面では、管理者がフィールドコードや条件などを GUI で設定できます。

設定画面の HTML

html/config.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() を使用します。

js/config.js
(() => {
  '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 について

kintone.$PLUGIN_ID は、プラグインのカスタマイズ JS ファイル内で自動的に利用できる変数です。プラグイン固有の ID が格納されており、設定の保存・読み込み時に使用します。

setConfigとgetConfig
kintoneのプラグインには、プラグイン単位で設定情報を保持してくれる機能がありますが、javascriptのオブジェクト型の情報を保持することはできません。通常、JSON.parseとstiringifyを活用して保存・復元するんですが

設定画面の CSS

css/config.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 の実装

設定画面で保存された値を使って、アプリ画面でカスタマイズを実行します。

js/desktop.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)が生成されます。このファイルはプラグインの更新に必要なため、大切に保管してください。

パッケージング(2回目以降)
kintone-plugin-packer --ppk my-plugin.ppk my-plugin
秘密鍵(.ppk)ファイルの管理

プラグインの更新には初回パッケージング時に生成された .ppk ファイルが必要です。このファイルを紛失すると、同じプラグイン ID で更新することができなくなります。Git で管理するか、安全な場所にバックアップしてください。

kintone への登録手順

  1. パッケージングで生成された .zip ファイルを用意する
  2. kintone システム管理プラグイン を開く
  3. 「プラグインの読み込み」をクリックし、ZIP ファイルをアップロードする
  4. 対象のアプリの設定画面 → プラグイン を開く
  5. 登録済みプラグインの一覧から追加し、設定画面で必要な値を入力する

プラグイン開発のベストプラクティス

1. 設定値の JSON 化

setConfig / getConfig で扱えるのは文字列の Key-Value のみです。複雑な設定(配列やオブジェクト)を扱う場合は、JSON.stringify / JSON.parse で変換します。

JSON化のパターン
// 保存
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);
setConfigとgetConfig
kintoneのプラグインには、プラグイン単位で設定情報を保持してくれる機能がありますが、javascriptのオブジェクト型の情報を保持することはできません。通常、JSON.parseとstiringifyを活用して保存・復元するんですが

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)ファイルはプラグインの更新に必要なため、紛失しないよう管理する

練習問題

プラグイン開発で、manifest.json に指定する type プロパティの値はどれですか?

プラグインの設定値を保存する際に使用する API はどれですか?

プラグインのパッケージング時に生成される .ppk ファイルを紛失した場合、どうなりますか?

#kintone #JavaScript #plugin