何を実現したいのかを書きましょう
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);
};
});
})();