アクセス権の設定表示(スペースのアクセス権取得を追加var)

kintoneをもっと便利にしてくれるブックマークレットの活用

上記の記事を元に、ChatGPTくんと一緒にスペースのアクセス権も表示してくれるようの改良しました。

ただ、どうも長過ぎるようで、ブックマークレットにうまく変換はできず。とりあえずブラウザのコンソールから実行できるものです。

アクセス権の設定表示(スペースのアクセス権取得を追加var)



(async () => {
    'use strict';
    try {
        const appId = kintone.app.getId();

        // 各アクセス権の取得
        const appResponse = await kintone.api(kintone.api.url('/k/v1/app/acl', true), 'GET', { "app": appId });
        const recordResponse = await kintone.api(kintone.api.url('/k/v1/record/acl', true), 'GET', { "app": appId });
        const fieldResponse = await kintone.api(kintone.api.url('/k/v1/field/acl', true), 'GET', { "app": appId });

        // アプリの情報を取得してスペースIDを確認
        const appInfo = await kintone.api(kintone.api.url('/k/v1/app', true), 'GET', { "id": appId });
        const spaceId = appInfo.spaceId;

        let spaceInfo = null;
        let spaceMembersResponse = null;
        if (spaceId) {
            // スペースの情報を取得
            spaceInfo = await kintone.api(kintone.api.url('/k/v1/space', true), 'GET', { "id": spaceId });
            // スペースのメンバー情報を取得
            spaceMembersResponse = await kintone.api(kintone.api.url('/k/v1/space/members', true), 'GET', { "id": spaceId });
        }

        // 結果を格納するためのHTMLコンテンツを構築
        let content = `<title>アクセス権設定</title>
            <body style="font-family: sans-serif; background-color: #f9f9f9; padding: 20px;">
            <h3 id="top" style="color: #333;">アクセス権設定(アプリID:${appId})</h3>
            <a href="#appAcl">アプリのアクセス権</a> | <a href="#recordAcl">レコードのアクセス権</a> | <a href="#fieldAcl">フィールドのアクセス権</a>`;

        if (spaceInfo && spaceMembersResponse) {
            content += ` | <a href="#spaceAcl">スペースのアクセス権</a>`;
        }

        content += `<style>
                body { background-color: #f9f9f9; }
                table { width: 100%; border-collapse: collapse; }
                th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
                th { background-color: #4B4B4B; color: white; }
                tr:nth-child(even){background-color: #f2f2f2;}
                tr:hover {background-color: #ddd;}
                .yes { background-color: rgba(200, 230, 201, 0.6); }
                .no { background-color: rgba(255, 205, 210, 0.6); }
            </style>`;

        // アプリのアクセス権のHTMLテーブルを構築
        content += `<div id="appAcl">${buildAppAclTable('アプリのアクセス権', appResponse.rights)}<a href="#top">TOPへ</a></div>`;
        content += `<div id="recordAcl">${buildRecordAclTable('レコードのアクセス権', recordResponse.rights)}<a href="#top">TOPへ</a></div>`;
        content += `<div id="fieldAcl">${buildFieldAclTable('フィールドのアクセス権', fieldResponse.rights)}<a href="#top">TOPへ</a></div>`;

        // スペースの情報とアクセス権のHTMLテーブルを構築(スペースがある場合)
        if (spaceInfo && spaceMembersResponse) {
            content += `<div id="spaceAcl"><h4>スペース情報(スペースID:${spaceId} スペース名:${spaceInfo.name})</h4>`;
            content += `${buildSpaceAclTable('スペースのアクセス権', spaceMembersResponse.members)}<a href="#top">TOPへ</a></div>`;
        }
        content += '<a href="."> << 前の画面に戻る<a></p></br></body>';
        content += '</body>';

        // 結果を画面に表示
        document.body.innerHTML = content;

    } catch (error) {
        console.error("エラーが発生しました: ", error);
        window.alert('エラーが発生しました: ' + error.message);
    }

    // アプリのアクセス権のテーブルを構築する関数
    function buildAppAclTable(title, rights) {
        let table = `<h4>${title}</h4><table><tr><th>ID</th><th>対象/コード</th><th>レコード閲覧</th><th>レコード追加</th><th>レコード編集</th><th>レコード削除</th><th>アプリ管理</th><th>ファイル読み込み</th><th>ファイル書き出し</th><th>アクセス権の継承</th></tr>`;
        rights.forEach((right, index) => {
            table += `<tr>
                <td>${index + 1}</td>
                <td>${right.entity.type} / ${right.entity.code}</td>
                <td class="${right.recordViewable ? 'yes' : 'no'}">${right.recordViewable ? 'あり' : 'なし'}</td>
                <td class="${right.recordAddable ? 'yes' : 'no'}">${right.recordAddable ? 'あり' : 'なし'}</td>
                <td class="${right.recordEditable ? 'yes' : 'no'}">${right.recordEditable ? 'あり' : 'なし'}</td>
                <td class="${right.recordDeletable ? 'yes' : 'no'}">${right.recordDeletable ? 'あり' : 'なし'}</td>
                <td class="${right.appEditable ? 'yes' : 'no'}">${right.appEditable ? 'あり' : 'なし'}</td>
                <td class="${right.recordImportable ? 'yes' : 'no'}">${right.recordImportable ? 'あり' : 'なし'}</td>
                <td class="${right.recordExportable ? 'yes' : 'no'}">${right.recordExportable ? 'あり' : 'なし'}</td>
                <td>${displayInheritance(right.entity.type, right.includeSubs)}</td>
            </tr>`;
        });
        table += `</table></br>`;
        return table;
    }

    // レコードのアクセス権のテーブルを構築する関数
    function buildRecordAclTable(title, rights) {
        let table = `<h4>${title}</h4><table><tr><th>ID</th><th>条件</th><th>対象/コード</th><th>閲覧</th><th>編集</th><th>削除</th><th>アクセス権の継承</th></tr>`;
        rights.forEach((right, index) => {
            right.entities.forEach((entity, entityIndex) => {
                table += `<tr>
                    <td>${index + 1}.${entityIndex + 1}</td>
                    <td>${right.filterCond || 'なし'}</td>
                    <td>${entity.entity.type} / ${entity.entity.code}</td>
                    <td class="${entity.viewable ? 'yes' : 'no'}">${entity.viewable ? 'あり' : 'なし'}</td>
                    <td class="${entity.editable ? 'yes' : 'no'}">${entity.editable ? 'あり' : 'なし'}</td>
                    <td class="${entity.deletable ? 'yes' : 'no'}">${entity.deletable ? 'あり' : 'なし'}</td>
                    <td>${displayInheritance(entity.entity.type, entity.includeSubs)}</td>
                </tr>`;
            });
        });
        table += `</table></br>`;
        return table;
    }

    // フィールドのアクセス権のテーブルを構築する関数
    function buildFieldAclTable(title, fields) {
        let table = `<h4>${title}</h4><table><tr><th>フィールドコード</th><th>対象/コード</th><th>閲覧</th><th>編集</th><th>アクセス権の継承</th></tr>`;
        fields.forEach(field => {
            field.entities.forEach(entity => {
                table += `<tr>
                    <td>${field.code}</td>
                    <td>${entity.entity.type} / ${entity.entity.code}</td>
                    <td class="${entity.accessibility === 'READ' ? 'yes' : 'no'}">${entity.accessibility === 'READ' ? 'あり' : 'なし'}</td>
                    <td class="${entity.accessibility === 'WRITE' ? 'yes' : 'no'}">${entity.accessibility === 'WRITE' ? 'あり' : 'なし'}</td>
                    <td>${displayInheritance(entity.entity.type, entity.includeSubs)}</td>
                </tr>`;
            });
        });
        table += `</table></br>`;
        return table;
    }

    // アクセス権の継承表示を処理する関数
    function displayInheritance(entityType, includeSubs) {
        if (entityType === 'ORGANIZATION') {
            return includeSubs ? 'あり' : 'なし';
        }
        return '-';
    }
    // スペースのアクセス権のテーブルを構築する関数
    function buildSpaceAclTable(title, members) {
        // メンバーをソート
        members.sort((a, b) => {
            if (a.entity.type !== b.entity.type) {
                return a.entity.type.localeCompare(b.entity.type);
            }
            return (b.isAdmin === true) - (a.isAdmin === true);
        });

        let table = `<h4>${title}</h4><table><tr><th>ユーザー名</th><th>メンバーの種類</th><th>メンバーのコード</th><th>スペース管理者</th><th>アクセス権の継承</th></tr>`;
        members.forEach((member, index) => {
            table += `<tr>
                <td>${member.entity.code}</td>
                <td>${member.entity.type}</td>
                <td>${member.entity.code}</td>
                <td class="${member.isAdmin ? 'yes' : 'no'}">${member.isAdmin ? 'あり' : 'なし'}</td>
                <td class="${member.includeSubs ? 'yes' : 'no'}">${member.includeSubs ? 'あり' : 'なし'}</td>
            </tr>`;
        });
        table += `</table></br>`;
        return table;
    }

})();





この記事が気に入ったらサポートをしてみませんか?