こんにちは、ジョイゾーでkintoneプラグインの開発エンジニアをやっている小林です。
今回は、アプリの追加プラグイン一覧取得APIを利用して何かできないかな、にチャレンジしてみます。
アプリに追加されているプラグインの一覧を取得する
kintoneでは業務に関係するいくつかのアプリをスペースにまとめて運用し、業務システムの管理者はそのスペースを管理するという図式はそれなりにあると思います。ここではスペースポータルに所属するアプリのプラグイン利用状況を掲示する、とかしてみたいと思います。管理者以外のユーザがポータルで毎度見たい、かというツッコミはさておき。
弊社では初回開発無料の定額39万円でkintoneアプリを開発する定額型開発サービス「システム39」を提供しております。kintoneの導入やアプリ開発でお困りの方は、お気軽にご相談ください。
*Webでの打ち合わせも可能です。
まずはAPIの説明から
GETのみなので非常にシンプルです。
アプリの追加プラグイン一覧を取得する
その名の通り、アプリに追加されたプラグインの一覧を取得することができるAPIです。複数アプリへの対応はないので、1アプリずつの対応になります。

こんな感じのJSプログラムを書いてみると、、
kintone.api(kintone.api.url('/k/v1/app/plugins.json', true), "GET", { app: APP_ID }).then(resp => console.log(resp)).catch(err => console.error(err));
このようなレスポンスが返ってきました!

スペース掲示用のプラグイン利用状況アプリを作る
スペース内各アプリの利用状況をレコードとして持つ「アプリプラグイン利用状況アプリ」を作ります。フォーム構成はシンプルな感じでこちら

さてこのアプリに以下のカスタマイズを入れておきます。
AIで簡単クッキングできてしまうこの時代。痺れますねぇ
- 一覧画面に「アプリプラグイン利用状況取得」ボタンを配置
- 「アプリプラグイン利用状況取得」ボタンを押下した際は
アプリプラグイン利用状況アプリが所属するスペースのIDを用いて、スペース内に存在するすべてのアプリ一覧をkintone api(/k/v1/space.json)で取得 - 取得されたアプリ毎にkintone api(/k/v1/app/plugins.json)で利用プラグイン情報を取得。取得した情報をアプリの当てはまるフィールドに埋めてレコード登録。キーはアプリIDとし、既に存在する場合UPSERTで
(function () { "use strict"; const APP_ID = kintone.app.getId(); const SPACE_ID = '79'; // ここは環境に合わせて const APP_RECORD_API = '/k/v1/record.json'; const PLUGIN_API = '/k/v1/app/plugins.json'; const SPACE_API = '/k/v1/space.json'; const FIELD_CODES = { appId: 'app_id', appName: 'app_name', pluginList: 'plugin_list' }; function createButton(label, id) { const button = document.createElement('button'); button.id = id; button.innerText = label; button.className = 'kintoneplugin-button-normal'; return button; } async function fetchAppsInSpace(spaceId) { const params = { id: spaceId, includeApps: true }; const resp = await kintone.api(SPACE_API, 'GET', params); return resp.attachedApps; } async function fetchPluginList(appId) { try { const resp = await kintone.api(PLUGIN_API, 'GET', { app: appId }); return resp.plugins.map(p => p.name).join(', '); } catch (e) { console.warn(`アプリID: ${appId} のプラグイン取得失敗`, e); return ''; } } async function upsertRecord(appData) { const query = `${FIELD_CODES.appId} = "${appData[FIELD_CODES.appId].value}"`; const searchResp = await kintone.api('/k/v1/records.json', 'GET', { app: APP_ID, query: query, fields: ['$id'] }); if (searchResp.records.length > 0) { // レコード更新 const recordId = searchResp.records[0].$id.value; await kintone.api('/k/v1/record.json', 'PUT', { app: APP_ID, id: recordId, record: appData }); } else { // レコード追加 await kintone.api(APP_RECORD_API, 'POST', { app: APP_ID, record: appData }); } } async function fetchAndSaveAllPluginData() { const spaceId = SPACE_ID; if (!spaceId) { alert('スペースIDがURLから取得できませんでした。'); return; } const apps = await fetchAppsInSpace(spaceId); for (const app of apps) { const pluginList = await fetchPluginList(app.appId); const record = { [FIELD_CODES.appId]: { value: app.appId.toString() }, [FIELD_CODES.appName]: { value: app.name }, [FIELD_CODES.pluginList]: { value: pluginList } }; await upsertRecord(record); } alert('当該スペース内アプリのプラグイン情報を取得・保存しました。'); } kintone.events.on('app.record.index.show', function (event) { if (document.getElementById('fetch-plugin-info-button')) return; const header = kintone.app.getHeaderMenuSpaceElement(); const button = createButton('アプリプラグイン利用状況取得', 'fetch-plugin-info-button'); button.onclick = fetchAndSaveAllPluginData; header.appendChild(button); return event; }); })();
設定完了。プラグイン利用状況を抽出
では「アプリプラグイン利用状況取得」ボタンをポチッとな。

スペースポータルにアプリ配置
ここまで来たら業務スペースのポータルにアプリを配置するだけ。


できました!
最新状況を更新したい場合、アプリまで行ってボタンで再抽出がシステムとしてネックですが、細かいことは気にしない;
おわりに
なかなか利用シチュエーションに悩むAPIではありますが、どうだったでしょうか?
定期的なプラグインの棚卸しや、利用状況の把握に役立てる、、かもしれないですよね!
※ APIの詳細が知りたい方は公式APIドキュメント developer network をご確認ください。
弊社では初回開発無料の定額39万円でkintoneアプリを開発する定額型開発サービス「システム39」を提供しております。kintoneの導入やアプリ開発でお困りの方は、お気軽にご相談ください。
*Webでの打ち合わせも可能です。