社員マスタから所属組織を変更【2021年3月アップデート機能】

桜も咲き、春になりました。綺麗な桜の下でワイワイ花見がしたいですね〜。
どうも和田です。
今回は3月にアップデートされた「ユーザーの所属組織をJSON形式で更新できるREST API」の利用例をご紹介していきます。

突然ですが、こんな時ありませんか?

組織情報を更新するのに、毎回cybozu.com管理者ページにいくのが手間・・・
社員マスタを使っているので一元管理して、アプリ上で変更をできるようにしたい!


そんな時は今回追加されたAPIを使えば解決できます!
以前はCSV形式でしか取得・更新ができませんでしたが、アップデートによってJSONにも対応したことでコーディングでの取り扱いがやりやすくなります。

※社員一人一人にユーザーがある前提でのカスタマイズになっております。
 cybozu.com管理者権限があるユーザーのみ更新が可能です

今回は営業部Bに所属している加藤次郎さんが総務部に異動すると想定してやっていきます。

アプリを作成する

まずは以下のような社員マスタを用意します。

cybozu.com管理画面ではこのようになっています。

カスタマイズ方法

レコード変更時に更新をするには「app.record.edit.submit」のイベントで処理を入れればいいですね。

(function() {
  "use strict";
  kintone.events.on("app.record.edit.submit", function(event) {
    var record = event.record;
    var users = record['社員'].value.map(function(v) {return v.code;});
    var organizations = record['所属組織'].value.map(function(v) {return v.code;}).sort();

    var userCode = users[0];

    //現在の所属組織を取得
    return kintone.api('/v1/user/organizations', 'GET', {
      code: userCode
    }).then(function(resp) {
      //現在の所属組織
      var currentOrgs = resp.organizationTitles.map(function(org) {
        return org.organization.code;
      }).sort();

      //所属組織更新処理を追加する
   return
  });
})();

所属組織の更新処理は今回追加されたAPIを使って以下のようなコードを入れていきます。

//所属組織を更新
return kintone.api('/v1/userOrganizations', 'PUT', {
  userOrganizations: [
    {
      code: userCode,
      organizations: organizations.map(function(code) {
        return {
          orgCode: code,
          titleCode: '' 
        };
      })
    }
  ]
});

上記を合わせて、エラー制御も追加すると以下のようなコードになります。

(function() {
  "use strict";
  kintone.events.on("app.record.edit.submit", function(event) {
    var record = event.record;
    var users = record['社員'].value.map(function(v) {return v.code;});
    var organizations = record['所属組織'].value.map(function(v) {return v.code;}).sort();

    //社員マスタアプリを想定しているので
    // 「社員」ユーザー選択フィールドには1件のみ値が入る前提
    if (users.length !== 1) {
      event.error = '社員フィールドにはユーザーを1名選択してください';
      return event;
    }

    var userCode = users[0];

    //チェック用に現在の所属組織を取得
    return kintone.api('/v1/user/organizations', 'GET', {
      code: userCode
    }).then(function(resp) {
      //現在の所属組織
      var currentOrgs = resp.organizationTitles.map(function(org) {
        return org.organization.code;
      }).sort();

      //差分をチェック
      if (currentOrgs.join('') === organizations.join('')) {
        //差分が無いのでリクエストしない
        return event;
      }

      //所属組織を更新
      return kintone.api('/v1/userOrganizations', 'PUT', {
        userOrganizations: [
          {
            code: userCode,
            organizations: organizations.map(function(code) {
              return {
                orgCode: code,
                titleCode: '' //今回「役職」については考慮していません
              };
            })
          }
        ]
      });
    }).then(function() {
      swal({
            title: '組織を更新しました。',
            icon: 'success',
            button: 'OK'
          })
      return event;
    }).catch(function(err) {
      event.error = '所属組織更新に失敗しました';
      return event;
    });
  });
})();

実際に動かしてみる

カスタマイズを適用した後、実際に動かしてみましょう。
営業部Bに所属している加藤次郎さんを総務部に変更します。

保存するとメッセージが表示されました!

変更ができたのかをcybozu.com管理画面で確認してみましょう。

更新できていますね。

注意点

組織を何も選択しない空の状態で更新すると所属組織無しにすることができます。
「優先される組織」は無所属の状態から複数追加すると、1個目に選択した組織が「優先される組織」として設定されますので、順番にはご注意ください。

関連記事

計算式で全角記号を入力した際、注意文が表示されるように【2021年3月アップデート機能】

同じカテゴリーの記事