kintone Utility Library for JavaScriptのPUTについて

お世話になります。

標記の通り、kintone Utility Library for JavaScriptでPUTをしたいと考えております。

具体的な処理としては、レコード一覧画面でGET(約200~300個ほど)してきたレコード分を空更新したいと思っております。

 

GETに関しては、limit指定で対応できるので、kintone Utility Library for JavaScriptは使用せず記述しています。

※画像は94件となっていますが最大で200~300件となります。

 

PUTはkintone Utility Library for JavaScriptを使って記述したのですが、{status: ‘error’,message: ‘“records” should be Array.’}とエラー表示されてしまいます。

(パラメータのrecordsを配列にしないといけない?)

 

GETしてきた値に関してはコンソールを見る限り配列になっているように思えるのですが…どこが間違えているかご教授いただけないでしょうか。

 

■ソースコード

const paramGet = {

                ‘app’: kintone.app.getId(),

                ‘query’: ‘年 in ("’ + targetyear + ‘“) and 月 in (”’ + targetmonth + ‘“) and サービス番号 in (”’ + targetservice + ‘") limit 500’

            }

            console.log(paramGet);

           

            let getResp = await kintone.api(kintone.api.url(‘/k/v1/records’,true), ‘GET’, paramGet);

                console.log(getResp);

            await kintoneUtility.rest.putRecords({

                ‘app’: kintone.app.getId(),

                ‘records’: getResp

            }).then(function(response) {

               console.log(response);

            }).catch(function(error) {

               console.log(error);

            });

 

getResp は、records と totalCount を持つオブジェクトです。

records を指定するなら 「getResp.records」

なお、kintone Utility Library for JavaScript は、すでに非推奨となっています。

これから作成するなら、kintone JavaScript Client が推奨です。

435994154 様

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

ご教授いただいた通り、kintone JavaScript Clientに変えたいと思います。

kintone JavaScript Clientにして、以下のように記述したのですがなぜかPOSTのエラーが出てしまいます。

処理としてはdeleteAllRecordsとupdateAllRecordsを記述しています。

どこがおかしいのでしょうか…

 

■ソースコード

//deleteAllRecords

 const getResp = await kintone.api(kintone.api.url(‘/k/v1/records’,true), ‘GET’, paramforGet)

                        if(getResp.records.length) {; //GETしたレコードで該当するものがあれば次へ

                            console.log(getResp);

                            const client = new KintoneRestAPIClient();

                            const deleteRecords = await client.record.deleteAllRecords({

                                ‘app’: kintone.app.getId(),

                                ‘records’: getResp.records

                            });

 

//updateAllrecords

const getResp = await kintone.api(kintone.api.url(‘/k/v1/records’,true), ‘GET’, paramGet);

                console.log(getResp);

            const client = new KintoneRestAPIClient();

            const updateResp = await client.record.updateAllRecords({

                ‘app’: kintone.app.getId(),

                ‘records’: getResp.records

            });

POSTエラーの内容を確認しましょう。

開発ツールの network タブ で、リクエスト内容と応答内容の詳細が分かりますので、調べてみてください。

435994154 様

ありがとうございます。

networkタブで、調べた結果idかupadtekeyが必要とのことでした。

getRespの中に入っていると思っていましたが、別途指定が必要なのですね…

idを指定する場合、具体的にどのように記述すれば良いかイメージがうまくできません。

大変申し訳ありませんがお教えいただけないでしょうか。

 

REST API の リクエストパラメータにサンプルがあります。

レコードの一括更新

今回は、空更新ということなので、下記のようなリクエストになると思います。

records: [ {  “id”: (更新するレコードのID) }, {  “id”: (更新するレコードのID) }, …]

435994154 様

リンク、ありがとうございます。

対象レコードが固定の場合お教えいただいた書き方でできるような気がするのですが、

空更新する対象が複数レコード(数は変動)の場合、どのような書き方になりますか?

435994154 様

現在、以下のような形で書いてみたのですが、やはり同じようにidが必要と言われてしまう状況です。

const updateResp = await client.record.updateAllRecords({

                ‘app’: kintone.app.getId(),

                ‘records’: [{

                    ‘id’: updateRecords(records)

                }]

            });

            console.log(updateResp);

 

            function updateRecords(records) {

                var updateRecords = [];

                for (var i = 0, l = getResp.records.length; i < l; i++) {

                    var record = getResp.records[i];

                    updateRecords.push(record.$id.value);

                }

                return updateRecords;

            }

こんな感じで

let updateRecords = getResp.records.map(function(rec) { return { id: rec.$id.value }; });

435994154 様

サンプルまでありがとうございます。

以下の記述をしたのですが、やはり同じエラーとなってしまいます…

無知でお恥ずかしい限りですが書き方(updateRecordsを入れる場所など)が間違っていますでしょうか。

const getResp = await kintone.api(kintone.api.url(‘/k/v1/records’,true), ‘GET’, paramGet);

                console.log(getResp);

            let updateRecords = getResp.records.map(function(rec) {

                return { id: rec.$id.value }; });

            const client = new KintoneRestAPIClient();

            const updateResp = await client.record.updateAllRecords({

                ‘app’: kintone.app.getId(),

                ‘records’:[{

                    updateRecords

                }]

            });

map は、配列を返す関数です。

 ‘records’:  updateRecords

デバッグツールでステップ実行すると、変数の内容を確認できますし、

実際の API のリクエスト内容を network タブ確認しましょう.

 

435994154 様

1からご教授いただき、ありがとうございます。

今後、デバッグツールなどでしっかりと確認を行うようにいたします。

この度は大変お世話になりました。

435994154 様

度々申し訳ございません。

先ほどは空更新についてご教授いただきましたが、

別アプリへPUTする場合はどのように記述すればよろしいでしょうか。

 

具体的には

  1. アプリAのレコード一覧画面にボタンを配置

  2. ボタンが押されたら入力された年・月・サービス番号に該当するレコードをアプリBから取得

  3. 取得したレコードに対して、アプリAのフィールド値を入れてPUT

「2.」までは出来ているのですが、以下のところでエラーとなり「3.」がうまくできません。

“食事代8”: {

          “value”: record.合計_税率8.value

},

 

先ほどのmap関数でどうにかできないかと試行錯誤しておりますが、画像のエラーとなってしまいます。

■ソースコード

const paramGet = {

                ‘app’: APP_ID, //アプリB

                ‘query’: ‘年 in ("’ + targetyear + ‘“) and 月 in (”’ + targetmonth + ‘“) and サービス番号 in (”’ + targetservice + ‘") limit 500’

            }

            console.log(paramGet);

            const getResp = await kintone.api(kintone.api.url(‘/k/v1/records’,true), ‘GET’, paramGet);

                console.log(getResp);

            if(getResp.records.length) { //GETしたレコードで該当するものがあれば次へ

                let updateRecords = getResp.records.map(function(rec) {

                    return {

                        “id”: rec.$id.value,

                        “record”: {

                            “食事代8”: {

                                “value”: record.合計_税率8.value //アプリAの値

                            },

                            “食事代10”: {

                                “value”: record.合計_税率10.value //アプリAの値

                            }

                        }

                    }

                });

                const client = new KintoneRestAPIClient();

                const updateResp = await client.record.updateAllRecords({

                    ‘app’: APP_ID, //アプリB

                    ‘records’: updateRecords,

                });

画像のエラーが無いです。

「record.合計_税率8.value //アプリAの値 」の record は、どこで定義?

435994154 様

画像、添付できておらず申し訳ありません。

先ほど別スレッドを立ち上げましたので、そちらでお願いできれば幸いです。

試行錯誤してみて、先ほどとは少し状況が変わり現在以下のような状態となっております。

https://developer.cybozu.io/hc/ja/community/posts/4775197768857-kintone-REST-API-Client%E3%81%AEupdateAllRecords%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6