チェックボックスフィールドの設定を変更した後

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

Aアプリのレコードを登録・削除した際、Bアプリのチェックボックスの項目(契約区分)を増減させたい。(kintone REST API 「フィールドの設定を変更する」と「 アプリの設定を運用環境へ反映する」を利用)

発生した問題やエラーメッセージを具体的に書きましょう

一連の流れは設定できたのですが、何度かAアプリでレコード登録・削除などを繰り返した後、Bアプリからレコードをcsvで書き出したところ、テストで追加・削除したチェックボックスの項目も書き出されるようになってしまいました。(アプリの設定画面上ではその項目はすでに削除されていて、チェックが入っているレコードもありません。)

例えば、
①Aアプリで“テスト”という名称でレコード登録し、Bアプリのチェックボックス項目(契約区分)にも“テスト”という項目を追加。
②再度Aアプリで“テスト”と設定したレコードを削除し、Bアプリのチェックボックス項目(契約区分)からも“テスト”という項目を削除。
③Bアプリでレコードを追加し、CSVでレコードを書き出し
④チェックボックス項目が画面上残っているものだけでなく、“テスト”という項目もcsvの1行目の項目欄に残って出力されてしまいました。(『契約区分[テスト]』という項目が残ったままという状況。)

もし原因がお分かりになればお力添えいただきたく存じます。
恐れ入りますが、よろしくお願いいたします。

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

(function() {
    'use strict';

    const CONTRACT_TYPE_FIELD_CODE = '契約書種類名';
    const B_APP_ID = '592';
    const CHECKBOX_FIELD_CODE = 'チェックボックス';

    kintone.events.on(['app.record.create.submit.success'], async function(event) {
        const contractTypeName = event.record[CONTRACT_TYPE_FIELD_CODE].value;

        // Bアプリのチェックボックスフィールドの選択肢を取得
        const resp = await kintone.api(kintone.api.url('/k/v1/app/form/fields', true), 'GET', {app: B_APP_ID}); 
        const resp_options = Object.keys(resp.properties[CHECKBOX_FIELD_CODE].options)
        const check = resp_options.indexOf(contractTypeName);
        if(check !== -1) {
            return event;//追加したい選択肢と同じ名称のものがすでにある場合
        }
        const resp_length = resp_options.length;
        let checkboxOptions = resp.properties[CHECKBOX_FIELD_CODE].options;
        checkboxOptions[contractTypeName] = { label: contractTypeName, index: Number(resp_length) };

        // チェックボックスフィールドの選択肢を更新
        let putBody = {
            app: B_APP_ID,
            properties: {}
        };
        putBody.properties[CHECKBOX_FIELD_CODE] = {
            type: 'CHECK_BOX', 
            options: checkboxOptions,
        };
        try {
            const resp2 = await kintone.api(kintone.api.url('/k/v1/preview/app/form/fields', true), 'PUT', putBody);
            console.log('チェックボックスの選択肢を更新しました。', resp2);
            const updateBody = {
                apps: [{app: B_APP_ID}],
                revert: false
            };
    
            await kintone.api(kintone.api.url('/k/v1/preview/app/deploy.json'), 'POST', updateBody);
        } catch (err) {
            console.error('チェックボックスの選択肢の更新に失敗しました。', error);
        };
        
        return event;
    });

    kintone.events.on(['app.record.detail.delete.submit','app.record.index.delete.submit'], async function(event) {
        const contractTypeName = event.record[CONTRACT_TYPE_FIELD_CODE].value;
        // Bアプリのチェックボックスフィールドの選択肢を取得
        const resp = await kintone.api(kintone.api.url('/k/v1/app/form/fields', true), 'GET', {app: B_APP_ID});
        console.log(resp)
        const resp_options = Object.keys(resp.properties[CHECKBOX_FIELD_CODE].options);
        const check = resp_options.indexOf(contractTypeName);
        if(check === -1) {
            return event;//削除したい選択肢がすでにない場合
        }
        let checkboxOptions = resp.properties[CHECKBOX_FIELD_CODE].options;

        // 削除する選択肢を除外
        delete checkboxOptions[contractTypeName];

        // チェックボックスフィールドの選択肢を更新
        let deleteBody = {
            app: B_APP_ID,
            properties: {}
        };
        deleteBody.properties[CHECKBOX_FIELD_CODE] = {
            type: 'CHECK_BOX', // typeを明示的に指定
            options: checkboxOptions
        };

        try {
            const resp2 = await kintone.api(kintone.api.url('/k/v1/preview/app/form/fields', true), 'PUT', deleteBody);
            console.log('チェックボックスの選択肢を更新しました。', resp2);
            const updateBody = {
                apps: [{app: B_APP_ID}],
                revert: false
            };
    
            await kintone.api(kintone.api.url('/k/v1/preview/app/deploy.json'), 'POST', updateBody);
        } catch (err) {
            console.error('チェックボックスの選択肢の更新に失敗しました。', error);
        };        
    });
})();

こんにちは。

調べてみると、kintone は選択式のフィールドで選択肢を削除した場合でも、
内部的には削除した選択肢のデータが残っており、ファイル書き出し時に
削除した選択肢も取得されちゃうみたいです。

また、回避策としては、新しくフィールドを設置し直すしかないようなので、
CSVファイルに書き出した後、削除した選択肢を取り除く必要が
あるのかなと思います。

なお、フィールドを取得する で現在の選択肢のみを取得できるようなので、
削除済みの選択肢を取り除く処理を実装することは可能かと思います。

ko_ji様
ご丁寧に返信いただきありがとうございます。

調べてみると、kintone は選択式のフィールドで選択肢を削除した場合でも、
内部的には削除した選択肢のデータが残っており、ファイル書き出し時に
削除した選択肢も取得されちゃうみたいです。

→ kinoneの仕様上しょうがないものなのですね。
調べが足りておらず、申し訳ございませんでした。
参考リンクもありがとうございます。大変参考になりました。

また、回避策としては、新しくフィールドを設置し直すしかないようなので、
CSVファイルに書き出した後、削除した選択肢を取り除く必要が
あるのかなと思います。
なお、フィールドを取得する で現在の選択肢のみを取得できるようなので、
削除済みの選択肢を取り除く処理を実装することは可能かと思います。

→ 教えていただいた内容をもとに、運用方法を考え直してみます。
お忙しいところ、本当にありがとうございました。

「いいね!」 1

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。