kintone

【Mermaid.js連携】kintoneで「組織図」や「業務フロー」を直接表示する方法。脱・添付ファイルで「変更の履歴」も一目瞭然に

majinalife.com

kintoneでペーパーレスを推進しようとしているとき、よくぶつかる「悩み」があります。それは、「組織図」や「業務フロー図」のような図表をどうやって共有するか、という問題です。

多くの現場では、ExcelやPowerPointできれいな図を作り、それを「添付ファイル」フィールドに保存しているのではないでしょうか?

しかし、運用が長くなると、こんな経験をすることになります。

見る側の手間「ちょっと内容を確認したいだけなのに、いちいちファイルをダウンロードしてExcelを立ち上げるのが億劫」。
管理側の混乱「『組織図_最新.xlsx』と『組織図_20260201.xlsx』、どっちが本当の最新版だっけ?」と、ファイル名での管理に限界が来る。
ファイル名が正しくても「『20260201-01』と『20260201-02』の違いは何?」と差分管理が出来ていない
kintoneシステムの仕様変更履歴は添付ファイルを含めて保持されるため、ディスク使用量のひっ迫に繋がる。一方で過去のファイルも重要なため、履歴を削除はしたくない。

この「添付ファイルを開く数秒の手間」や「どれが最新かわからないストレス」は、ボディブローのように業務効率を落としていきます。

そこで今回は、エンジニアの世界では標準的に使われている描画ライブラリ「Mermaid.js」をkintoneに組み込み、「添付ファイルを使わずに、レコード詳細画面に図解を直接表示させる方法」をご紹介します。

この記事ではカスタマイズサンプルのJavaScriptをMITライセンスで公開していますので、難しいプログラミング知識は不要です。この記事で紹介するコードをコピペするだけで、あなたのkintoneアプリが「視覚的に伝わる」システムへと進化します。

森田ユウゴ
森田ユウゴ

台湾で「面倒解決エンジニア」として活動している森田ユウゴです!

私は台湾在住のソフトウェアエンジニアです。「面倒くさい!」を原動力に、kintoneカスタマイズやChrome拡張機能開発などを通して、日常や業務の課題をテクノロジーで解決することに注力しています。

ご相談はこちらから▼

なぜ組織図は「ファイル」ではなく「テキスト」で管理した方が良いのか

今回ご紹介する「Mermaid.js」は、図をPowerPointやExcelなどの専用ソフトで描くのではなく、「テキスト」を読み込んで描画するという特徴を持っています。

あえて「テキスト」で管理することには、kintone運用において、添付ファイルや画像には絶対に真似できない強力なメリットが2つあるのです。

1. 変更箇所が「kintoneの標準機能」で一目瞭然になる

Excelや画像で図を管理しているときの最大のストレスは、「修正前と修正後で、どこが変わったのかわからない(間違い探し状態)」ことではないでしょうか。

kintoneの標準機能である「変更履歴」も、添付ファイルの変更については「ファイルが差し替わった」ことしか教えてくれません。

kintone標準の変更履歴(添付ファイルの変更)

しかし「テキストデータ」で管理している場合、話は別です。

kintoneの「文字列(複数行)」フィールドの変更履歴機能によって、「誰が」「いつ」「図のどの部分(ノードや矢印)を書き換えたか」が、自動的にハイライト表示されます。

  • Before(ファイル運用): 「組織図が更新されたらしいけど、誰が動いたのかExcelを開いて目視で探すしかない」
  • After(テキスト運用): 「変更履歴をクリックするだけで、概要が分かる」

後ほどご紹介するカスタマイズを適用した場合、変更履歴が下記の画像のように表示することが出来います。

Mermaid記法を利用したkintoneのレコード変更履歴の画像

エンジニアの世界では当たり前の「Diff(差分)管理」の利便性を、kintoneの標準機能だけで実現できるのです。

2. AI時代の「データ資産」になる

もう1つの理由は、昨今のトレンドである生成AI(ChatGPTやkintoneのAI機能など)との相性です。

画像の中に書かれた文字や独自の繋がりをAIに正確に理解させるのは、現時点ではまだコストも高く、精度も不安定です。しかし、テキストデータ(Mermaid記法)であれば、AIはそれを「意味のある構造データ」として読み取ることができます。低性能のモデルでも比較的精度高く処理できるため「API料金の削減」にもつながります。

図をデータとして持っておくことで、将来的には以下のような活用も可能になります。

  • 業務フローのボトルネック分析: 「このフローチャートのテキストを読み取って、承認プロセスが多すぎる箇所を指摘して」とAIに相談する。
  • 自動生成: 「議事録のテキストから、自動的に相関図を生成してレコードに保存する」。

情報を「絵」として死蔵させるのではなく、「データ」として活用可能な状態で保存する。これが、これからのkintone活用の賢い選択ではないでしょうか。

森田ユウゴ
森田ユウゴ

今後、kintone AIがより機能強化されると思うので、AIで処理をしやすいデータとして準備しておくことで活用が広がります!

【導入方法】 コピペで完了!Mermaid.js実装手順

それでは、実際にkintoneアプリにMermaid.jsを組み込んでみましょう。
作業は大きく分けて2ステップ。早ければ10分以内に描画することが出来ると思います。

STEP 1:アプリの準備

まずは、図を表示させたいkintoneアプリに、以下の2つのフィールドを配置してください。

アプリ名: Mermaid連携アプリ

用途入力用フィールド表示用フィールド
フィールドの種類文字列(複数行)スペース
フィールド名(任意)Mermaidコード
フィールドコードmermaid_text
要素IDmermaid_space
用途図解の元となるテキストを入力します。ここに図が描画されます。
詳細画面で見やすい位置に配置してください。
Mermaid用に用意するフィールドの種類

STEP 2:JavaScript / CSSの設定

次に、アプリの「設定」>「JavaScript / CSSでカスタマイズ」を開きます。

1. Mermaid.js本体の読み込み

「URL指定で追加」を選択し、以下のURLを入力します。これにより、Mermaid.js(v11.12.0)が利用可能になります。

https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.12.0/mermaid.min.js

【コラム】URL指定とファイルアップロード、どっちがいいの?

今回紹介した「URL指定」で読み込んでいるサイト(cdnjsなど)は、CDNと呼ばれ、世界中の開発者が利用している便利な仕組みです。URLを貼るだけで最新機能が使えるのがメリットです。

しかし、企業で本格運用する場合には「セキュリティリスク」も考慮する必要があります。 万が一、CDNの配信元が攻撃を受けたりダウンしたりした場合、kintone上の図も表示されなくなるリスクがあります(サプライチェーン攻撃など)。

Mermaid.jsはMITライセンスという、「無料で商用利用OK」「再配布OK」のルールで公開されています。

そのため、上記のURLをブラウザで開いてファイルをダウンロードし、kintoneに「ファイルから読み込み」で直接アップロードすることも可能です。

2. 描画用スクリプトの適用

続いて、今回私が作成したスクリプトサンプルを読み込ませます。
以下のコードをコピーしてテキストエディタ(メモ帳など)に貼り付け、mermaid-view.js という名前で保存し、「ファイルから読み込み」でアップロードしてください。

/**
 * kintone × Mermaid.js Visualization
 * Description: 別アプリからテンプレートを取得し、選択・上書き挿入する
 * License: MIT
 * Copyright (c) 2026 Yugo Morita
 * Author: Yugo Morita
 */

(function() {
    'use strict';

    const CONFIG = {
        FIELD_CODE: 'mermaid_text', // Mermaid記法を記載する文字列複数行フィールド
        SPACE_ID: 'mermaid_space'  // Mermaid図表を表示するスペースID
    };

    /**
     * エラーメッセージをUIに表示する
     */
    const renderError = (container, title, message) => {
        const errorBox = document.createElement('div');
        Object.assign(errorBox.style, {
            color: '#d32f2f',
            backgroundColor: '#ffebee',
            border: '1px solid #ef5350',
            borderRadius: '4px',
            padding: '10px',
            marginTop: '5px',
            fontSize: '14px'
        });

        const titleEl = document.createElement('strong');
        titleEl.textContent = title;
        
        const msgEl = document.createElement('div');
        msgEl.textContent = message;
        msgEl.style.marginTop = '4px';
        msgEl.style.fontSize = '12px';
        msgEl.style.fontFamily = 'monospace';

        errorBox.appendChild(titleEl);
        errorBox.appendChild(msgEl);
        container.appendChild(errorBox);
    };

    /**
     * Mermaid図を描画する
     */
    const renderMermaid = async (text, container) => {
        container.innerHTML = '';

        if (typeof mermaid === 'undefined') {
            renderError(container, 'System Error', 'Mermaid.js library is not loaded.');
            return;
        }

        if (!text) {
            const placeholder = document.createElement('div');
            placeholder.textContent = 'Please enter Mermaid syntax and update.';
            placeholder.style.color = '#999';
            placeholder.style.padding = '20px';
            placeholder.style.textAlign = 'center';
            container.appendChild(placeholder);
            return;
        }

        const mermaidDiv = document.createElement('div');
        mermaidDiv.className = 'mermaid';
        mermaidDiv.textContent = text; // Prevent XSS
        container.appendChild(mermaidDiv);

        try {
            mermaid.initialize({ startOnLoad: false, securityLevel: 'strict' });
            await mermaid.run({ nodes: [mermaidDiv] });
        } catch (error) {
            mermaidDiv.remove();
            renderError(container, 'Mermaid Syntax Error', error.message);
        }
    };

    // 詳細画面イベント
    kintone.events.on('app.record.detail.show', async (event) => {
        const spaceElement = kintone.app.record.getSpaceElement(CONFIG.SPACE_ID);
        if (!spaceElement) return event;

        const text = event.record[CONFIG.FIELD_CODE].value;
        await renderMermaid(text, spaceElement);

        return event;
    });

    // 編集・追加画面イベント
    const editEvents = ['app.record.create.show', 'app.record.edit.show'];
    kintone.events.on(editEvents, (event) => {
        const spaceElement = kintone.app.record.getSpaceElement(CONFIG.SPACE_ID);
        if (!spaceElement) return event;

        spaceElement.innerHTML = '';

        // 更新ボタン作成
        const btn = document.createElement('button');
        btn.textContent = '🔄 Preview Diagram';
        Object.assign(btn.style, {
            marginBottom: '10px',
            padding: '8px 16px',
            backgroundColor: '#3498db',
            color: '#fff',
            border: 'none',
            borderRadius: '4px',
            cursor: 'pointer'
        });

        // 描画エリア作成
        const viewArea = document.createElement('div');
        Object.assign(viewArea.style, {
            minHeight: '100px',
            border: '1px dashed #ccc',
            padding: '10px',
            backgroundColor: '#fff'
        });

        // ボタンクリック時の処理
        btn.onclick = async (e) => {
            e.preventDefault();
            const currentData = kintone.app.record.get();
            const currentText = currentData.record[CONFIG.FIELD_CODE].value;
            await renderMermaid(currentText, viewArea);
        };

        spaceElement.appendChild(btn);
        spaceElement.appendChild(viewArea);

        // 初期値があれば描画
        const initialText = event.record[CONFIG.FIELD_CODE].value;
        if (initialText) {
            renderMermaid(initialText, viewArea);
        }

        return event;
    });

})();

3. アプリの公開

権限等を適切に振って「アプリの公開」を行います。

森田ユウゴ
森田ユウゴ

これだけで準備は完了です!

次のステップでは実際にMermaid記法を書いて、手軽に図表を描画できることを体験してみましょう。

STEP 3:実際にレコードにMermaid記法を書いてみよう

新規にレコードを追加します。アプリ作成時に準備した「文字列(複数行)」のフィールドに対して下記の文字列を入れてみましょう。

graph TD
    A[社長] --> B[部長]
    B --> C[課長]
    C --> D[担当者]
    B --> E[担当者]
Mermaid連携アプリの入力画面のイメージ

「Preview Diagram」というボタンを押すと、レコード編集画面でプレビューが表示されます!

Mermaid連携アプリの入力画面のイメージ2

このように文字列だけで簡単に図表を表示することが出来るのです!

レコードを保存して、レコード詳細画面でも同様に体制図を確認することが出来ます。

Mermaid連携アプリのレコード詳細画面の表示イメージ

【発展編】 「Mermaidを書くのが難しい」を解決するテンプレート機能カスタマイズ

ここまで読んで、勘の鋭い方はこう思ったかもしれません。

あなた
あなた

すごいけど……現場のメンバーにこの「矢印とかカッコ」を書かせるのは無理じゃない?

おっしゃる通りです。

いくらメリットがあっても、エンジニア以外の方に「DXのために今後はMermaid記法で体制図を管理します。」と強要するのは、システム管理者のエゴです。

そこでもう少しだけカスタマイズを頑張って、「誰でもクリックだけで入力できるテンプレート機能」も追加してみましょう。

仕組み:別アプリから「ひな形」を持ってくる

毎回ゼロから書くのではなく、「テンプレート管理アプリ」にあらかじめ「組織図のパターン」や「フローチャートのパターン」を登録しておきます。

ユーザーはそれをプルダウンで選択するだけで、コードが自動入力される仕組みです。

実装手順

テンプレート管理用のアプリを用意して、もとにアプリから参照できるようにします。

テンプレート管理アプリの作成

まず、テンプレートを保存しておくためのアプリを新規作成します。

アプリ名: Mermaidテンプレート管理

用途並び替えフィールド名称フィールドMermaid記述
フィールド
フィールドの種類数値文字列1行文字列複数行
フィールド名(任意)並び順テンプレート名Mermaidのコード
フィールドコードsort_notemplate_nametemplate_code
用途アプリでドロップダウン選択時、順番(優先度)を指定します。テンプレート名を管理するフィールドです。ここに実際のMermaid記法を記載します。
Mermaidテンプレート管理用のアプリ構成

レコードとして「体制図」を用意して、先ほどのマーメイドを複数行フィールドに登録しておきましょう。

アプリIDの確認

作成したテンプレートアプリの「アプリID」を控えておいてください(URLの k/ の後ろにある数字です)。

入力支援プルダウンボタンの表示位置

入力を支援するドロップダウンを表示するための「select_mermaid」というスペースを新たに追加します。

Mermaid入力補助ボタン用のスペース追加

入力支援スクリプトの適用

以下のコードをコピーし、描画したいアプリ(組織図を表示する側のアプリ)に「mermaid_template.js」をアプリごとの「設定」>「JavaScript / CSSでカスタマイズ」に適用します。
※コード内の TEMPLATE_APP_ID の部分を、先ほど控えたアプリIDに書き換えるのを忘れないでください。

/**
 * kintone × Mermaid.js Dynamic Input Helper
 * Description: 別アプリからテンプレートを取得し、選択・上書き挿入する
 * License: MIT
 * Copyright (c) 2026 Yugo Morita
 * Author: Yugo Morita
 */

(function() {
    'use strict';

    // ★ここに環境固有の設定を入力してください
    const CONFIG = {
        // 現在のアプリ(入力側)の設定
        TARGET_FIELD_CODE: 'mermaid_text', // 挿入先のフィールドコード
        SPACE_ID: 'select_mermaid',        // UIを表示するスペースID

        // テンプレート管理アプリ(データソース側)の設定
        TEMPLATE_APP_ID: xxx,              // ★テンプレートアプリのIDをここに記述
        TEMPLATE_LABEL_FIELD: 'template_name', // テンプレート名のフィールドコード
        TEMPLATE_CODE_FIELD: 'template_code',  // Mermaidコードのフィールドコード
        TEMPLATE_SORT_FIELD: 'sort_no'         // 並び順のフィールドコード(なければ空文字でOK)
    };

    /**
     * テンプレートアプリからデータを取得する関数
     */
    const fetchTemplates = async () => {
        const body = {
            app: CONFIG.TEMPLATE_APP_ID,
            query: `${CONFIG.TEMPLATE_SORT_FIELD ? 'order by ' + CONFIG.TEMPLATE_SORT_FIELD + ' asc' : ''} limit 500`
        };

        try {
            const resp = await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body);
            return resp.records.map(record => ({
                label: record[CONFIG.TEMPLATE_LABEL_FIELD].value,
                code: record[CONFIG.TEMPLATE_CODE_FIELD].value
            }));
        } catch (error) {
            console.error('Templates Fetch Error:', error);
            return [];
        }
    };

    const events = ['app.record.create.show', 'app.record.edit.show'];

    kintone.events.on(events, async (event) => {
        const spaceElement = kintone.app.record.getSpaceElement(CONFIG.SPACE_ID);
        if (!spaceElement) return event;

        // UI初期化(ローディング状態)
        spaceElement.innerHTML = '';
        spaceElement.style.padding = '10px';
        spaceElement.style.backgroundColor = '#f5f5f5';
        spaceElement.style.border = '1px solid #e3e7e8';
        spaceElement.style.display = 'flex';
        spaceElement.style.alignItems = 'center';
        spaceElement.style.gap = '10px';
        spaceElement.style.marginBottom = '10px';

        const label = document.createElement('span');
        label.textContent = 'テンプレート読込中...';
        label.style.fontSize = '12px';
        label.style.color = '#666';
        spaceElement.appendChild(label);

        // APIからデータを取得
        const templates = await fetchTemplates();

        // 取得失敗またはデータなしの場合
        if (templates.length === 0) {
            label.textContent = 'テンプレートが見つかりません (AppID確認)';
            label.style.color = 'red';
            return;
        }

        // UI再構築(取得完了後)
        spaceElement.innerHTML = ''; // ローディング表示を消去

        // ラベル
        const titleLabel = document.createElement('span');
        titleLabel.textContent = 'テンプレート選択: ';
        titleLabel.style.fontWeight = 'bold';
        titleLabel.style.color = '#333';

        // セレクトボックス
        const select = document.createElement('select');
        select.style.padding = '8px';
        select.style.borderRadius = '4px';
        select.style.border = '1px solid #ccc';
        select.style.cursor = 'pointer';
        select.style.maxWidth = '300px';

        // デフォルト選択肢
        const defaultOption = document.createElement('option');
        defaultOption.textContent = '--- 選択してください ---';
        defaultOption.value = '';
        select.appendChild(defaultOption);

        // 取得したテンプレートをOption化
        templates.forEach((tmpl, index) => {
            const option = document.createElement('option');
            option.value = index; // インデックスをValueにする
            option.textContent = tmpl.label;
            select.appendChild(option);
        });

        // 挿入ボタン
        const btn = document.createElement('button');
        btn.textContent = '新規作成 (上書き)';
        Object.assign(btn.style, {
            padding: '8px 16px',
            backgroundColor: '#009688',
            color: '#fff',
            border: 'none',
            borderRadius: '4px',
            cursor: 'pointer',
            fontWeight: 'bold'
        });

        // ホバー設定
        btn.onmouseover = () => btn.style.opacity = '0.8';
        btn.onmouseout = () => btn.style.opacity = '1.0';

        // ボタンクリック処理
        btn.onclick = (e) => {
            e.preventDefault();

            const selectedIndex = select.value;
            if (selectedIndex === '') {
                alert('テンプレートを選択してください');
                return;
            }

            const selectedTemplate = templates[selectedIndex];

            // 上書き確認
            const currentRecord = kintone.app.record.get();
            if (currentRecord.record[CONFIG.TARGET_FIELD_CODE].value) {
                if (!confirm(`テンプレート「${selectedTemplate.label}」で現在の内容を上書きしますか?`)) {
                    return;
                }
            }

            // 値をセット
            currentRecord.record[CONFIG.TARGET_FIELD_CODE].value = selectedTemplate.code;
            kintone.app.record.set(currentRecord);
        };

        // DOM追加
        spaceElement.appendChild(titleLabel);
        spaceElement.appendChild(select);
        spaceElement.appendChild(btn);

        return event;
    });

})();

Mermaidを参照先アプリから入力する

ここまで設定出来たら後は簡単です。

Mermaid入力アプリでレコード追加画面、もしくは編集画面を開きます。

プルダウン選択画面

上記のようにアプリに追加したレコードがテンプレートとして表示されます。「新規作成(上書き)」ボタンを押すだけで、テンプレートを自動入力することが出来ます。

【実践編】 Mermaidで何が描けるのか?

テンプレート機能の実装、お疲れ様でした。 ここからは、「実際にどんな図を描けば業務が改善に繋がりそうか?」という具体例をご紹介します。

Mermaid.jsはこの記事で書ききれないほどの、描画表現が用意されています。

森田ユウゴ
森田ユウゴ

「kintoneで業務改善」に役立ちそうなものを5つ厳選いたしました!

1. 業務フローチャート(手順の標準化)

kintoneでアプリを作ったものの、「誰が・いつ・何を判断して」次のステータスに進めるのか、口頭ルールになっていませんか? フローチャートをレコードに貼っておくことで、マニュアルを開く手間をなくし、属人化を防げます。

用途例

稟議申請フロー、トラブル対応手順、入社手続きフロー

graph TD
    Start((開始)) --> Step1[一次対応]
    Step1 --> Decision{解決した?}
    Decision -- Yes --> Step2[完了報告]
    Decision -- No --> Step3[エスカレーション]
    Step3 --> Step2
    Step2 --> Stop((終了))
Mermaid記法を用いた「フローチャート」の例

2. ステートマシン図(プロセス管理の可視化)

kintoneの「プロセス管理」機能は強力ですが、設定画面を見ないと全体像が把握しづらいのが難点です。(アプリ管理者しか見れない)
「どのステータスから、どこへ戻せるのか(差し戻しルート)」を可視化しておくと、設計ミスや運用時の迷いがなくなります。

用途例

複雑な承認ルートの可視化、在庫ステータスの遷移図

stateDiagram-v2
    [*] --> 未処理
    未処理 --> 処理中 : 着手
    処理中 --> 承認待ち : 申請
    承認待ち --> 完了 : 承認
    承認待ち --> 差戻し : 却下
    差戻し --> 処理中 : 再開
    完了 --> [*]
Mermaid記法を用いた「ステートマシン図」の例

3. ガントチャート(スケジュールの見える化)

通常、kintoneでガントチャートを表示するにはプラグインが必要です。
しかし、「簡易的な予定表」で良ければ、Mermaidを使うだけで無料で実装できます。プロジェクト管理アプリのレコードにこれを表示させておけば、進捗が一目瞭然です。

用途例

プロジェクト進行表、イベント開催スケジュール

gantt
    title プロジェクト進行表
    dateFormat  YYYY-MM-DD
    section 企画
    要件定義       :done,    des1, 2024-04-01, 2024-04-05
    section 開発
    実装           :active,  dev1, 2024-04-06, 5d
    テスト         :         dev2, after dev1, 5d
    section リリース
    本番公開       :crit,    rel1, 2024-04-20, 1d
Mermaid記法を用いた「ガントチャート」の例

4. マインドマップ(情報の構造化)

会議の議事録や、アイデア出しの結果を箇条書きのまま保存していませんか? マインドマップ形式で保存することで、情報の「親子関係」や「グルーピング」が視覚的に伝わりやすくなります。

用途例

部署の目標設定、課題の洗い出し、顧客ヒアリング内容の整理

mindmap
  root((kintone活用))
    全部署共通
      ポータル整備
      全社掲示板
    営業部
      案件管理
      日報
      ::icon(fa fa-money)
    開発部
      タスク管理
      仕様書共有
      ::icon(fa fa-code)
Mermaid記法を用いた「マインドマップ」の例

5. カスタマージャーニー(顧客体験の地図)

顧客管理アプリ(CRM)において、「顧客がどのような体験を経て購入に至ったか」を記録するのに最適です。
テキストだけでは伝わりにくい「感情の動き」や「接点」を時系列で表現できます。

用途例

マーケティング分析、失注要因の分析

journey
    title ユーザーの商品購入体験
    section 認知
      広告を見る: 5: ユーザー
      クリックする: 3: ユーザー
    section 検討
      LPを見る: 5: ユーザー
      他社と比較: 2: ユーザー
    section 購入
      カートに入れる: 4: ユーザー, kintone
      決済完了: 5: ユーザー, kintone
Mermaid記法を用いた「カスタマージャーニー」の例

まだまだMermaid.jsの魅力を紹介、見た目を変える

例えば先ほど紹介したkintone活用のマインドマップですが、正直「2000年代のWordのオブジェクトか?」と私は思ってしまいました。

しかし、Mermaid.jsは見た目(スタイル)を調整する機能があります。

mermaidのmindmapのスタイルを変更した例

複雑になりますが、下記のように記述するとkintoneの配色にあった整理されたマインドマップに調整することが出来るのです。

%%{
  init: {
    'theme': 'base',
    'themeVariables': {
      'primaryColor': '#FFD24C',
      'edgeLabelBackground':'#fff',
      'fontFamily': 'Meiryo'
    }
  }
}%%
graph LR
    %% クラス定義(色の設定)
    classDef main fill:#FFD24C,stroke:#fff,stroke-width:4px,color:#333,font-weight:bold,font-size:16px;
    classDef common fill:#7CE7D8,stroke:none,color:#333,rx:5,ry:5;
    classDef sales fill:#F4A6D7,stroke:none,color:#333,rx:5,ry:5;
    classDef dev fill:#92A6E8,stroke:none,color:#333,rx:5,ry:5;

    %% ノードと構造の定義
    Root((kintone活用)):::main
    
    %% 第2階層
    Root --- Common[全部署共通]:::common
    Root --- Sales[営業部]:::sales
    Root --- Dev[開発部]:::dev

    %% 第3階層(全部署共通)
    Common --- C1(ポータル整備):::common
    Common --- C2(全社掲示板):::common

    %% 第3階層(営業部)
    Sales --- S1(案件管理):::sales
    Sales --- S2(日報):::sales
    Sales --- S3(fa:fa-money):::sales

    %% 第3階層(開発部)
    Dev --- D1(タスク管理):::dev
    Dev --- D2(仕様書共有):::dev
    Dev --- D3(fa:fa-code):::dev

    %% 線のスタイル(曲線を滑らかにする)
    linkStyle default interpolate basis stroke:#ccc,stroke-width:2px;

エンジニアがこれを発展させるなら「AI連携」

ここまで、手入力やテンプレートを使って図を描画する方法をご紹介しました。
しかし、ここからがエンジニアとしての私の腕の見せ所です。

今回の記事で最も伝えたかったことは、「図解をテキストデータとして扱うことの重要性」です。
データとして扱えるということは、「AI(LLM)に読み書きさせることができる」ということを意味します。

もし私がこのシステムをさらに発展させて、本格的な業務システムとして構築するなら、バックエンドでOpenAI API等を連携させ、以下のような自動化を実現します。

1. 文章を入力して自動でMermaid記法に変換する

先ほどまで使用していたアプリを発展させ、AIに指示を送ったら自動で入力フィールドにMermaid記法を反映することが可能です。

「一番上にXX統括部部長がいて、その下に○○さんという部長(PM)がいます。その配下にPLの△△さん、その下に外注のB株式会社の担当者が付きます。PMと並列して営業担当がいます。統括部長と並列で顧客の担当者がいます…」

適当な文章ですが、これを生成AIに投げると下記のようになりました。現実、このくらいの雑な指示を変換してくれるのがAIです。

graph TD
    %% 組織構造
    Client(顧客担当者) --- GeneralManager(XX統括部部長)
    
    GeneralManager --> PM(部長/PM:○○さん)
    GeneralManager --> Sales(営業担当)

    PM --> PL(PL:△△さん)
    PL --> Partner(B株式会社 担当者)
マーメイド記法をAIに作成を依頼したサンプル

他にも見た目を調整するなど生成AIなら自由自在です。

2. 議事録からの「業務フロー」自動生成

会議の議事録(テキスト)をkintoneに保存した瞬間、WebhookでAIが起動。
「誰が何をするか」というアクションアイテムを解析し、Mermaidのフローチャート記法に変換してレコードに自動登録します。

人間は「会議のメモを取るだけ」。あとはAIが勝手に可視化してくれる未来です。

3. 複雑なアプリ構成の「ER図」自動ドキュメント化

kintoneアプリが増えてくると、「どのルックアップがどこに繋がっているか」がブラックボックス化しがちです。kintoneのAPI定義書をAIに読み込ませ、アプリ間のリレーションシップ(ER図)をMermaidで自動生成するバッチ処理を構築します。

これにより、「常に最新のシステム設計図」が自動でメンテナンスされ、属人化を完全に排除できます。

4. プロセス管理履歴からの「ボトルネック分析」

レコードの変更履歴やステータス更新ログをAIに分析させます。
「承認プロセスで一番時間がかかっている箇所」を特定し、色付けされたヒートマップ付きのフローチャート(Mermaid)として出力します。
単なるお絵描きではなく、「経営判断のためのデータビジュアライゼーション」へと昇華させます。

まとめ:情報を「ファイル」から「データ」へ解き放とう

長くなりましたが、今回ご紹介したカスタマイズは、単なる「便利ツール」の導入ではありません。
組織における情報の持ち方を変えるための第一歩です。

  • Before: Excelの中に閉じ込められ、検索もできず、誰も最新版を知らない「死んだ情報」。
  • After: kintoneのレコードの一部として検索でき、バージョン管理され、AIも理解できる「生きた情報」。

まずはコピペで動く範囲から試してみてください。
「たった数行のコード」が、あなたのチームのコミュニケーションを劇的に変えるはずです。

導入サポート・カスタマイズのご相談

本記事で紹介したコードはMITライセンスで公開しており、どなたでも無料で利用・改変いただけます。

しかし、下記のようなニーズもあると思います。

あなた
あなた

自社の業務に合わせてテンプレートを作り込んでほしい

あなた
あなた

最後に紹介しているAI連携まで実装してほしい

あなた
あなた

そもそもkintoneのアプリ設計から相談したい

もし、技術的な導入サポートや、業務フロー全体の改善に関するご相談が必要な場合は、個別のサポートサービスも提供しております。

森田ユウゴ
森田ユウゴ

台湾を拠点に、kintone × 生成AIを活用した「現場が楽になるシステム」を提案・実装しています!

2026年1月に取得したkintone認定カスタマイズスペシャリストと、2025年12月に取得したアプリデザインスペシャリストの知見を活かし、あなたの業務可視化やDXに協力させてください。

ABOUT ME
森田ユウゴ(Yugo Morita)
森田ユウゴ(Yugo Morita)
面倒解決エンジニア
専門学校卒業後、新卒で大手ITベンダーに入社して約10年勤務、フルタイムで働きながら通信制大学を卒業。その後1年XR/メタバース関連企業で挑戦後、現在は台湾のIT企業でプリセールスエンジニア(產品專員)として勤務。kintone認定 アプリデザインスペシャリスト(2025), kintone認定 カスタマイズスペシャリスト(2026)を保持し、kintone開発に携わっています。プロダクトの価値を伸ばすカスタマイズの提案と実装が得意領域。AnkiカスタマイズやChromeアドオン開発にも熱中しています。尽きない好奇心とインフラ経験、AIであなたの「不便」を解決へ導きます。
記事URLをコピーしました