背景・実現したいこと
アプリBでプロセスを進行したとき、アプリAへその進捗状況を反映したいと考えています。
下記の記事を参考に設計を進めています。
下記フローで1.2はうまくいき、3.4のところ(アプリBへアップロードするコード)がうまくいかない状態です。
記事との差異として、
・反映先はアプリAのテーブルフィールドのなかのドロップダウンフィールド
→フローの2でのレコード作成時、アプリAのテーブルフィールドの行の固有IDをアプリBへ転記するようにしています。
・アプリAのプロセス更新は行わない
の二点になります。
https://developer.cybozu.io/hc/ja/articles/4404525397273-%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%AE%A1%E7%90%86%E3%81%AE%E6%89%BF%E8%AA%8D%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E9%80%A3%E5%8B%95%E3%81%95%E3%81%9B%E3%82%8B-%E3%82%A2%E3%83%97%E3%83%AA%E9%96%93%E3%81%A7%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86
エラー情報 (開発者ツールのコンソール)
c99c:37 {code: ‘CB_IJ01’, id: ‘okniPsui3P65Q4FQnRsh’, message: ‘不正なJSON文字列です。’}
利用したソースコード
(() => {
'use strict';
kintone.events.on('app.record.detail.process.proceed', (event) => {
const action = event.action.value;
const newSta = event.nextStatus.value;
const appNo = event.record.元アプリ番号.value //アプリAのアプリ番号
const recoNo = event.record.元レコード番号.value //アプリAのレコード
const rowNo = event.record.元列番号.value //アプリAのテーブルデータの固有id
console.log (action,newSta,appNo,recoNo,rowNo);
const Status1 = {
"app" : appNo,
"id" : recoNo,
"record" : {
"テーブルフィールド" :{
"value":{
"id" : rowNo,
"value" : {
"進捗" : {
"value" : ['担当者作業中'] //フィールドはドロップダウン
}
}
}
}
}
};
if (action !== '作業開始') {
return event;
}
return kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', Status1).then(() => {
alert('アプリAのステータスを更新しました。');
return event;
}).catch(err => {
console.log(err);
return event;
});
});
} )();
不要なコードを削ったつもりなのですが、その際必要な部分を削ってしまったかもしれません。
エラーコードで検索し、修正を重ねてみたのですが、うまくいきません。
恐れ入りますが、ご教示いただければと思います。
また併せての質問になりますが、 action !== ‘作業開始’ のみで行っていますが、'完了’の時は××へ変更、'報告’の場合は△△へ変更、といった分岐を作ろうと考えています。
この際は const Status1をStatus2,3・・と複数定義し、swich(action) ~ case として分岐を行おうと考えていますが、すごく冗長になる気がしております。
newStaをドロップダウンの選択肢と一致させるのが一番簡単かなと思うのですが、アプリ毎に異なる設定を使用することも想定しており、、、
何かほかにいい方法はあるでしょうか?
どうぞよろしくお願いいたします。
エラーが「不正なJSON文字列です」とありますので、問題の切り分けとしてはAPI通信に失敗してますね。
パラメーターの指定が間違ってるとみてよさそうです。
手元で試してないのでなんとも、ですが、まずテーブルフィールドのvalue部分は配列になってないといけないのでそこはまちがってますね。
“テーブルフィールド” :{
“value”:{
↓
“テーブルフィールド” :{
“value”:[
下記辺りでリクエストボディのサンプルをみてみてください。
https://developer.cybozu.io/hc/ja/articles/201941784-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B4%E6%96%B0-PUT-
村濱一樹様
ご回答と参考記事のご教示をいただき、誠にありがとうございます。
テーブルフィールドについてご指摘を頂戴いたしました内容にて更新しました。
const Status1 = {
"app" : appNo,
"id" : recoNo,
"record" : {
"テーブルフィールド" :{
"value":[
{
"id" : rowNo,
"value" : {
"進捗" : {
"value" : ['担当者作業中'] //フィールドはドロップダウン
}
}
}
]
}
}
};
ただやはり同じエラーが出てしまったので、他にも重ねて誤っている箇所があるようです。
試しに下記の部分コードの変更と、アプリAのテーブルでドロップダウンフィールドを文字列フィールドへ変更して実行したところ、うまくいきました。
進捗" : {
"value" : '担当者作業中'
}
※追記 下記よりドロップダウン形式の際もvalueの指定は文字列と同じ形式となるようだったので、こちらに修正しました。
※ が、やはり同じエラーは出ました
※ https://developer.cybozu.io/hc/ja/articles/202166330#drop-down
そのため、ドロップダウンフィールドのvalueの指定方法がさらに誤っていそうなのですが、もしお分かりになることがあればご指摘いただければ幸いです。
一応、選択肢とvalueの挿入値が一致していることは確認済みです。(念のためコピペしました。)
どうぞよろしくお願いいたします。
ご指摘頂戴した箇所とは異なるのですが、promiseの記事を読んで下記の更新をしましたので、備忘の為記載します。
(理解が薄いため、元のままで問題なかったかもしれません)
return kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', Status1).then((resp) => {
alert('アプリAのステータスを更新しました。');
return event;
}).catch((resp)=> {
event.error = resp.message
return event;
});
そうですね、[進捗]もそのように指定する必要があります。
> 試しに下記の部分コードの変更と、アプリAのテーブルでドロップダウンフィールドを文字列フィールドへ変更して実行したところ、うまくいきました。
あれ、結局エラー起きたのか、解決しているのか、現状はどちらでしょう…?(よみとれずすいません)
村濱一樹様
分かりにくくてすみません!解決してないです!
試しに更新先を文字フィールドで行った際はうまくいったのですが、ドロップダウンフィールドに戻すとやはり同じ「不正なJSON文字列です」とのエラーが出ている状態です。
valueの指定方法はどちらも同じなので、何故うまくいかないかがわからず、、、
フィールドコードや、ドロップダウンのリストとの一致は、正しく取れているのですが、、、
もし何かお分かりのことがあれば、ご指摘いただければ幸いです。
どうぞよろしくお願いいたします。
なるほど。
では、もう一度コードの全部をコピペしてもらえますでしょうか?
村濱一樹様
すみません、再度アップしたところ、ご指摘分の内容のみでうまくいきました!
(更新漏れだったかもしれません)
ただ、このままでは指定のID以外のテーブルデータが全部削除されてしまう、という致命的な誤りに気付きましたので、追加のコードを考えて改めて出直します。。。
この度は丁寧に対応いただき、どうもありがとうございましたm(__)m
(() => {
'use strict';
kintone.events.on('app.record.detail.process.proceed', (event) => {
const action = event.action.value;
const newSta = event.nextStatus.value;
const appNo = event.record.元アプリ番号.value
const recoNo = event.record.元レコード番号.value
const rowNo = event.record.元列番号.value //テーブルデータの固有id
const Status1 = {
"app" : appNo,
"id" : recoNo,
"record" : {
"テーブルフィールド" :{
"value":[
{
"id" : rowNo,
"value" : {
"進捗" : {
"value" : '担当者作業中' //フィールドはドロップダウン
}
}
}
]
}
}
};
if (action !== '作業開始') {
return event;
}
return kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', Status1).then((resp) => {
alert('アプリAのステータスを更新しました。');
return event;
}).catch((resp)=> {
event.error = resp.message
console.log(resp)
return event;
});
});
} )();
おお、よかったです!
そうですね、テーブルデータはけさないように配慮は必要ですね。
また併せての質問になりますが、 action !== ‘作業開始’ のみで行っていますが、'完了’の時は××へ変更、'報告’の場合は△△へ変更、といった分岐を作ろうと考えています。
この際は const Status1をStatus2,3・・と複数定義し、swich(action) ~ case として分岐を行おうと考えていますが、すごく冗長になる気がしております。
newStaをドロップダウンの選択肢と一致させるのが一番簡単かなと思うのですが、アプリ毎に異なる設定を使用することも想定しており、、、
こちらは僕の意見としては、
そういう分岐をやりたい場合はご認識のとおりswitch文やif文などでやっていいと思います(別に冗長でもないと思いますよ)
できればそういう部分は関数として切り出すことで見通しも良くなるかと思います。
ドロップダウンの選択肢と一致させる、というようなことをやりますとそれはそれで分かりづらいコードですし変更に弱いコードになると思います。(前述のやりかたも変更したらコード変えないといけないのはかわらないものの、テストはしやすいですし、柔軟に対応しやすいです)
system
(system)
クローズされました:
10
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。