別アプリへ入力、登録したレコードから計算後のフィールド値を取得したい G.Q 2022年03月11日 07:22 背景・実現したいこと アプリAへ入力した値をアプリBへ転記・計算させ登録したレコードから計算後のフィールド値を取得したいのですが、kintoneで実装可能でしょうか? 0
24件のコメント
G.Qさん
こんにちは。
標準ではできないので、JavaScriptでカスタマイズするしかないと思います。
REST APIを使う必要があります。
APIの使い方や詳細は、当サイト上部にある「チュートリアル」または「APIドキュメント」も合わせてご覧ください。
流れとしては
①:アプリAからアプリBに対してPOST(登録)
②:①のレスポンスを受けた後、アプリBに登録したレコードをGET(取得)
③:②でGETしたレコードのフィールド情報をアプリA(自レコード)に入力
アプリAのレコード編集画面から①を実行するのであれば上記の流れになりますが
レコード登録後の詳細画面から①を実行するのであれば、③は自レコードへのPUT(更新)が必要です。
koichiさん
返信ありがとうございます。
上記通りまずはPOSTを試しているのですがうまくいきません。
初心者質問で申し訳ありません。ご教授よろしくお願いします。
G.Qさん
ご確認ありがとうございます。
見た感じは問題ないように思うのですが、APIの処理後にconsole.logを入れて
ブラウザのデベロッパーツールで確認ください。
デバッグ方法は以下にも合わせてご覧ください。
https://developer.cybozu.io/hc/ja/articles/207613916
koichiさん
返信ありがとうございます。
上記試しましたが、レコードの登録はできましたが、フィールドへの書き込みが
できていません。原因は何が考えられますか?
G.Qさん
最初の投稿の画像を改めて拝見して、書き込み先のフィールドは自動計算フィールドでしょうか?
自動計算されるフィールドには、書き込みができません(自動計算結果で上書きされます)。
そのため、自動計算しない別のフィールドに書き込みし、それを自動計算フィールドで参照する必要あります。
自動計算フィールドでなければ、また別のところに問題がありますが、まずは上記ご確認ください。
koichiさん
自動計算フィールドだったので、上記通りに行えば書き込みできるようになりました。ありがとうございました。
ただ項目を増やしたせいか下記のエラーが出るようになりました。
エラー解除するには、減らすしかないのでしょうか?
G.Qさん
日付、計量機No、担当者の末尾にvalueがないことが原因かと思います。
まずは、そちらを修正してみてください。
koichiさん
初歩的なミスで申し訳ないです。
上記、修正で無事全て登録できるようになりました。
本当にありがとうございます。
ただ次にアプリBで計算させた値を取得して書き込みたいのですが
うまくいきません。書き方が根本的に間違えていますでしょうか?
G.Qさん
1回のkintone.apiリクエストでは、全てを実装できないので
今回の場合は、3回に分けて実行する必要があります。
①登録先アプリへの登録(POST)
②登録先アプリに登録したレコードの取得(GET)
③取得したレコード情報を自レコードに更新(PUT)
大まかな流れで書くと以下のようなコードになります。
POSTが成功したらGET、GETが成功したらPUTという流れです。
koichiさん
返信ありがとうございます。
上記、試してみましたが、下記のエラーが出ました。
登録先から取得したいフィールドが、計算フィールドなので
取得できませんか?
G.Qさん
respの中はeventは無いので、「resp.record.フィールド名.value」という書き方で良いですよ。
koichiさん
上記直しました。まだ別に問題があるようで、元アプリに計算後の値を取得し書き込みができていません。
また編集画面から保存を押すと下記のエラーが発生するようになりました。
G.Qさん
見落としていました。テーブルへのPUTですね。
テーブルへのPUTパラメータは、テーブル内の全行・全項目を記載しないといけません。
以下ご確認ください。
レコード更新におけるテーブル操作のテクニック
また、そちらのエラーが出るということは、PUT処理自体は行われたということです。
「ほかのユーザーがレコードを更新しました」というのが、APIでPUTしたからです。
そのため、PUT処理が成功した後に、画面リロード処理を入れてみてください。
上記、少々語弊がありました。
リンク先にも記載されてますが
更新するセル(フィールド)が決まっていれば、そのセル(フィールド)だけパラメータに渡せば良いです。
他の行は行IDだけ指定すれば良いです。
指定しなかったら行が削除されます。
必ずしも全項目を指定するということではなかったです。
koichiさん
返信ありがとうございます。
上記ですが、添付リンク先を見ながら修正してみましたが
自レコードへの書き込みもなく、編集画面に入ると更新が永久に起こってしまいます。
恐れ入りますが、またご教授いただけないでしょうか。
G.Qさん
更新対象のテーブルの全行を下記のように配列化しないといけません。
GETした情報を1行目に更新すると想定した書き方です。2行目以降は更新しません。
画面リロードの件、こちらの処理は「app.record.detail.show」での実行でしたね。
無限ループしてしまいますので、一旦外してください。
根本からの見直しが必要になりますが
処理的に問題なければ「app.record.create.submit」「app.record.edit.submit」で実行した方が良いですね。
但し、同期処理が必要になりますので、kintone.Promiseまたはawait/asyncを使って、保存処理を待機する必要があります。
目指せ!JavaScriptカスタマイズ中級者(2) 〜Promiseのかわりにasync/await編〜
koichiさん
上記はこのような形になりますか?
添付写真のようにエラーが発生し、保存、更新ができません。
G.Qさん
そちらのエラーは、edit.jsの258行目に「a」という変数が定義されていないというエラーですが
ひとまず以下を変更してみてください。
async/awaitを使用する場合は、各kintone.apiの前に「await」を付けることで同期処理になります。
「app.record.create.submit」「app.record.edit.submit」イベント内で処理する場合は、PUT処理は不要になります。
①POST
②GET
③テーブルの指定値を上書き
修正内容が二転三転してすみません。
koichiさん
上記直してみましたが、やはりうまくいきません。
POSTもできていないので、コードの書き方に誤りがあるのでしょうか。
こちらこそ、ながらくお付き合いいただき、ありがとうございます‼
G.Qさん
PUTは不要ですが、GETは要りますね。
async/awaitを使うと、もう少しシンプルな書き方になります。
koichiさん
上記で実装できました!
何から何まで本当にありがとうございました‼
この延長にはなるのですが、
①行追加した場合などサブテーブル行ごとに同じように実装は可能でしょうか。
②サブテーブル行追加の「⊕」ボタンを押したタイミングで起動、プログラム処理し保存させることは可能でしょうか。
G.Qさん
まずは解決されて何よりです。
行追加時にも実装は可能ですが、いくつか問題があります。
①行追加時に、どの行が追加されたかが、標準イベントでは取れないため
それを識別する方法を考える必要があります。
②行追加で発火させると、+を押す度に毎回POST処理になるため
不要なレコードが登録される可能性があります。
例えば、今と同じくsubmitイベント内で
テーブル全行をまとめてPOSTして、各行を更新するといったことも可能ではあります。
これについても、既にPOSTした行は何もしない、といった処理が必要だったりします。
POST先のアプリとの連携も考慮いただいた上で
どのタイミングでAPIを発火させると最適か、検討してみてください。
koichiさん
返信ありがとうございます。
運用的には保存時に、すでにPOSTしている行を省き、テーブル全行をまとめてPOSTし更新させる
方法が最適だと考えています。コード的には、どの辺を追記・修正する必要がありますか?
G.Qさん
まずは以下のような修正が必要でしょう。
①テーブル構成について
既にPOSTしたかどうかを判定するために、POST完了した際のレコード番号を格納する列フィールドが必要です。
↓ テーブル列(例)
レコード番号 | めっき種類 | 形態 | ケース数 | ・・・
レコード番号の位置はどこでも良いです。
②POST・GETについて
テーブルをforループしながら、レコード番号が無い行(POSTしていない行)に対して
上記のPOST・GET処理をすれば実装できます。
単重計算後に加えて、POST完了のレコード番号もテーブルに格納します。