ユーザー選択で選択したユーザーの優先組織を組織選択に表示したい

お世話になっております。

タイトルのようにユーザー選択されたらそのユーザーの優先組織を組織選択に

表示させるようにしたいです。

以下サンプルです。APIの使い方がわからないので間違っていると思います。

(function() {
    “use strict”;
    kintone.events.on(“app.record.create.change.ユーザー選択”, function(event) {
        var record = event.record;

        var apporg = kintone.app.record.primaryOrganization;

        var userorg = kintone.app.record.AdminGetOrgDetailByIds(apporg);

        record[‘組織選択’][‘value’] = userorg;

   });

})();

そもそも、可能なのでしょうか。APIの使い方以外にも間違いがありましたら指摘してください。具体的にコードで指示してください。

以上、よろしくお願いします。

須永 達士さん

こんにちは。

ユーザに紐づく優先組織を取得するのは可能です。

UserAPIを使いユーザコードをキーにして、ユーザ情報の詳細を取得してその中の優先組織のIDを取得します。

コードは以下のような感じになります。

(function() {
  "use strict";
  kintone.events.on("app.record.create.change.ユーザー選択", function(event) {
    var userId = event.record['ユーザー選択'].value[0].code; //ユーザコード取得
    var body = {
      "ids": [userId]
    };
    
    // UserAPI
    kintone.api(kintone.api.url('/v1/users', true), 'GET', body, function(resp) {
        var orgId = resp.users[0].primaryOrganization; // 優先組織のIDを取得
        var rec = kintone.app.record.get(); // 編集画面に表示しているレコードの取得
        rec.record['組織選択'].value = [{"code": orgId}];
        kintone.app.record.get(rec); // 編集画面に表示しているレコードの書き換え
    });
  });
})();

 

カキ氷さん

ありがとうございます。さっそく試してみます。

 

カキ氷さん

すいません。下記のソースで上手くいかないのでデバックにアラートを入れたところ

①番目のアラートはユーザーIDが表示されて

②番目のアラートにはメールアドレスが表示されて

③番目のアラートにはnullが表示されました。

body のidsをid にしましたが、idsのままですと②番目と③番目のアラートが出ないです。

よろしくお願い致します。

 

(function() {
“use strict”;
kintone.events.on(“app.record.create.change.user_charge”, function(event) {
var userId = event.record[‘user_charge’].value[0].code; //ユーザコード取得
var body = {
“id”: [userId]
};
        alert(userId);
// UserAPI
kintone.api(kintone.api.url(‘/v1/users’, true), ‘GET’, body, function(resp) {
        alert(resp.users[0].name);
var orgId = resp.users[0].primaryOrganization; // 優先組織のIDを取得
        alert(orgId);
var rec = kintone.app.record.get(); // 編集画面に表示しているレコードの取得
rec.record[‘spcc_org’].value = orgId;
kintone.app.record.get(rec); // 編集画面に表示しているレコードの書き換え
});
});
})();

 

須永 達士さん

すいません。 idsは内部で持っているユーザIDのようで、今回の場合はbodyにcodesを設定することでユーザコードを指定して取得できました。

あと、最後にレコードに反映するところがget()になっていたのでsetに修正しています。

(function() {
  "use strict";
  kintone.events.on("app.record.create.change.ユーザー選択", function(event) {
    var userId = event.record['ユーザー選択'].value[0].code; //ユーザコード取得
    var body = {
      "codes": [userId]
    };
    // UserAPI
    kintone.api(kintone.api.url('/v1/users', true), 'GET', body, function(resp) {
        var orgId = resp.users[0].primaryOrganization; // 優先組織のIDを取得
        var rec = kintone.app.record.get(); // 編集画面に表示しているレコードの取得
        rec.record['組織選択'].value = [{"code": orgId}];
        kintone.app.record.set(rec); // 編集画面に表示しているレコードの書き換え
    });
  });
})();

 

カキ氷さん

お返事ありがとうございます。上記コードを試してみましたが、resp.users[0].primaryOrganizationで

18という値が返ってきました。この値は優先組織のコードXXXXXXXの桁数とも違っています。

API名は合っていますので取り方が違うのだと思います。

また組織コードのから組織名を取るやり方ですが、AdminGetOrgDetailByIdsを使うのではないでしょうか。

その場合の具体的な使い方を示してください。

よろしくお願いいたします。

 

須永 達士さん

 

>AdminGetOrgDetailByIds
こちらはガルーンのAPIになります。

ユーザ詳細のパラメータを確認すると、primaryOrganizationには「優先する組織」のIDが入っていますが、
レコード内の組織フィールドに設定する場合は、「組織コード」を設定する必要がありました。

変換しないとならないのが面倒ですが、先程取得した「組織ID」を「組織コード」に変換するためには組織エクスポート API(JSON)を使う必要があります。
この組織エクスポート APIの結果から、組織コードを取得してレコードに反映します。

 

(function() {
 "use strict";
 kintone.events.on("app.record.create.change.ユーザー選択", function(event) {
  var userId = event.record['ユーザー選択'].value[0].code; //ユーザコード取得
  var body = {
   "codes": [userId]
  };
  // ユーザcodeをkeyにしてユーザの詳細を取得
  kintone.api(kintone.api.url('/v1/users', true), 'GET', body, function(resp) {
   var orgId = resp.users[0].primaryOrganization; // 優先組織のIDを取得
   var body2 = {
    "ids": [orgId]
   };
   // 組織idをkeyにして組織の詳細を取得
   kintone.api(kintone.api.url('/v1/organizations', true), 'GET', body2, function(resp2) {
    var orgCode = resp2.organizations[0].code; // 優先組織のcodeを取得
    var rec = kintone.app.record.get(); // 編集画面に表示しているレコードの取得
    rec.record['組織選択'].value = [{
     "code": orgCode
    }];
    kintone.app.record.set(rec); // 編集画面に表示しているレコードの書き換え
   });
  });
 });
})();

カキ氷さん

var orgCode = resp2.organizations[0].code; // 優先組織のcodeを取得

をvar orgCode = resp2.organizations[0].name;

にしたら上手くいきました。

ありがとうございました。また、何かありましたらよろしくお願いします。

横からすみません。

上記、ユーザ選択が1名の場合には動作したのですが、

複数名を選択した場合には最初のユーザの所属組織しか選択されませんでした。

複数のユーザ選択に対応する場合にはどのようにしたら良いのでしょうか。

var orgCode = resp2.organizations[0].name;

の箇所のみループ対応させる、ということになるのでしょうか。