アンチパターンから学ぶ ユーザーの組織情報とアイコンの取得

目次

はじめに

kintoneのカスタマイズでは、ログインユーザーの所属組織に応じて表示を切り替えたり、ユーザーのプロフィールアイコンを画面上に表示することがあります。
こうしたユーザー情報の取得には、一見動作しているように見えても、リスクを抱える実装パターンが存在します。

この記事では、ユーザー情報の取得について、以下の2つを解説します。

  • アンチパターンとそのリスク
    たとえば、複数のREST APIを呼び出してユーザー情報を取得する方法には、リクエスト数の増加やAPI利用制限への影響といった課題があります。
    また、kintone内部のURLパターンに依存してアイコンを表示する方法は、アップデートによって動作しなくなるリスクを伴います。
  • 推奨される実装方法とその利点
    ユーザー情報取得のJavaScript APIを使用することで、REST APIリクエストなしで必要な情報を取得できます。
    また、アイコンURLの取得にも専用のJavaScript APIが用意されており、内部のURLパターンに依存しないカスタマイズができます。

アンチパターンと推奨される実装方法を、サンプルコードを交えて比較しながら紹介します。
既存のカスタマイズのリスク確認や、新たに実装する際の参考にしてください。

今回紹介するAPI

API 概要
kintone.user.getOrganizations() ユーザーの所属組織を取得
kintone.user.getIcons() ユーザーのアイコンを取得

1. ユーザーの所属組織を取得する

kintoneのカスタマイズで、ログインユーザーの所属組織に応じてフォームの初期値やドロップダウンの選択肢を切り替えることがあります。
たとえば、営業部のユーザーには営業向けのテンプレートを、開発部のユーザーには開発向けのテンプレートを自動設定するケースです。

ここでは、次の図のようにレコード作成画面で部署名フィールドにログインユーザーの優先する組織名を初期値として設定する実装を比較します。

サンプルコードでは、以下のフィールドを使用しています。

フィールド名 フィールドコード フィールドタイプ
部署名 部署名 文字列(1行)

アンチパターン:REST APIによる組織情報の取得

ユーザーの所属組織を取得する方法として、User APIをREST APIで呼び出すパターンがあります。
優先する組織を特定するには、ユーザー情報の取得と所属組織の取得で2回のREST APIリクエストが必要です。

warning
注意

以下のコードはAPIを使った実装に置き換えることが推奨される書き方です。
新規のカスタマイズでは、後述するgetOrganizations()を使用してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 非推奨: この書き方は getOrganizations() を使った実装への置き換えを推奨します
(() => {
  'use strict';

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

    // REST APIでユーザー情報を取得(優先する組織のIDを得るため)
    const userResp = await kintone.api(
      kintone.api.url('/v1/users.json', true),
      'GET',
      {codes: [login.code]}
    );
    const primaryOrgId = userResp.users[0].primaryOrganization;

    // REST APIでユーザーの所属組織を取得
    const orgResp = await kintone.api(
      kintone.api.url('/v1/user/organizations.json', true),
      'GET',
      {code: login.code}
    );

    const primaryOrg = orgResp.organizationTitles.find(
      (item) => item.organization.id === primaryOrgId
    );

    if (primaryOrg) {
      event.record['部署名'].value = primaryOrg.organization.name;
    }

    return event;
  });
})();

このアプローチには以下のリスクがあります。

リスク 説明
REST APIリクエストの大量発生 優先する組織を特定するために、画面を開くたびに2回のREST APIリクエストが発生します。
利用者が多い環境では、ユーザー数に比例してリクエスト数が増大します。500人がアクセスすれば、REST APIのリクエスト数が1000回になります。環境によっては、1日に実行できるAPIリクエスト数の上限に達するリスクがあります。
同時接続数の圧迫 REST APIの同時接続数は環境全体で共有されるリソースです。
大量のユーザーが同時アクセスすると429エラーが発生する可能性があります。
429エラーへの対処として、エラーメッセージの表示、リトライ処理の設計、リトライ中のローディングUIの表示、空のままレコードが保存されることを防ぐバリデーションなど、本来の要件とは無関係な実装が増え、コードが複雑化するリスクがあります。
レスポンスの突合処理が必要 1回目のAPIで取得できる優先する組織の情報はprimaryOrganizationという名の組織IDのみです。
組織IDはシステムが自動的に振り分けた"9"や"15"のような数字のため、それ単体では組織名が判別できません。
そのため2回目のAPIでユーザーが所属する組織一覧を取得し、その中から1回目で取得した組織IDと一致するものを探し出すという突合処理が必要になります。
この2つのAPIのレスポンスを組み合わせて初めて優先する組織の名前が特定できる構造になっており、コードが複雑化するリスクがあります。

推奨される実装方法:getOrganizations()による組織情報の取得

kintone.user.getOrganizations()を使用することで、REST APIリクエストなしでユーザーの所属組織を取得できます。
取得した情報は画面遷移まで自動的にキャッシュされるため、同一画面内で複数回呼び出してもパフォーマンスに影響しません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
(() => {
  'use strict';

  kintone.events.on('app.record.create.show', async (event) => {
    const orgs = await kintone.user.getOrganizations();

    const primaryOrg = orgs.find((org) => org.organization.primary);

    if (primaryOrg) {
      event.record['部署名'].value = primaryOrg.organization.name;
    }

    return event;
  });
})();

REST APIによる組織情報の取得と比較して、以下の点が改善されます。

改善点 説明
REST APIリクエストが大量発生しない 組織情報の取得がJavaScript APIとして実行されるため、REST APIのリクエスト数にカウントされません。
同時接続数が圧迫されない 組織情報の取得がJavaScript APIとして実行されるため、REST APIの同時接続数にカウントされません。
レスポンスの突合処理が不要 レスポンスにユーザーが所属する組織の一覧が入っており、優先する組織の情報にはprimaryプロパティがtrueとして設定されています。
また、組織情報には組織名も含まれているため、複数のAPIレスポンスを突合する必要がありません。

getOrganizations()のAPIドキュメントは、以下を参照してください。

kintone.user.getOrganizations()

2. ユーザーのアイコンを取得する

kintoneのカスタマイズで、ユーザーのプロフィールアイコンを画面上に表示したい場面があります。
たとえば、レコードの担当者アイコンを詳細画面に表示したり、一覧画面でタスクカードにアサイン者のアイコンを並べるケースです。

ここでは、次の図のようにレコード詳細画面で担当者のプロフィールアイコンを表示する実装を比較します。

サンプルコードでは、以下のフィールドを使用しています。

フィールド名 フィールドコード フィールドタイプ
担当者 担当者 ユーザー選択
(スペース) space スペース

アンチパターン:REST APIとURLパターンによるアイコン取得

ユーザーのアイコンを表示する方法として、REST APIでユーザーの内部IDを取得し、kintone内部のURLパターンからアイコンURLを組み立てるパターンがあります。

warning
注意

以下のコードはAPIを使った実装に置き換えることが推奨される書き方です。
新規のカスタマイズでは、後述するgetIcons()を使用してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 非推奨: この書き方は getIcons() を使った実装への置き換えを推奨します
(() => {
  'use strict';

  kintone.events.on('app.record.detail.show', async (event) => {
    const spaceEl = kintone.app.record.getSpaceElement('space');
    if (!spaceEl) {
      return event;
    }

    const assignee = event.record['担当者'].value[0];
    if (!assignee) {
      return event;
    }

    // REST APIでユーザー情報を取得(内部IDを得るため)
    const resp = await kintone.api(
      kintone.api.url('/v1/users.json', true),
      'GET',
      {codes: [assignee.code]}
    );
    const userId = resp.users[0].id;

    // 内部的なURLパターンからアイコンURLを組み立てる
    const iconUrl = `/k/api/user/icon?user=${userId}`;

    const img = document.createElement('img');
    img.src = iconUrl;
    img.style.width = '48px';
    img.style.height = '48px';
    img.style.borderRadius = '50%';
    spaceEl.appendChild(img);

    return event;
  });
})();

このアプローチには以下のリスクがあります。

リスク 説明
内部URLパターンへの依存 /k/api/user/icon?user={id}のようなURLパターンは公開された仕様ではありません。
kintoneのアップデートによってURLの形式が変更されると、アイコンが表示できなくなるリスクがあります。

推奨される実装方法:getIcons()によるアイコン取得

kintone.user.getIcons()を使用することで、REST APIリクエストやURLパターンへの依存なしにユーザーのアイコンURLを取得できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(() => {
  'use strict';

  kintone.events.on('app.record.detail.show', async (event) => {
    const spaceEl = kintone.app.record.getSpaceElement('space');
    if (!spaceEl) {
      return event;
    }

    const assignee = event.record['担当者'].value[0];
    if (!assignee) {
      return event;
    }

    const icons = await kintone.user.getIcons([assignee.code]);

    if (icons.length > 0) {
      const img = document.createElement('img');
      img.src = icons[0].url;
      img.style.width = '48px';
      img.style.height = '48px';
      img.style.borderRadius = '50%';
      spaceEl.appendChild(img);
    }

    return event;
  });
})();

REST APIとURLパターンによるアイコン取得と比較して、以下の点が改善されます。

改善点 説明
内部URLパターンに依存しない JavaScript APIでアイコンのURLを取得するため、内部URLパターンの変更に影響されません。

getIcons()のAPIドキュメントは、以下を参照してください。

kintone.user.getIcons()

実装時に押さえておきたいこと

各APIの非同期処理の扱い、レスポンス構造の違い、モバイル対応について案内します。
事前に把握しておくことで、実装後のトラブルを未然に防げます。

非同期処理の活用

今回紹介したAPIはすべて非同期なAPIです。
async/awaitを使用して順序どおりに処理してください。
詳しくは次のページを参照してください。

レスポンス構造の違い

REST APIのレスポンスとJavaScript APIの戻り値では、プロパティ名やデータ構造に違いがあります。
既存のコードを置き換える際は、APIリファレンスで戻り値の形式を確認してください。

モバイル版での利用

今回紹介したAPIは、モバイル版でも利用できます。
kintone.user.getOrganizations()kintone.user.getIcons()はどちらもkintone.user名前空間のAPIのため、PC版・モバイル版で同じコードが動作します。

PC版 モバイル版
kintone.user.getOrganizations() kintone.user.getOrganizations()
kintone.user.getIcons() kintone.user.getIcons()

まとめ

  • getOrganizations()で、REST APIリクエストなしにユーザーの所属組織を取得できます。
  • getIcons()で、内部URLパターンに依存せずユーザーのアイコンを安定して表示できます。

ユーザー情報取得のJavaScript APIを使用することで、REST APIリクエスト数の削減とカスタマイズの信頼性向上を同時に実現できます。
ユーザー情報や組織情報の取得には、積極的にこれらのAPIを活用してください。

information

このTipsは、2026年4月版kintoneで動作を確認しています。