cybozu.com登録ユーザー情報をkintoneに同期したい

何を実現したいのかを書きましょう

下記URLのコードでcybozu.comの登録ユーザー情報をkintoneに同期したのですが、

「CustomItemValue」がうまく同期できませんでした(他は同期できました)。

「cybozu.com共通APIドキュメント」を見ると、「CustomItemValue」は「配列(CustomItemValue型)CustomItemValue型」とのことで、他の箇所と書き方が異なると思われるのですが、どのように記述すればよいのか、わかりませんでした。

ご教示いただけますと幸いです。
よろしくお願いします。

実行したコードをコピー&ペーストしましょう

/*
cybozu.com ユーザー一覧更新処理
*/

// kintone API – cybozu developer network
//https://developer.cybozu.io/hc/ja/articles/360028177472

// PromiseがわからないのでAsync/Awaitを使う - Qiita
// https://qiita.com/_muraham/items/697e1d53a09ff40530e5

// プログレスバーを簡単に実装できるprogressbar.js - bagelee(ベーグリー)
// https://bagelee.com/design/javascript/create_progress_bars_with_progressbarjs/

// https://rawgit.com/kimmobrunfeldt/progressbar.js/master/dist/progressbar.js
// https://rawgit.com/kimmobrunfeldt/progressbar.js/master/dist/progressbar.min.js

(function() {
    "use strict";
    kintone.events.on('app.record.index.show', function(event) {
        var myProgressDiv = document.createElement('div');
        myProgressDiv.id = "my_progress_container";
        //myProgressDiv.style.backgroundColor = 'red';
        myProgressDiv.style.width = '600px';
        myProgressDiv.style.height = '8px';
        if (document.getElementById('my_index_button') !== null) {
            return;
        }
        var myIndexButton = document.createElement('button');
        myIndexButton.id = 'my_index_button';
        myIndexButton.innerText = ' 更  新 ';
        myIndexButton.onclick = async function() {
            var bar = new ProgressBar.Line(my_progress_container, {
                strokeWidth: 4,
                easing: 'easeInOut',
                duration: 100,
                color: '#FFEA82',
                trailColor: '#eee',
                trailWidth: 1,
                svgStyle: {width: '100%', height: '100%'},
                text: {
                    style: {
                        color: '#999',
                        position: 'relative',
                        left: '560px',
                        top: '-70px',
                        padding: 0,
                        margin: 0,
                        transform: null
                    },
                    autoStyleContainer: false
                },
                from: {color: '#FFEA82'},
                to: {color: '#ED6A5A'},
                step: (state, bar) => {
                    bar.path.setAttribute('stroke', state.color);
                    bar.setText(Math.round(bar.value() * 100) + ' %');
                }
            });
            //console.log(event.records);
            var respUsers = await kintone.api(kintone.api.url('/v1/users', true), 'GET', {});
            //console.log(respUsers);
            var respRecords = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
                'app': kintone.app.getId()
            });
            //console.log(respRecords);
            var recordIDs = {};
            var postRecords = [];
            var putRecords = [];
            for(let i = 0; i < respRecords.records.length; i++) {
                recordIDs[respRecords.records[i]['$id']['value']] = {
                    'userid': respRecords.records[i]['id']['value'],
                    'idx': i
                }
            }
            //console.log(recordIDs);
            for(let i = 0; i < respUsers.users.length; i++) {
                bar.animate(i/respUsers.users.length);
                var respUserOrgs = await kintone.api(kintone.api.url('/v1/user/organizations', true), 'GET', {
                    'code': respUsers.users[i]['code']
                });
                //console.log(respUserOrgs);
                var organizations = []
                for(let ii = 0; ii < respUserOrgs['organizationTitles'].length; ii++) {
                    organizations.push({
                        'code': respUserOrgs['organizationTitles'][ii]['organization']['code'],
                        'name': respUserOrgs['organizationTitles'][ii]['organization']['name']
                    });
                }
                let record = {};
                record['id'] = {'value': respUsers.users[i]['id']}
                record['name'] = {'value': respUsers.users[i]['name']}
                record['surName'] = {'value': respUsers.users[i]['surName']}
                record['givenName'] = {'value': respUsers.users[i]['givenName']}
                record['surNameReading'] = {'value': respUsers.users[i]['surNameReading']}
                record['givenNameReading'] = {'value': respUsers.users[i]['givenNameReading']}
                record['code'] = {'value': respUsers.users[i]['code']}
                record['email'] = {'value': respUsers.users[i]['email']}
                if (respUsers.users[i]['valid']) {
                    record['valid'] = {'value': ['使用中']}
                } else {
                    record['valid'] = {'value': []}
                }
                record['organizations'] = {'value': organizations}
                record['primaryOrganization'] = {'value': respUsers.users[i]['primaryOrganization']}
                record['phone'] = {'value': respUsers.users[i]['phone']}
                record['url'] = {'value': respUsers.users[i]['url']}
                //
                record['callto'] = {'value': respUsers.users[i]['callto']}
                record['mobilePhone'] = {'value': respUsers.users[i]['mobilePhone']}
                record['locale'] = {'value': respUsers.users[i]['locale']}
                record['timezone'] = {'value': respUsers.users[i]['timezone']}
                record['localNameLocale'] = {'value': respUsers.users[i]['localNameLocale']}
                record['localName'] = {'value': respUsers.users[i]['localName']}
                //
                record['employeeNumber'] = {'value': respUsers.users[i]['employeeNumber']}
                record['joinDate'] = {'value': respUsers.users[i]['joinDate']}
                record['birthDate'] = {'value': respUsers.users[i]['birthDate']}
                record['sortOrder'] = {'value': respUsers.users[i]['sortOrder']}
                record['description'] = {'value': respUsers.users[i]['description']}
                //
                record['customItemValues'] = {'value': respUsers.users[i]['customItemValues']}
                record['extensionNumber'] = {'value': respUsers.users[i]['extensionNumber']}
                //
                record['ctime'] = {'value': respUsers.users[i]['ctime']}
                record['mtime'] = {'value': respUsers.users[i]['mtime']}
                //console.log(record);
                var matchRecordIDs = []
                Object.keys(recordIDs).forEach(function(key) {
                    if (this[key]['userid'] == respUsers.users[i]['id']) {
                        matchRecordIDs.push({
                            'key': key,
                            'idx': this[key]['idx']
                        });
                    }
                }, recordIDs);
                //console.log(matchRecordIDs);
                if (matchRecordIDs.length > 0) {
                    //console.log(respRecords.records[matchRecordIDs[0]['idx']]);
                    if (record['id']['value'] != respRecords.records[matchRecordIDs[0]['idx']]['id']['value']
                    || record['name']['value'] != respRecords.records[matchRecordIDs[0]['idx']]['name']['value']
                    || record['surName']['value'] != respRecords.records[matchRecordIDs[0]['idx']]['surName']['value']
                    || record['givenName']['value'] != respRecords.records[matchRecordIDs[0]['idx']]['givenName']['value']
                    || record['surNameReading']['value'] != respRecords.records[matchRecordIDs[0]['idx']]['surNameReading']['value']
                    || record['givenNameReading']['value'] != respRecords.records[matchRecordIDs[0]['idx']]['givenNameReading']['value']
                    || record['valid']['value'] != respRecords.records[matchRecordIDs[0]['idx']]['valid']['value']
                    || record['code']['value'] != respRecords.records[matchRecordIDs[0]['idx']]['id']['code']
                    || record['email']['value'] != respRecords.records[matchRecordIDs[0]['idx']]['id']['email'] ) {
                        putRecords.push({'id': matchRecordIDs[0]['key'], 'record': record});
                    }
                    delete recordIDs[matchRecordIDs[0]['key']];
                } else {
                    postRecords.push(record);
                }
            }
            console.log("recordIDs :");
            //console.log(recordIDs);
            console.log(Object.keys(recordIDs));
            console.log("putRecords :");
            console.log(putRecords);
            console.log("postRecords :");
            console.log(postRecords);
            if (Object.keys(recordIDs).length > 0) {
                var resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'DELETE', {
                    'app': kintone.app.getId(),
                    'ids': Object.keys(recordIDs)
                });
            }
            if (putRecords.length > 0) {
                var resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
                    'app': kintone.app.getId(),
                    'records': putRecords
                });
            }
            if (postRecords.length > 0) {
                var resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'POST', {
                    'app': kintone.app.getId(),
                    'records': postRecords
                });
            }
            bar.animate(1.0);
            location.reload();
            return event;
        };
        kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
        kintone.app.getHeaderMenuSpaceElement().appendChild(myProgressDiv);
        //kintone.app.getHeaderSpaceElement().appendChild(myProgressDiv);
    });
})();

CustomItemValue は codevalue の 2つの項目からなる
オブジェクトの配列です。

例をあげてみると、以下ような形になります。

customItemValues = [
    {
        code: "aaa",
        value: "123"
    },
    {
        code: "bbb",
        value: "456"
    },
    {
        code: "ccc",
        value: "789"
    }
]

上記において、例えば code"bbb" であるオブジェクトの value の値をとりたい場合、
以下のようにコードを書くと、resultvalue の値(この場合は"456")が入ります。

const item = customItemValues.find(item => item.code === "bbb");
const result = item ? item.value : undefined;
「いいね!」 1

nazobito様

ご回答ありがとうございます。

record[‘customItemValues’] = {‘value’: respUsers.users[i][‘customItemValues’]}
の上に教えて戴いた下記コードを追加してみましたが、動作しませんでした。

const item = customItemValues.find(item => item.code === “bbb”);
const result = item ? item.value : undefined;

※「組織とユーザーの設定」→「プロフィール項目の設定」→「カスタマイズ項目の設定」で「項目名」「項目コード」は「bbb」で設定しています