kintoneRESTAPIClienを利用したテーブル内の数値フィールド更新時の挙動について

実現したいこと・エラー内容

 

kintoneRESTAPIClientのupsertRecordメソッドを利用して

テーブル内に配置した「数値フィールド」を更新する際の挙動で

更新用のレコードオブジェクトで、テーブル内の数値フィールドに該当する箇所に

「文字列」ではなく「数値」を設定するとAPIがエラー(不正なJSON文字列)となります。

 

この現象が発生するのは該当のアプリのみで、別アプリで簡易的にテーブル内に数値フィールドを作成して、同様のテストを実施した場合には「文字列」「数値」のどちらを設定してもAPIは正常に動作してレコードを更新できます。

 

自身の理解が乏しいのかもしれませんが

cybozuDeveloperNetworkを拝見するかぎり

そもそも「数値フィールドには文字列を設定する」のが正しいとの記載が見つけられず質問させていただきました。

数値でも動作する、もしくは動作してしまうだけであって、動作保証の範囲外?なのでしょうか?

もちろん文字列に変換してからレコード更新用オブジェクトを作成してAPI実行すれば所望の動作はするので、アプリの作成に関しては問題ないのですが

なぜこのような動作になるのかという疑問を今後のために解決しておきたく考えております。

 

kintone,javascriptは共に初学者ですので

諸先輩方のアドバイスをいただけると幸いです。

 

エラー情報 (開発者ツールのコンソール)

>>  Uncaught Error KintoneRestAPIError: [400] [CB_IJ01] 不正なJSON文字列です。 

 

利用したソースコード

const APIClient = new KintoneRestAPIClient();
    for (const _ of summaryOfResults) {

        const recordsForBillingManagement = {
            '本部コード': {value: _.client.code},
            '本部名': {value: _.client.name},
            '請求方法': {value: _.method},
            '締日': {value: _.date.closing},
            '請求対象年月': {value: _.billingPeriod},
            '請求対象期間開始': {value: _.date.start},
            '請求対象期間終了': {value: _.date.end},
            '支払期限': {value: _.date.paymentDeadline},
            '請求金額合計': {value: _.totalAmount.sum},
            '売上8': {value: _.totalAmount.taxRate8.sales},
            '消費税8': {value: _.totalAmount.taxRate8.tax},
            '売上10': {value: _.totalAmount.taxRate10.sales},
            '消費税10': {value: _.totalAmount.taxRate10.tax},
            '売上非課税': {value: _.totalAmount.taxRate0.sales},
            '請求金額_tb1': {value: [
                    {
                        value: {
                            '店舗コード_tb1': String(statement.storeCode),
                            '店舗名_tb1': String(statement.storeName),
                            '売上8_tb1': String(statement.sales8),
                            '売上10_tb1': String(statement.sales10),
                            '売上0_tb1': String(statement.sales0),
                            // '小計_tb1': String(statement.subtotal),  // 文字列ならAPIが正常に動作
                            '小計_tb1': 100, // 数値を設定時はアプリによりOKの場合とNGの場合がある
                        }
                    };
                }
            ]}
        };

        const resp = await APIClient.record.upsertRecord({
            app: prime.app.billing_management.id,
            updateKey: {
                field: '請求書番号',
                value: _.billingNumber
            },
            record: recordsForBillingManagement
        });
        console.log('resp', resp);
    }
 '請求金額_tb1': {value: [
                    {
                        value: {
                          // 略
                            '小計_tb1': 100, // 数値を設定時はアプリによりOKの場合とNGの場合がある
                        }
                    };
                }

ここの部分ですが、テーブル内のフィールドにvalueが無くないですか?

'請求金額_tb1': {value: [
                    {
                        value: {
                          // 略
                          '小計_tb1': {value:100}, // ←valude。
                        }
                    };
              }

これを直してもエラー出ますか?

900716722886 様

ご返信いただきありがとうございます。

ご指摘いただいた内容を反映してみたところ、APIが正しく動作するようになりました。

基本的な確認が漏れており、お恥ずかしい限りです。

危うく、たまたま動いてしまうだけのコードを実装してしまうところでした。

大変助かりました!

 

ただ、質問にも書いたように’value’を記載しないでもString()で変換すると

指定のフィールドには正しく反映されてしまうのはなぜか?に疑問が残りますが

正しい使用方法ではないと思われるので深く掘り下げる必要はないのかもしれませんが。

 

いずれにしてもご指摘のおかげで

所望の動作が確認できましたことに感謝いたします。

ありがとうございました。

 

動いたようで何よりです。

ただ、質問にも書いたように’value’を記載しないでもString()で変換すると

指定のフィールドには正しく反映されてしまうのはなぜか?に疑問が残りますが

多分ですが、statementが空の場合にだけ動作していたんじゃないかなと思われますが、
まあいずれにしろテーブルを扱うときはvalue3段構えというややこしい構造になっていて
私もちょいちょい間違えますので、もう慣れるしかないですね。

@bz

「value3段構え」って覚えやすいワードですね

これを覚えておくことで、テーブル構造の想像がつくようになりました!

本題とは関係ありませんがこれもありがたく参考にさせていただきました

ありがとうございました。

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