2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

kintoneのユーザー情報取得APIで、申請者ごとに変わるバリデーションを実装してみよう

2
Posted at

はじめに

kintoneを使っていると、ユーザーの所属やロールに応じて画面の挙動を変えたいことがありますよね。
たとえば、経費申請アプリで部署ごとに経費の使い方が違うので上限を分けたい、役職によって決裁できる金額を変えたい、といったケースです。

kintoneの数値フィールドには「最小・最大」の設定がありますが、これはすべてのユーザー共通の値で、申請者によって変えることはできません。
また、アクセス権でフィールドの編集権限を制限したり、プロセス管理で承認フローを分けたりすることはできますが、入力値の上限を動的に変える機能は基本機能にはありません。

本記事では、申請者の属性を何で判定するかに応じて、3つのパターンを紹介します。

  1. 部署で判定する
    情報システム部は100万、開発部は200万のように、部署ごとに上限を切り替える
  2. グループロール)で判定する
    役員は500万、一般社員は30万のように、役職別に上限を切り替える
  3. カスタマイズ項目で判定する
    個別の申請上限額を取得し、上限を切り替える

今回はそれぞれを独立したサンプルとして紹介します。
複数の判定軸を組み合わせたい場合は、業務ルールに応じて何を優先するかを考えながらカスタマイズしてください。

kintoneアプリの準備

次のフィールドを用意した「経費申請」アプリを準備します。

フィールドコード フィールド名 フィールドの種類 役割
department 申請部門 文字列(1行) 申請者の所属部門(コードでは使用しません)
amount 申請金額 数値 上限チェックの対象

あわせて、cybozu.com共通管理の「ユーザー管理」で次の設定をします。

組織の設定

  • 組織コード infosys(情報システム部)、dev(開発部)の組織を作成し、申請者を所属させる

グループの設定

  • グループコード executive のグループを作成し、役員であるユーザーを所属させる

カスタマイズ項目の設定

  • 項目コード expense_limit、項目名「申請上限額」:そのユーザーが申請できる経費の上限額(例:1000000

組織・グループ・カスタマイズ項目の設定方法は次のリンクを参考にしてください。

1. kintone.user.getOrganizations()を使って、部署で上限を判定する

まず、申請者の所属組織に応じて上限額を切り替えるカスタマイズを紹介します。
情報システム部は100万円、開発部は200万円、その他の部署は50万円という業務ルールだと仮定します。
複数の組織に所属しているユーザーの場合は、「優先する組織」で判定します。

(() => {
  'use strict';

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

  kintone.events.on(events, async (event) => {
    try {
      const orgs = await kintone.user.getOrganizations();
      const primaryOrg = orgs.find(({ organization }) => organization.primary);
      const primaryOrgCode = primaryOrg ? primaryOrg.organization.code : null;

      let limit = 500000;
      if (primaryOrgCode === 'infosys') {
        limit = 1000000;
      } else if (primaryOrgCode === 'dev') {
        limit = 2000000;
      }

      const amount = event.record.amount.value;
      if (amount && Number(amount) > limit) {
        const deptName = primaryOrg ? primaryOrg.organization.name : '所属部署';
        event.error = `${deptName}で申請できる上限は ${limit.toLocaleString()} 円です。`;
      }
    } catch (error) {
      console.error('所属組織の取得に失敗しました', error);
      event.error = 'ユーザー情報の取得に失敗しました。時間をおいて再度お試しください。';
    }

    return event;
  });
})();

動作確認

ログインユーザーが開発部と情報システム部に所属していて、優先する組織が開発部の場合、上限は200万円であるため、それを超えるとエラーがでます。

開発部の上限額を超えているためエラーがでている

レスポンスの中身を見る

kintone.user.getOrganizations() は、ログインユーザーが所属する組織の一覧を配列で返します。
たとえば、開発部と情報システム部に所属しているユーザーの場合、このような値が返ってきます。
「優先する組織」に設定されているものは、organization.primarytrueとなります。

[
  {
    "organization": {
      "code": "dev",
      "id": "9",
      "name": "開発部",
      "primary": true
    },
    "title": null
  },
  {
    "organization": {
      "code": "infosys",
      "id": "10",
      "name": "情報システム部",
      "primary": false
    },
    "title": null
  }
]

サンプルコードのポイント

返ってきた配列から、「優先する組織」をfindを使って1つ取り出します。

const primaryOrg = orgs.find(({ organization }) => organization.primary);
console.log(primaryOrg);
// { organization: { code: "dev", id: "9", name: "開発部", primary: true }, title: null }

const primaryOrgCode = primaryOrg ? primaryOrg.organization.code : null;
console.log(primaryOrgCode); // "dev"(開発部の組織コードが取り出される)

取り出した組織コードに応じて上限額を切り替え、申請金額がそれを超えていたら event.error にメッセージを設定します。
event.error に文字列を入れると、kintoneは保存処理を中断してエラーメッセージを表示します。

参考:cybozu developer network - 画面上部にエラーを表示する

また、組織名ではなく組織コードで判定しているため、組織名が変わっても条件の判定に影響を受けません。
さらに、kintone.user.getOrganizations() はログインユーザーの現在の所属情報を毎回取得するため、人事異動で所属部署が変わっても、kintoneのユーザー情報を更新するだけで自動的に新しい上限額が適用されます。

参考:cybozu developer network - ユーザーが所属する組織を取得する

2. kintone.user.getGroups()を使って、グループで上限を判定する

次に、申請者の所属グループに応じて上限額を切り替えるカスタマイズを紹介します。
役員(executive)であるメンバーは500万円、それ以外の一般社員は30万円という業務ルールだと仮定します。
変更すべき箇所は所属グループを取得する部分上限を決める部分エラーメッセージです。

(() => {
  'use strict';

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

  kintone.events.on(events, async (event) => {
    try {
      const groups = await kintone.user.getGroups();
      const groupCodes = groups.map((group) => group.code);

      const limit = groupCodes.includes('executive') ? 5000000 : 300000;

      const amount = event.record.amount.value;
      if (amount && Number(amount) > limit) {
        event.error = `所属グループで申請できる上限は ${limit.toLocaleString()} 円です。`;
      }
    } catch (error) {
      console.error('所属グループの取得に失敗しました', error);
      event.error = 'ユーザー情報の取得に失敗しました。時間をおいて再度お試しください。';
    }

    return event;
  });
})();

動作確認

ログインユーザーが役員ではなく一般社員の場合、上限は30万円であるため、それを超えるとエラーがでます。

一般社員の上限額を超えているためエラーがでている

レスポンスの中身を見る

kintone.user.getGroups() は、ログインユーザーが所属するグループの一覧を配列で返します。
たとえば、役員であるユーザーの場合、次のような値が返ります。

[
  { "code": "executive", "id": "2", "name": "役員" },
  { "code": "everyone", "id": "753278", "name": "Everyone" }
]

Everyone はkintoneのすべてのユーザーが自動的に所属するシステム規定のグループです。

サンプルコードのポイント

部署で判定したときと同じ要領で、グループコードの配列に変換してから、includes で役員かどうかを判定します。

組織とは違って、グループは部署横断で設定できます。
役員のように部署を横断する役職を扱う場合、グループで管理すると、対象のユーザーが部署異動しても判定ロジックを変えずに済みます。

参考:cybozu developer network - ユーザーが所属するグループ(ロール)を取得する

3. kintone.user.getCustomFields()を使って、申請者ごとの上限で判定する

最後に、「社員ごとに個別の申請上限額がカスタマイズ項目に設定されている」という運用だと想定します。
たとえば、通常の社員の経費申請上限は30万円ですが、上限引き上げ申請が承認されると、各ユーザーのカスタマイズ項目 expense_limit に引き上げ後の上限額が登録される運用を想定しています。

この上限額をレコード保存時にチェックするカスタマイズです。
部署・グループで判定したときと基本的な構造は同じで、上限の取得に使用するAPIが異なります。

(() => {
  'use strict';

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

  kintone.events.on(events, async (event) => {
    try {
      // ログインユーザー(申請者)のカスタマイズ項目から、申請上限額を取得
      const fields = await kintone.user.getCustomFields();
      const limitField = fields.find((field) => field.code === 'expense_limit');
      const limit = limitField && limitField.value ? Number(limitField.value) : 300000;

      // 申請金額が上限を超えていたらエラー
      const amount = event.record.amount.value;
      if (amount && Number(amount) > limit) {
        event.error = `申請できる上限は ${limit.toLocaleString()} 円です。`;
      }
    } catch (error) {
      console.error('カスタマイズ項目の取得に失敗しました', error);
      event.error = 'ユーザー情報の取得に失敗しました。時間をおいて再度お試しください。';
    }

    return event;
  });
})();

動作確認

申請者のカスタマイズ項目expense_limitに、引き上げ申請後の100万円が設定されている場合、その金額を超えるとエラーがでます。

申請上限額を超えているためエラーがでている

レスポンスの中身を見る

kintone.user.getCustomFields() は、ユーザーに設定されているカスタマイズ項目の一覧を配列で返します。
たとえば、申請上限額が設定されたユーザーであれば、次のような値が返ります。

[
  { "code": "expense_limit", "name": "申請上限額", "value": "1000000" }
]

サンプルコードのポイント

kintone.user.getCustomFields() で申請者のカスタマイズ項目を取得し、その中から expense_limit(申請上限額)を find で取り出します。
カスタマイズ項目が設定されていないユーザーの場合は、デフォルトの上限額(30万円)を適用します。

const limit = limitField && limitField.value ? Number(limitField.value) : 300000;

部署やグループによる判定は、「どの組織・グループに所属しているか」という属性で全員を分類するものでした。
一方、カスタマイズ項目による判定では、ユーザーごとに個別の値を持たせられます。
今回の例のように、申請を通して例外的に上限を引き上げるといった柔軟な運用ができるのは、カスタマイズ項目ならではの特徴です。

参考:cybozu developer network - ユーザーのカスタマイズ項目を取得する

おわりに

今回紹介した3つの判定軸は、組織は部署単位、グループは部署横断の役職や役割、カスタマイズ項目はユーザーごとの個別の値、というようにそれぞれ得意な領域が異なります。
業務ルールに合わせて使い分けたり組み合わせたりすると、柔軟なバリデーションが実装できます。

ぜひ、みなさんのkintoneアプリにも取り入れてみてください!

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?