ユーザー・組織情報の取得

にメンテナンス済み

kintone のカスタマイズでは、ログインユーザーの情報を取得して権限判定を行ったり、組織情報を使って動的にフィールドの値を制御したりするケースが多くあります。kintone にはユーザー・組織・グループの情報を取得するための API が複数用意されています。

この記事では、各 API の使い方と実践的な活用パターンを解説します。

ログインユーザーの情報を取得する

JavaScript カスタマイズ内で最もよく使うのが、現在ログインしているユーザーの情報取得です。

kintone.getLoginUser()

最もシンプルな方法です。REST API を使わず、同期的に取得できます。

get-login-user.js
const loginUser = kintone.getLoginUser();

console.log(loginUser);
// {
//   id: "1",
//   code: "user01",
//   name: "田中 太郎",
//   email: "tanaka@example.com",
//   url: "",
//   employeeNumber: "",
//   phone: "",
//   mobilePhone: "",
//   extensionNumber: "",
//   timezone: "Asia/Tokyo",
//   isGuest: false,
//   language: "ja"
// }

取得できるプロパティ

プロパティ説明
idstringユーザー ID
codestringログイン名
namestring表示名
emailstringメールアドレス
timezonestringタイムゾーン
isGuestbooleanゲストユーザーかどうか
languagestring言語設定
チェック

kintone.getLoginUser() はすべてのイベントで使用可能で、非同期処理を必要としません。ユーザー情報に基づく条件分岐に最も適したメソッドです。

ログインユーザーに基づくフィールド制御

login-user-control.js
(() => {
  'use strict';

  /** 管理者のログイン名リスト */
  const ADMIN_USERS = ['admin01', 'admin02', 'manager01'];

  kintone.events.on(['app.record.edit.show', 'app.record.create.show'], (event) => {
    const loginUser = kintone.getLoginUser();
    const isAdmin = ADMIN_USERS.includes(loginUser.code);

    // 管理者のみ「管理メモ」フィールドを表示
    kintone.app.record.setFieldShown('管理メモ', isAdmin);

    // 管理者でない場合は「承認金額」フィールドを入力不可にする
    if (!isAdmin) {
      event.record['承認金額'].disabled = true;
    }

    return event;
  });
})();

ユーザー一覧を取得する

REST API を使って、kintone 環境内のユーザー一覧を取得できます。

kintone 内から利用する場合

get-users.js
/**
 * ユーザー一覧を取得する
 * @param { Object } [params]
 * @param { string[] } [params.codes] - 取得するユーザーのログイン名の配列
 * @param { number } [params.offset] - オフセット
 * @param { number } [params.size] - 取得件数(最大100、デフォルト100)
 * @returns { Promise<{ users: any[] }> }
 */
const getUsers = (params = {}) => {
  const { codes, offset = 0, size = 100 } = params;
  const query = new URLSearchParams();
  query.set('offset', String(offset));
  query.set('size', String(size));

  if (codes) {
    codes.forEach((code) => query.append('codes[]', code));
  }

  const url = `/v1/users.json?${query.toString()}`;

  return kintone.api(url, 'GET', {});
};

// 使用例: 全ユーザーを取得
getUsers().then((response) => {
  console.log('ユーザー一覧:', response.users);
});
チェック

ユーザー一覧 API(/v1/users.json)は、cybozu.com 共通管理者または kintone システム管理者のみ使用できます。一般ユーザーからは実行できない点に注意してください。

全ユーザーを取得する(ページング対応)

ユーザーが 100 人以上の場合は、offset を使ってページング取得する必要があります。

get-all-users.js
/**
 * 全ユーザーを一括取得する
 * @returns { Promise<any[]> }
 */
const getAllUsers = async () => {
  const allUsers = [];
  let offset = 0;
  const size = 100;

  while (true) {
    const response = await kintone.api('/v1/users.json', 'GET', { offset, size });
    allUsers.push(...response.users);

    if (response.users.length < size) {
      break;
    }
    offset += size;
  }

  return allUsers;
};

組織一覧を取得する

get-organizations.js
/**
 * 組織一覧を取得する
 * @param { Object } [params]
 * @param { number } [params.offset] - オフセット
 * @param { number } [params.size] - 取得件数(最大100)
 * @returns { Promise<{ organizations: any[] }> }
 */
const getOrganizations = (params = {}) => {
  const { offset = 0, size = 100 } = params;
  return kintone.api('/v1/organizations.json', 'GET', { offset, size });
};

組織に所属するユーザーを取得する

特定の組織に所属するユーザーの一覧を取得する API です。

get-org-users.js
/**
 * 指定した組織に所属するユーザーを取得する
 * @param { string } organizationCode - 組織コード
 * @param { number } [offset] - オフセット
 * @param { number } [size] - 取得件数
 * @returns { Promise<{ userTitles: any[] }> }
 */
const getOrganizationUsers = (organizationCode, offset = 0, size = 100) => {
  return kintone.api('/v1/organization/users.json', 'GET', {
    code: organizationCode,
    offset,
    size,
  });
};

// 使用例
getOrganizationUsers('sales-dept').then((response) => {
  response.userTitles.forEach((ut) => {
    console.log(`ユーザー: ${ut.user.name}, 役職: ${ut.title?.name || 'なし'}`);
  });
});

ユーザーが所属する組織を取得する

get-user-orgs.js
/**
 * 指定したユーザーが所属する組織を取得する
 * @param { string } userCode - ユーザーのログイン名
 * @returns { Promise<{ organizationTitles: any[] }> }
 */
const getUserOrganizations = (userCode) => {
  return kintone.api('/v1/user/organizations.json', 'GET', { code: userCode });
};

// 使用例: ログインユーザーの所属組織を取得
const loginUser = kintone.getLoginUser();
getUserOrganizations(loginUser.code).then((response) => {
  response.organizationTitles.forEach((ot) => {
    console.log(`組織: ${ot.organization.name}`);
  });
});

グループ一覧を取得する

get-groups.js
/**
 * グループ一覧を取得する
 * @param { Object } [params]
 * @param { number } [params.offset] - オフセット
 * @param { number } [params.size] - 取得件数
 * @returns { Promise<{ groups: any[] }> }
 */
const getGroups = (params = {}) => {
  const { offset = 0, size = 100 } = params;
  return kintone.api('/v1/groups.json', 'GET', { offset, size });
};

実践例: ユーザー選択フィールドの連動制御

ユーザーが所属する組織に基づいて、ユーザー選択フィールドの初期値を自動設定する例です。

auto-assign-user.js
(() => {
  'use strict';

  kintone.events.on('app.record.create.show', async (event) => {
    const loginUser = kintone.getLoginUser();

    // ログインユーザーの情報を「申請者」フィールドに自動設定
    event.record['申請者'].value = [
      {
        code: loginUser.code,
        name: loginUser.name,
      },
    ];

    // ログインユーザーの所属組織を取得して「申請部署」を自動設定
    try {
      const orgResponse = await kintone.api('/v1/user/organizations.json', 'GET', {
        code: loginUser.code,
      });

      if (orgResponse.organizationTitles.length > 0) {
        const primaryOrg = orgResponse.organizationTitles[0].organization;
        event.record['申請部署'].value = primaryOrg.name;
      }
    } catch (error) {
      console.error('組織情報の取得に失敗しました:', error);
    }

    return event;
  });
})();

実践例: 権限に応じたボタン表示制御

ログインユーザーの所属するグループに基づいて、管理機能へのアクセスを制御する例です。

group-based-control.js
(() => {
  'use strict';

  /**
   * ユーザーが指定したグループに所属しているか確認する
   * @param { string } userCode - ユーザーのログイン名
   * @param { string } targetGroupCode - 確認するグループコード
   * @returns { Promise<boolean> }
   */
  const isUserInGroup = async (userCode, targetGroupCode) => {
    const response = await kintone.api('/v1/user/groups.json', 'GET', {
      code: userCode,
    });

    return response.groups.some((group) => group.code === targetGroupCode);
  };

  kintone.events.on('app.record.index.show', async (event) => {
    const loginUser = kintone.getLoginUser();

    // 「管理者グループ」に所属しているか確認
    const isAdmin = await isUserInGroup(loginUser.code, 'admin-group');

    if (isAdmin) {
      const headerSpace = kintone.app.getHeaderMenuSpaceElement();

      const adminButton = document.createElement('button');
      adminButton.textContent = '管理者メニュー';
      adminButton.onclick = () => {
        // 管理者限定の処理
        window.open('/k/admin/', '_blank');
      };

      headerSpace.append(adminButton);
    }

    return event;
  });
})();

API 一覧

APIエンドポイント説明
ユーザー一覧/v1/users.jsonユーザー一覧の取得
組織一覧/v1/organizations.json組織一覧の取得
グループ一覧/v1/groups.jsonグループ一覧の取得
組織のユーザー/v1/organization/users.json組織に所属するユーザーの取得
ユーザーの組織/v1/user/organizations.jsonユーザーが所属する組織の取得
ユーザーのグループ/v1/user/groups.jsonユーザーが所属するグループの取得
チェック

これらの API は cybozu.com の User API(管理系 API)です。kintone の REST API(/k/v1/)とはエンドポイントのパスが異なるため、kintone.api.url は使用せず、直接パスを指定してください。

まとめ

  • kintone.getLoginUser() で現在のログインユーザー情報を同期的に取得できる
  • ユーザー・組織・グループの一覧取得には REST API を使用する
  • ユーザー一覧 API はシステム管理者権限が必要
  • 100 件を超えるデータを取得する場合は offset によるページング処理が必要
  • ログインユーザーの情報を活用して、権限制御やフィールドの初期値設定が実現できる
#kintone #JavaScript #TypeScript