見出し画像

ユーザー選択フィールドを色々操作する

やりたいこと

kintoneアプリの「ユーザー選択」フィールドの入出力を操作したい
kintoneの「ユーザー選択」フィールドには、他のフィールドとは違う特別な仕様があります。
今回は、kintoneの「ユーザー選択」フィールドの仕組みでこれまで経験したカスタマイズ上の注意点の「覚書」です。

ユーザー選択フィールドはオブジェクト型

文字列1行型などの通常のフィールドは、値を1つだけ保存できます。
ユーザー選択型フィールドは「オブジェクト型」で、属性(プロパティ)で構成されたセットの値を複数保存することが出来ます。
ユーザー選択フィールドの属性はcodenameで1セットなので、以下の例では、ユーザー2名分(山田太郎と山田花子)の属性(codename)を保存しています。code属性はログイン名で、name属性は表示名です。

"文字列1行": {
  "type": "SINGLE_LINE_TEXT",
  "value": "テストです。"
}

"ユーザー選択": {
  "type": "USER_SELECT",
  "value": [
    {
     "code": "yamada",
     "name": "山田 一郎"
    },
   {
     "code": "hanako",
     "name": "山田 花子"
    }
  ]
}

ログインユーザー情報取得のAPI

以下のコードは、kintoneのログインユーザー情報を取得してコンソール表示するコードです。

const loginUser = kintone.getLoginUser();
console.log("ログインユーザー情報:", loginUser);

実行結果は以下の通りです。

それぞれのプロパティの意味は以下の通りです。

値を取り出す方法は、loginUser.プロパティ名です。
例えばユーザーの表示名は、以下の様なコードで取り出せます。

const loginUser = kintone.getLoginUser();
console.log(loginUser.name);
// 山田 一郎

以下に「ユーザー選択」フィールドを操作するjavascriptカスタマイズの事例を3通りほど紹介します。


(1)ユーザー選択の人数を1人に制限する

ユーザー選択フィールドは何人でも登録できますが、2人以上選択している場合は、保存エラーにして1人しか選択できない様にします。
ユーザー選択フィールドが空の場合でもエラー※にします。
※フィールドオプションで「入力必須」にするのと同じ効果です

デモ画面1

ユーザー選択フィールドの入力を1名だけに制限します。
レコード新規保存、編集保存、一覧表編集保存のイベントで動作します。

デモ画面1

デモ画面(1)のサンプルJavascriptコード

// * ユーザー選択フィールドの入力を1人だけに制限する
// * Sample Program
// * Copyright (c) 2024 Application Utilization Study Group
// * Licensed under the MIT License
// ------------------------------------------------------------
(() => {
  'use strict';

  const USER_FIELD_CODE = 'ユーザー選択'; // ユーザー選択フィールドのフィールドコード
  const EVENTS = ['app.record.create.submit', 'app.record.edit.submit', 'app.record.index.edit.submit'];

  kintone.events.on(EVENTS, (event) => {
    const record = event.record;

    // ユーザー選択フィールドの値を取得
    const selectedUsers = record[USER_FIELD_CODE].value;

    // ユーザー選択が不正な場合または空の場合
    if (!Array.isArray(selectedUsers) || selectedUsers.length === 0) {
      event.error = `${USER_FIELD_CODE}フィールドに担当者を設定してください。`;
      return event;
    }

    // 担当者が複数選択されている場合
    if (selectedUsers.length > 1) {
      event.error = `${USER_FIELD_CODE}は1人のみ選択できます。`;
      return event;
    }

    // 正常終了
    return event;
  });
})();

以下のサイトの情報を参考にしました。


(2)ユーザー選択の人数をカウントする

「ユーザー選択」フィールドの値が変更される度に、ユーザー数をカウントして人数(数値フィールド)に表示します。
人数は「ユーザー選択」の配列要素数を調べてセットしています。

デモ画面2

デモ画面2

デモ画面(2)のサンプルJavascriptコード

// * ユーザー選択フィールドの人数をカウントする
// * Sample Program
// * Copyright (c) 2024 Application Utilization Study Group
// * Licensed under the MIT License
// ------------------------------------------------------------
(() => {
  'use strict';

  const PARTICIPANT_FIELD_CODE = 'ユーザー選択'; // 参加者フィールドのフィールドコード
  const COUNT_FIELD_CODE = '人数'; // 人数フィールドのフィールドコード

  // 参加者フィールドの値が変化したときに動作
  kintone.events.on(['app.record.create.change.' + PARTICIPANT_FIELD_CODE, 'app.record.edit.change.' + PARTICIPANT_FIELD_CODE], (event) => {
    const record = event.record;

    // 参加者フィールドの値を取得
    const participants = record[PARTICIPANT_FIELD_CODE]?.value || [];

    // 参加者フィールドの要素数を人数フィールドにセット
    record[COUNT_FIELD_CODE].value = participants.length;

    return event;
  });

})();

(3)ユーザー選択の値を動的に変化させる

最後は、部署(ドロップダウン)の値変更で、上司(ユーザー選択)の値を変化させるカスタマイズ例です。

デモ画面3

デモ画面3

ユーザー選択フィールドへの値セットは、codenameのセットで指定しますが、codeだけでもセットは可能で、保存するとnameプロパティが自動的に補完されます。

以下のサンプルJavascriptコードでは、code: hanako だけnameプロパティが空欄ですが、デモ画面の通り、編集中はcode表示されて、保存後はnameが補完されて表示されます。

デモ画面(3)のサンプルJavascriptコード

// * 部署選択で上司(ユーザー選択フィールド)の値を変更する
// * Sample Program
// * Copyright (c) 2024 Application Utilization Study Group
// * Licensed under the MIT License
// ------------------------------------------------------------
(() => {
  'use strict';

  // 初期設定
  const DEPARTMENT_FIELD_CODE = '部署'; // 部署フィールドのフィールドコード
  const SUPERVISOR_FIELD_CODE = '上司'; // 上司フィールドのフィールドコード
  const EVENTS = ['app.record.create.change.部署', 'app.record.edit.change.部署', 'app.record.create.show', 'app.record.edit.show'];

  // 部署に応じた上司の初期値を取得
  function getSupervisorByDepartment(department) {
    const supervisors = {
      '総務部': { code: 'hanako', name: '' },
      '営業部': { code: 'yamada', name: '山田 太郎' },
      '資材部': { code: 'suzuki', name: '鈴木 次郎' }
    };
    return supervisors[department] || null;
  }

  // レコードの編集画面または新規作成画面で動作
  kintone.events.on(EVENTS, function (event) {
    const record = event.record;

    // 部署の値に応じて上司を設定
    const department = record[DEPARTMENT_FIELD_CODE]?.value;
    const supervisor = getSupervisorByDepartment(department);

    if (supervisor) {
      record[SUPERVISOR_FIELD_CODE].value = [
        {
          code: supervisor.code,
          name: supervisor.name
        }
      ];
    } else {
      // 部署が条件に該当しない場合は上司を空にする
      record[SUPERVISOR_FIELD_CODE].value = [];
    }

    return event;
  });
})();

終わりに

これまで「ユーザー選択」フィールドを操作するカスタマイズでは、単純なミスで時間を浪費したことが多かったので、同じ失敗を繰り返さないために「ユーザー選択」フィールドの仕様とJavascroptカスタマイズで操作する際の事例を自分用にまとめてみました。

私の一番多いミスは、漢字のフィールドコードを指定しているJavascriptファイルの文字コードをShift-JISのままアップロードして、フィールドコードが文字化けを起こして未定義(undefined)エラーを出すことです。
教訓:文字コードは、必ず「UTF-8」に変更して保存しましょうw

今回も最後まで読んで頂き、ありがとうございました。



いいなと思ったら応援しよう!

アプリ活用研究会
よろしければサポートお願いします! いただいたサポートは、note記事制作の活動費に使わせていただきます!