関連レコードについて 作業者を表示するレコードの条件にしたい

いつもお世話になっております。

 

関連レコードを使って、複数アプリの進捗を閲覧できるアプリを作りたいと思っています。

その際、参照するアプリのフィールドを作業者にしてレコードを取得したいのですが、標準機能では搭載していないと思います。

 

参照するアプリ内の文字列1行フィールドに作業者を転記してやればよいかと思うのですが、カスタマイズで実現可能でしょうか。

作業者が変更されるたびにフィールドの値を更新する必要があるのですが・・・。

 

よろしくお願いいたします。

作業者が変更されるタイミング=プロセス更新時として、おっしゃるようにアプリ内の文字列1行フィールドに作業者名を転記するのはいかがですか?

下記リンクを参考に、process proceedではなくdetail showイベントを使いました。

https://developer.cybozu.io/hc/ja/community/posts/360039734412-%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AE-%E6%AC%A1%E3%81%AE%E4%BD%9C%E6%A5%AD%E8%80%85%E3%81%AE%E5%8F%96%E5%BE%97%E3%81%AF%E5%8F%AF%E8%83%BD-

 

下記を関連レコードで参照するアプリに対して設定します

作業者文字列というフィールドに、作業者名を設定します。

条件式でステータスが「処理中」で、作業者名と作業者文字列の内容が不一致の場合のみ、設定させることにしました。

(function () { "use strict";
    kintone.events.on('app.record.detail.show', function (event) {
        var record = event.record;
        var Status = record.ステータス.value;
        var appid = kintone.app.getId();
        var recnum = kintone.app.record.getId();
        var nextperson = record.作業者.value[0].name;
        // ステータス毎の処理
        switch (Status) {
            case "処理中":
                if (nextperson != record.作業者文字列.value) {
                    var body = {
                        "app": appid,
                        "id": recnum,
                        "record": {
                            "作業者文字列": {
                                "value": nextperson
                            }
                        }
                    };
                    kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body, function (resp) {
                        // success
                        console.log(resp);
                        location.reload();
                    }, function (error) {
                        // error
                        console.log(error);
                    });
                    break;
                }
        }
    })
})();

 

これで関連レコードフィールドを持つ、参照元アプリから

文字列(作業者文字列)をキーに設定できると思うのですが。。

いかがでしょうか。

Aiko Yamamoto様

 

返信が遅くなり、申し訳ございません。

サンプルコードまでいただき、ありがとうございます!

思っていた動作をしてくれたので、とても助かりました。

追加で質問させていただきます。

いくつかのアプリで試したところ、値をうまく取れないものがありました。

コンソールを見ると以下のようなエラーが表示されています。

PUT https://(サブドメイン名).cybozu.com/k/v1/record.json 400 (Bad Request)

 

他にも以下のようなカスタマイズをしていますので、競合でもしているのかなと思うのですが、どこが引っかかっているのかわからない状況です。

お手数ですがアドバイスいただけますでしょうか。

 

①テーブルに初期値を設定する

(function() {
‘use strict’;

kintone.events.on(‘app.record.create.show’, function(event) {
// 行の作成
var newRow1 = createValue_(‘品名’,‘アクセサリーを除く’,‘’,‘ー’);
var newRow2 = createValue_(‘用途’,‘アクセサリーを除く’,‘’,‘ー’);
var newRow3 = createValue_(‘液性’,‘アクセサリーを除く’,‘’,‘ー’);
var newRow4 = createValue_(‘成分’,‘アクセサリーを除く’,‘’,‘ー’);
var newRow5 = createValue_(‘正味量’,‘アクセサリーを除く’,‘’,‘ー’);
var newRow6 = createValue_(‘使用量の目安’,‘アクセサリーを除く’,‘’,‘ー’);
var newRow7 = createValue_(‘使用方法’,‘アクセサリーを除く’,‘’,‘ー’);
var newRow8 = createValue_(‘使用上の注意’,‘’,‘’,‘ー’);
var newRow9 = createValue_(‘応急処置’,‘’,‘’,‘ー’);
var newRow10 = createValue_(‘保管上の注意’,‘アルコール製剤’,‘’,‘ー’);
var newRow11 = createValue_(‘GHS表示’,‘F類・アクセサリーを除く’,‘’,‘ー’);
var newRow12 = createValue_(‘安全図記号’,‘L・F・食添アルコール製剤を除く’,‘’,‘ー’);
var newRow13 = createValue_(‘警告表示’,‘塩素系/酸性洗浄剤’,‘「まぜるな危険」の表示があること。製品表示管理規程に従う。’,‘ー’);
var newRow14 = createValue_(‘危険物表示’,‘危険物’,‘’,‘ー’);
var newRow15 = createValue_(‘火気厳禁/火気注意’,‘危険物/可燃物’,‘’,‘ー’);

// tableGJ1 に初期値を定義する
event.record.tableGJ1.value = [
newRow1,
newRow2,
newRow3,
newRow4,
newRow5,
newRow6,
newRow7,
newRow8,
newRow9,
newRow10,
newRow11,
newRow12,
newRow13,
newRow14,
newRow15
];
return event;
});

function createValue_(text1,text2,text3,radio1) {
return {
‘value’: {
‘項目_GJ1’: {
‘type’: ‘SINGLE_LINE_TEXT’,
‘value’: text1
},
‘対象_GJ1’: {
‘type’: ‘SINGLE_LINE_TEXT’,
‘value’: text2
},
‘判定基準_GJ1’:{
‘type’: ‘SINGLE_LINE_TEXT’,
‘value’: text3
},
‘確認_GJ1’:{
‘type’:‘RADIO_BUTTON’,
‘value’: radio1
}
}
};
}
})();

 

②フィールドの表示/非表示をラジオボタンで切り替え

(function() {
“use strict”;

//レコードの詳細画面、編集、区分の変更(新規作成時)、区分の変更(編集時)で適用する
var events = [‘app.record.detail.show’,
‘app.record.edit.show’,
‘app.record.create.change.区分’,
‘app.record.edit.change.区分’];

kintone.events.on(events, function(event) {

var record = event.record;

//ラジオボタンに応じてテーブルの表示、非表示を切り替える
switch (record[‘区分’][‘value’]) {
case ‘①ラベル・フィルム(NB特注品)’:
kintone.app.record.setFieldShown(‘tableSR1’, true);
kintone.app.record.setFieldShown(‘tableSR2’, false);
kintone.app.record.setFieldShown(‘tableSR3’, false);
kintone.app.record.setFieldShown(‘tableSR4’, false);
kintone.app.record.setFieldShown(‘tableSR5’, false);
kintone.app.record.setFieldShown(‘tableSR6’, false);
kintone.app.record.setFieldShown(‘tableSR7’, false);
kintone.app.record.setFieldShown(‘tableGJ1’, true);
kintone.app.record.setFieldShown(‘tableGJ2’, false);
kintone.app.record.setFieldShown(‘tableGJ3’, false);
kintone.app.record.setFieldShown(‘tableGJ4’, false);
kintone.app.record.setFieldShown(‘tableMK1’, true);
kintone.app.record.setFieldShown(‘tableMK3’, false);
kintone.app.record.setFieldShown(‘tableMK5’, false);
kintone.app.record.setFieldShown(‘tableHH’, true);
break;
case ‘②ラベル・フィルム(PB)’:
kintone.app.record.setFieldShown(‘tableSR1’, false);
kintone.app.record.setFieldShown(‘tableSR2’, true);
kintone.app.record.setFieldShown(‘tableSR3’, false);
kintone.app.record.setFieldShown(‘tableSR4’, false);
kintone.app.record.setFieldShown(‘tableSR5’, false);
kintone.app.record.setFieldShown(‘tableSR6’, false);
kintone.app.record.setFieldShown(‘tableSR7’, false);
kintone.app.record.setFieldShown(‘tableGJ1’, false);
kintone.app.record.setFieldShown(‘tableGJ2’, true);
kintone.app.record.setFieldShown(‘tableGJ3’, false);
kintone.app.record.setFieldShown(‘tableGJ4’, false);
kintone.app.record.setFieldShown(‘tableMK1’, false);
kintone.app.record.setFieldShown(‘tableMK3’, false);
kintone.app.record.setFieldShown(‘tableMK5’, false);
kintone.app.record.setFieldShown(‘tableHH’, true);
break;
case ‘③BIB・缶(NB特注品)’:
kintone.app.record.setFieldShown(‘tableSR1’, false);
kintone.app.record.setFieldShown(‘tableSR2’, false);
kintone.app.record.setFieldShown(‘tableSR3’, true);
kintone.app.record.setFieldShown(‘tableSR4’, false);
kintone.app.record.setFieldShown(‘tableSR5’, false);
kintone.app.record.setFieldShown(‘tableSR6’, false);
kintone.app.record.setFieldShown(‘tableSR7’, false);
kintone.app.record.setFieldShown(‘tableGJ1’, false);
kintone.app.record.setFieldShown(‘tableGJ2’, false);
kintone.app.record.setFieldShown(‘tableGJ3’, true);
kintone.app.record.setFieldShown(‘tableGJ4’, false);
kintone.app.record.setFieldShown(‘tableMK1’, false);
kintone.app.record.setFieldShown(‘tableMK3’, true);
kintone.app.record.setFieldShown(‘tableMK5’, false);
kintone.app.record.setFieldShown(‘tableHH’, true);
break;
}

});
})();

N_okazaki様

 

PUT https://(サブドメイン名).cybozu.com/k/v1/record.json 400 (Bad Request)

このようなエラーとなるのは、①、②にはない気がします。。

 

とすると下記のようにフィールドの型が文字列1行でないとか?

「json 400 (Bad Request)」でコミュニティを検索したら色々ヒットしました。

https://developer.cybozu.io/hc/ja/community/posts/205294806-POST%E3%81%99%E3%82%8Bjson%E3%81%AE%E8%A8%98%E8%BF%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

 

どんなフィールド形式に対して、どのようなスクリプトを入れようとしているのか、

ご確認頂いたほうが良い気がします。

私がご提供したものは文字列1行を想定しているので、他の形式であれば合わせる必要があります。

私は合せ方の参考に下記リンクの「レスポンスの例」を見たり、実際にデータ構造をChromeのデベロッパーツールでデバッグしながら確認したりします。

https://developer.cybozu.io/hc/ja/articles/202331474

 

上記がヒントになると良いのですが・・・。

Aiko Yamamoto様

 

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

 

①フィールド形式は、文字列1行で設定しています。

②コードは上でいただいたものをそのまま使わせていただいています。(プロセス名のみ変更)

ですので、フィールド形式には問題がないかと思うのですが・・・

念のためフィールドを作り直し、フィールドコードとプロセス名も見直してみたのですが、やはり上手くいかないです。

 

ーーーーーーーーーーーーーーーーーーー

(function () {

“use strict”;
kintone.events.on(‘app.record.detail.show’, function (event) {
var record = event.record;
var Status = record.ステータス.value;
var appid = kintone.app.getId();
var recnum = kintone.app.record.getId();
var nextperson = record.作業者.value[0].name;
// ステータス毎の処理
switch (Status) {
case “課長”:
if (nextperson != record.作業者文字列.value) {
var body = {
“app”: appid,
“id”: recnum,
“record”: {
“作業者文字列”: {
“value”: nextperson
}
}
};
kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, body, function (resp) {
// success
console.log(resp);
location.reload();
}, function (error) {
// error
console.log(error);
});
break;
}
}
})
})();

Aiko Yamamoto様

 

原因はよくわからないのですが、一応不具合が解消しました。

このJSファイルを一番上に移動したところ、正常に動作しました。

 

JSファイルは上から順番に実行されているのだと思うのですが、先に実行された処理に時間がかかっているとエラーになったりするのでしょうか・・・?