新規投稿
フォローする

レコード一覧画面でレコードの自動更新

お世話になります。

レコード一覧画面を表示時に登録されているレコードを自動更新したいと考えています。
更新する部分としては、レコード内の日付フィールドに入っている日付を年と月に切り分け、同じレコード内のドロップダウン「年」ドロップダウン「月」に、日付フィールドから切り分けた年月を入れたいです。

日付フィールドから「年」「月」に切り分けるところまではできたのですが、PUTで更新する際に「入力内容が正しくありません。」と表示されます。
コンソール画面には「PUT  400 (Bad Request)」と表示されてしまいます。

リクエストの書き方に不足があると思っているのですが、対策が分からない状態です。ご教授いただけないでしょうか。

■ソースコード
const events1 = ['app.record.index.show'];
 
kintone.events.on(events1, function(event) {
        const records = event.records;

        for (var i = 0; i < records.length; i++) {
            const date = records[i]['日付']['value']; //日付
            const year_field = records[i]['年']['value']; //ドロップダウン「年」
            const month_field = records[i]['月']['value'] //ドロップダウン「月」
   
   //日付に値が入っているか確認
            if (date === undefined) {
                year_field = '';
                month_field = '';
            }else{
    //日付を年と月に分ける
                const year = date.split('-')[0];
                const month = date.split('-')[1];

                var params = {
                    app: kintone.app.getId(),
                    record: {
                    '年': {
                        'value': year
                    },
                    '月': {
                        'value': month
                    }
                }
            }
            console.log(params);

            kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function (resp) {
                console.log(resp);
                updated = true;
            }, function (resp) {
                // エラーの場合はメッセージを表示する
                let errmsg = 'レコード更新時にエラーが発生しました。';
                // レスポンスにエラーメッセージが含まれる場合はメッセージを表示する
                if (resp.message !== undefined) {
                    errmsg += resp.message;
                }
                    alert(errmsg);
                })
            }
        }
    return event;
    })
})();
0

8件のコメント

Avatar
ishikawayuito

paramsにレコードIDが不足していることが原因かと思われます。

0
Avatar
daikonsan

ishikawayuito 様

 

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

以下のように修正してみましたが、idはnullとなっていました。

id、別の記述をしないといけないのでしょうか。

var params = {
                    'app': kintone.app.getId(),
                    'id': kintone.app.record.getId(),
                    'record': {
                        '年': {
                            'value': year
                        },
                        'record' :{
                        '月': {
                            'value': month
                        }
                        }
                    }
                }
0
Avatar
ishikawayuito

idに関しまして、event.recordsで取得してforでループさせていると思うのですが処理の中に

let レコードID = records[i]['レコード番号']['value'];

こちらで各レコードのIDが取得できるようになると思います。

0
Avatar
daikonsan
 
ご返信ありがとうございます。
ご教授いただいた通りレコードのID取得できるようになりました。ありがとうございます。
ただ、日付フィールドから切り分けた「年」「月」がドロップダウンの「年」「月」に入ることができませんでした。
コンソールを見ても特にエラーは出ていない様子です。
画像のようにコンソールで確認したところ、paramsで指定した「年」「月」の中に値は入っていました。
 
location.reload();で画面更新すると無限に更新ループしてしまうため、一旦止めています。
そのため手動で画面更新していますが画面更新後、各レコードのドロップダウン「年」「月」に入るようにしたいです。
どこか不足ありますでしょうか。
 
 
(function() {
    "use strict";

 

const events1 = ['app.record.index.show'];

 

const events2 = ['app.record.create.show',
                     'app.record.edit.show',
                     'app.record.create.change.状況',
                     'app.record.edit.change.状況'];

 

kintone.events.on(events1, function(event) {
        const records = event.records;

 

        for (var i = 0; i < records.length; i++) {
            const date = records[i]['日付']['value'];   //日付
            const year_field = records[i]['年']['value'];   //ドロップダウン「年」
            const month_field = records[i]['月']['value'];   //ドロップダウン「月」
            let recordId = records[i]['レコード番号']['value'];

 

            //日付に値が入っているか確認
            if (date === undefined) {
                year_field = '';
                month_field = '';
            }else{
                //日付を年と月に分ける
                const year = date.split('-')[0];
                const month = date.split('-')[1];

 

                var params = {
                    'app': kintone.app.getId(),
                        'id': recordId,
                        'record': {
                            '年': {
                                'value': year
                            },
                            '月': {
                                'value': month
                            }
                    }
                }
            console.log(params);
            }
        }

 

            kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function (resp) {
                console.log(resp);
                //location.reload();
                    return event;
            }, function (resp) {
                // エラーの場合はメッセージを表示する
                let errmsg = 'レコード更新時にエラーが発生しました。';
                // レスポンスにエラーメッセージが含まれる場合はメッセージを表示する
                if (resp.message !== undefined) {
                    errmsg += resp.message;
                }
                    alert(errmsg);
                })

 

    return event;
    })
})();
daikonsanにより編集されました
0
Avatar
daikonsan

ishikawayuito

 

申し訳ありません。上記自己解決しました。

ただし、画面リロードの location.reload(); を入れるとリロードがループしてしまいます。

他の記述方法があればお教えいただきたいです。

0
Avatar
ishikawayuito
paramの書き方ですが同じレコードに年、月のフィールドがあるのであればこの形でよいと思います。
var params = {
                    'app': kintone.app.getId(),
                        'id': recordId,
                        'record': {
                            '年': {
                               'value': year
                            },
                            '月': {
                                'value': month
                            }
                        }
                    }
また、エラーが出ていないとのことなのでうまくputが回っていないことが原因ではないのかと思っています。
restapiは非同期処理なので先にeventが終了してしまいputができていない状況かと思われます。
対処方法としてはpromise処理かasync処理のどちらかが有効かと思われます。
0
Avatar
ishikawayuito

解決のお話がタイミングよくでてましたね...申し訳ございません。

画面のリロードについては自分は下記の処理で行っています。

if(window.name !== 'null'){ //リロード判定
location.reload();
window.name = 'null';
}else{
window.name = '';
}

0
Avatar
daikonsan

ishikawayuito 様

 

いえいえとんでもございません。

ご教授いただいたおかげさまで意図するように動作させることができました!

大変お世話になりました。

1
サインインしてコメントを残してください。