新規投稿
フォローする

同内容をPOSTするときに作業者フィールドをユーザー選択フィールドに入れたい

教えていただきたいことがございます。

Aを再利用して作ったBというアプリがあります。

プロセスが進んだ時に、Aと同内容をBのアプリに入れたいのです。

しかし、Aでは作成者フィールドと作成日時フィールドを使用しているため

この値はBではユーザー選択フィールド、日時フィールドで対応しようと思っているのですが、

実際に作業を行うとエラーが起こります。

様々試してみているのですが理由がわからず…

エラー内容は「不正なjson文字列です」と出てきてそれ以上進めません。

ソースを書くので、どこがおかしいのか教えてください。

kintone.events.on(["app.record.detail.process.proceed"], function(event){
if (event.nextStatus.value === "承認済み") {
var record = event.record;
console.log(record);
var sample = {
value: [
{
code:record.作成者.value.code,
//name:record.作成者.value.name

}
]
};
record["ユーザー選択フィールド"] = sample;
delete record.$id;
delete record.$revision;
delete record.レコード番号;
delete record.ステータス;
delete record.作業者;
delete record.更新日時;
delete record.更新者;
delete record.作成者;
delete record.作成日時;

var param = {
'app': 943,
'record': record
};
console.log(param);
return kintone.api('/k/v1/record', 'POST', param).then(function(resp) {
alert("成功");
return event;
}, function(error) {
console.log(error);
alert("失敗" + error.message);
return false;
});
}
});

 

0

6件のコメント

Avatar
カキ氷


An.Agさん

 

こんにちは。

event.recordを再利用されているのですね。 

前に似たようなことを試した時にvalue以外の値(typeなど)が残っているとエラーになるフィールドがあったかと思います。

詳しくは覚えていないのですが、最終的にvalueのみコピーすることで対応した記憶があります。

ご参考になれば。

 

0
Avatar
An.Ag

かき氷さん

 

ありがとうございます!

このソースの場合、value以外残っていないように思うのですが、この書き方だとまずいのですかね?

このユーザー選択フィールド以外はすべてうまくいくだけに困惑しているのです。。。

0
Avatar
カキ氷

An.Agさん

 

失礼しました。ユーザ選択フィールド以外は成功しているのですね。

上記のソースを詳細画面の表示イベントに変えて試してみましたが、こちらでは成功しました。

sanpleに代入するときの code:record.作成者.value.code, ←お尻のカンマかな?と思いましたがあっても成功しました。

なんでしょうね・・・。

0
Avatar
rex0220

An.Agさん、カキ氷さん

横から失礼します。
API 自体は、alert("成功"); になっているのでしょうか?


API処理の成否とは、別に event.record を直接編集には問題があります。
これは、return event; で、Aアプリのレコードに変更が反映されてしまいます。
Aアプリに無い "ユーザー選択フィールド" 項目があるとエラーになります。
また、他にイベント処理があると、本来のレコードが渡されない問題も潜在します。

対策としては、必要な項目を羅列して作成するか、json 文字列に変換して利用するかになります。

項目を羅列

var newrecord = {
"ユーザー選択フィールド": sample,
"xxx": {value: record['xxx'].value},
"yyy": {value: record['yyy'].value},
...
};


json 文字列に変換して利用

var record = JSON.parse(JSON.stringify(event.record));
record["ユーザー選択フィールド"] = sample;
delete record.$id;
delete record.$revision;
...
rex0220により編集されました
0
Avatar
An.Ag

かき氷さん

ありがとうございます。

理由はreturnしているのにAアプリにないフィールドだったからみたいですね。

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

 

rex0220さん

ありがとうございます!

お伺いしたいのですが、

今回のプログラムでこのイベント時にはこのプログラムしか走りません。

この場合、returnしないことにより問題は起きますか?

returnしなければ無事にプログラムは走りました。

0
Avatar
rex0220

現時点で問題なくても、将来の誰かが必ずはまるトラップを仕掛けていることになります。

 

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