背景・実現したいこと
アプリAへ入力した値をアプリBへ転記・計算させ登録したレコードから計算後のフィールド値を取得したいのですが、kintoneで実装可能でしょうか?
背景・実現したいこと
アプリAへ入力した値をアプリBへ転記・計算させ登録したレコードから計算後のフィールド値を取得したいのですが、kintoneで実装可能でしょうか?
G.Qさん
こんにちは。
標準ではできないので、JavaScriptでカスタマイズするしかないと思います。
REST APIを使う必要があります。
APIの使い方や詳細は、当サイト上部にある「チュートリアル」または「APIドキュメント」も合わせてご覧ください。
流れとしては
①:アプリAからアプリBに対してPOST(登録)
②:①のレスポンスを受けた後、アプリBに登録したレコードをGET(取得)
③:②でGETしたレコードのフィールド情報をアプリA(自レコード)に入力
アプリAのレコード編集画面から①を実行するのであれば上記の流れになりますが
レコード登録後の詳細画面から①を実行するのであれば、③は自レコードへのPUT(更新)が必要です。
koichiさん
返信ありがとうございます。
上記通りまずはPOSTを試しているのですがうまくいきません。
初心者質問で申し訳ありません。ご教授よろしくお願いします。
(function() {
"use strict";
kintone.events.on('app.record.detail.show', function(event) {
// アプリIDの取得
var appId = event.appId;
// レコード番号の取得
var recordId = event.recordId;
// リクエストプロパティ(JSON)
var spp1 = event.record['テーブル_0']['value'][0]['value']['単重1']['value']
var spp2 = event.record['テーブル_0']['value'][0]['value']['単重2']['value']
var params = {
"app": 420, // ← 参照ログを格納するアプリのIDに書き換えてください
"record": {
"単重1": { "value": spp1 },
"単重2": { "value": spp2}
}
};
// kintone REST API リクエスト ~ レコードの登録(POST)
kintone.api(
kintone.api.url('/k/v1/record', true), // - pathOrUrl
'POST', // - method
params, // - params
function(resp) { // - callback
// (特に何もしない)
},
function(resp) { // - errback
// (特に何もしない)
}
);
});
})();
G.Qさん
ご確認ありがとうございます。
見た感じは問題ないように思うのですが、APIの処理後にconsole.logを入れて
ブラウザのデベロッパーツールで確認ください。
デバッグ方法は以下にも合わせてご覧ください。
https://developer.cybozu.io/hc/ja/articles/207613916
kintone.api(
kintone.api.url('/k/v1/record', true), // - pathOrUrl
'POST', // - method
params, // - params
function(resp) { // - callback
console.log(resp);
},
function(error) { // - errback
console.log(error)
}
);
koichiさん
返信ありがとうございます。
上記試しましたが、レコードの登録はできましたが、フィールドへの書き込みが
できていません。原因は何が考えられますか?
G.Qさん
最初の投稿の画像を改めて拝見して、書き込み先のフィールドは自動計算フィールドでしょうか?
自動計算されるフィールドには、書き込みができません(自動計算結果で上書きされます)。
そのため、自動計算しない別のフィールドに書き込みし、それを自動計算フィールドで参照する必要あります。
自動計算フィールドでなければ、また別のところに問題がありますが、まずは上記ご確認ください。
koichiさん
自動計算フィールドだったので、上記通りに行えば書き込みできるようになりました。ありがとうございました。
(function() {
"use strict";
kintone.events.on('app.record.detail.show', function(event) {
// アプリIDの取得
var appId = event.appId;
// レコード番号の取得
var record = event.record;
console.log(event);
//var yt = record['閲覧アプリID']['Value']
// リクエストプロパティ(JSON)
var params = {
"app": 420, // ← 参照ログを格納するアプリのIDに書き換えてください
"record": {
"日付": { "value": event.record.日付 },
"計量機No": { "value": event.record.計量機No },
"連番": { "value": event.record.receipts.value[0].value.no.value },
"担当者1": { "value": event.record.担当者1 },
"担当者2": { "value": event.record.担当者2 },
"サイズ名": { "value": event.record.receipts.value[0].value.サイズ名.value },
"めっき種類": { "value": event.record.receipts.value[0].value.めっき種類.value },
"単重1A": { "value": event.record.receipts.value[0].value.単重1.value },
"単重2B": { "value": event.record.receipts.value[0].value.単重2.value },
"個数1A": { "value": event.record.receipts.value[0].value.個数.value },
"形態": { "value": event.record.receipts.value[0].value.形態.value },
}
};
// kintone REST API リクエスト ~ レコードの登録(POST)
kintone.api(
kintone.api.url('/k/v1/record', true), // - pathOrUrl
'POST', // - method
params, // - params
function(resp) { // - callback
// (特に何もしない)
},
function(resp) { // - errback
// (特に何もしない)
}
);
});
})();
ただ項目を増やしたせいか下記のエラーが出るようになりました。
エラー解除するには、減らすしかないのでしょうか?
{"code":"CB_JH01","id":"YtybBDsr6ANumeyo6VdR","message":"認証に失敗しました。セッション認証には、「X-Requested-With」
ヘッダーが必要です。"}
G.Qさん
日付、計量機No、担当者の末尾にvalueがないことが原因かと思います。
まずは、そちらを修正してみてください。
koichiさん
初歩的なミスで申し訳ないです。
上記、修正で無事全て登録できるようになりました。
本当にありがとうございます。
ただ次にアプリBで計算させた値を取得して書き込みたいのですが
うまくいきません。書き方が根本的に間違えていますでしょうか?
(function() {
"use strict";
kintone.events.on('app.record.detail.show', function(event) {
// アプリIDの取得
// レコード番号の取得
console.log(event);
// リクエストプロパティ(JSON)
var params = {
"app": 420,
"record": {
"日付": { "value": event.record.日付.value },
"計量機No": { "value": event.record.計量機No.value },
"連番": { "value": event.record.receipts.value[0].value.no.value },
"担当者1": { "value": event.record.担当者1.value },
"担当者2": { "value": event.record.担当者2.value },
"サイズ名": { "value": event.record.receipts.value[0].value.サイズ名.value },
"めっき種類": { "value": event.record.receipts.value[0].value.めっき種類.value },
"単重1A": { "value": event.record.receipts.value[0].value.単重1.value },
"単重2B": { "value": event.record.receipts.value[0].value.単重2.value },
"個数1A": { "value": event.record.receipts.value[0].value.個数.value },
"形態": { "value": event.record.receipts.value[0].value.形態.value },
}
};
var getvalue = {
"app": 418,
"record": {
"単重計算後": { "value": event.record.単重計算後.value },
}
};
// kintone REST API リクエスト ~ レコードの登録(POST)
kintone.api(
kintone.api.url('/k/v1/record', true), // - pathOrUrl
'POST', // - method
params,
getvalue, // - params
function(resp) { // - callback
// (特に何もしない)
},
function(resp) { // - errback
// (特に何もしない)
}
);
});
})();
G.Qさん
1回のkintone.apiリクエストでは、全てを実装できないので
今回の場合は、3回に分けて実行する必要があります。
①登録先アプリへの登録(POST)
②登録先アプリに登録したレコードの取得(GET)
③取得したレコード情報を自レコードに更新(PUT)
大まかな流れで書くと以下のようなコードになります。
POSTが成功したらGET、GETが成功したらPUTという流れです。
(function() {
'use strict';
kintone.events.on('app.record.detail.show', function(event) {
// アプリIDの取得
// レコード番号の取得
console.log(event);
// POSTリクエストプロパティ(JSON)
var params = {
"app": 登録先アプリ番号,
"record": {
"フィールド1": { "value": "値" },
"フィールド2": { "value": "値" },
"フィールド3": { "value": "値" },
}
};
// kintone REST API リクエスト ~ レコードの登録(POST)
kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params, function(resp) {
// POST成功
// GETリクエストプロパティ(JSON)
var params = {
"app": 登録先アプリ番号,
"id": resp.id // POSTした結果のレコード番号
};
// kintone REST API リクエスト ~ レコードの取得(GET)
kintone.api(kintone.api.url('/k/v1/record', true), 'GET', params, function(resp) {
// GET成功
// PUTリクエストプロパティ(JSON)
var params = {
"app": 自アプリ番号,
"id": kintone.app.record.getId(), // 自レコード番号
"record": {
"フィールド1": { "value": resp.フィールド1.value },
"フィールド2": { "value": resp.フィールド2.value },
"フィールド3": { "value": resp.フィールド3.value },
}
};
// kintone REST API リクエスト ~ レコードの更新(PUT)
kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function(resp) {
// PUT成功
}, function(error) {
// PUTエラー
});
}, function(error) {
// GETエラー
});
});
}, function(error) {
// POSTエラー
});
})();
koichiさん
返信ありがとうございます。
上記、試してみましたが、下記のエラーが出ました。
登録先から取得したいフィールドが、計算フィールドなので
取得できませんか?
(function() {
"use strict";
kintone.events.on('app.record.detail.show', function(event) {
// アプリIDの取得
// レコード番号の取得
console.log(event);
// リクエストプロパティ(JSON)
var params = {
"app": 420,
"record": {
"日付": { "value": event.record.日付.value },
"計量機No": { "value": event.record.計量機No.value },
"連番": { "value": event.record.receipts.value[0].value.no.value },
"担当者1": { "value": event.record.担当者1.value },
"担当者2": { "value": event.record.担当者2.value },
"サイズ名": { "value": event.record.receipts.value[0].value.サイズ名.value },
"めっき種類": { "value": event.record.receipts.value[0].value.めっき種類.value },
"単重1A": { "value": event.record.receipts.value[0].value.単重1.value },
"単重2B": { "value": event.record.receipts.value[0].value.単重2.value },
"個数1A": { "value": event.record.receipts.value[0].value.個数.value },
"形態": { "value": event.record.receipts.value[0].value.形態.value },
}
};
// kintone REST API リクエスト ~ レコードの登録(POST)
kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params, function(resp) {
// POST成功
// GETリクエストプロパティ(JSON)
var params = {
"app": 420,
"id": resp.id // POSTした結果のレコード番号
};
// kintone REST API リクエスト ~ レコードの取得(GET)
kintone.api(kintone.api.url('/k/v1/record', true), 'GET', params, function(resp) {
// GET成功
// PUTリクエストプロパティ(JSON)
var params = {
"app": 418,
"id": kintone.app.record.getId(), // 自レコード番号
"record": {
"receipts.value[0].value.単重計算後": { "value": resp.event.record.単重計算後.value },
// "フィールド2": { "value": resp.フィールド2.value },
//"フィールド3": { "value": resp.フィールド3.value },
}
};
// kintone REST API リクエスト ~ レコードの更新(PUT)
kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function(resp) {
// PUT成功
}, function(error) {
// PUTエラー
});
}, function(error) {
// GETエラー
});
});
}, function(error) {
// POSTエラー
});
})();
G.Qさん
respの中はeventは無いので、「resp.record.フィールド名.value」という書き方で良いですよ。
koichiさん
上記直しました。まだ別に問題があるようで、元アプリに計算後の値を取得し書き込みができていません。
また編集画面から保存を押すと下記のエラーが発生するようになりました。
G.Qさん
見落としていました。テーブルへのPUTですね。
テーブルへのPUTパラメータは、テーブル内の全行・全項目を記載しないといけません。
以下ご確認ください。
また、そちらのエラーが出るということは、PUT処理自体は行われたということです。
「ほかのユーザーがレコードを更新しました」というのが、APIでPUTしたからです。
そのため、PUT処理が成功した後に、画面リロード処理を入れてみてください。
上記、少々語弊がありました。
リンク先にも記載されてますが
更新するセル(フィールド)が決まっていれば、そのセル(フィールド)だけパラメータに渡せば良いです。
他の行は行IDだけ指定すれば良いです。
指定しなかったら行が削除されます。
必ずしも全項目を指定するということではなかったです。
koichiさん
返信ありがとうございます。
上記ですが、添付リンク先を見ながら修正してみましたが
自レコードへの書き込みもなく、編集画面に入ると更新が永久に起こってしまいます。
恐れ入りますが、またご教授いただけないでしょうか。
// kintone REST API リクエスト ~ レコードの登録(POST)
kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params, function(resp) {
// POST成功
// GETリクエストプロパティ(JSON)
var params = {
"app": 420,
"id": resp.id // POSTした結果のレコード番号
};
// kintone REST API リクエスト ~ レコードの取得(GET)
kintone.api(kintone.api.url('/k/v1/record', true), 'GET', params, function(resp) {
// GET成功
// PUTリクエストプロパティ(JSON)
var params = {
"app": 418,
"id": kintone.app.record.getId(), // 自レコード番号
"record": {
"receipts.value[0].value.単重計算後.value": { "value": resp.record.単重計算後.value },
// "フィールド2": { "value": resp.フィールド2.value },
//"フィールド3": { "value": resp.フィールド3.value },
}
};
// kintone REST API リクエスト ~ レコードの更新(PUT)
kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function(resp) {
location.reload();
// PUT成功
}, function(error) {
// PUTエラー
});
}, function(error) {
// GETエラー
});
});
}, function(error) {
// POSTエラー
});
})();
G.Qさん
更新対象のテーブルの全行を下記のように配列化しないといけません。
GETした情報を1行目に更新すると想定した書き方です。2行目以降は更新しません。
var putArray = [];
for (var i = 0; i < receipts.value.length; i++) {
if (i == 0) {
// 1行目にGETした値を更新(行idと更新したいフィールドのみ指定)
putArray.push({
"id": receipts.value[i].id,
"value": {
"単重計算後": {
"value": resp.record.単重計算後.value
}
}
});
} else {
// 2行目以降は更新しない(更新しない場合は行idのみ指定)
putArray.push({
"id": receipts.value[i].id,
});
}
}
// PUTリクエストプロパティ(JSON)
var params = {
"app": 418,
"id": kintone.app.record.getId(), // 自レコード番号
"record": {
"receipts": putArray
}
};
画面リロードの件、こちらの処理は「app.record.detail.show」での実行でしたね。
無限ループしてしまいますので、一旦外してください。
根本からの見直しが必要になりますが
処理的に問題なければ「app.record.create.submit」「app.record.edit.submit」で実行した方が良いですね。
但し、同期処理が必要になりますので、kintone.Promiseまたはawait/asyncを使って、保存処理を待機する必要があります。
koichiさん
上記はこのような形になりますか?
添付写真のようにエラーが発生し、保存、更新ができません。
(function() {
"use strict";
kintone.events.on('app.record.create.submit',
'app.record.edit.submit',
async function(event) {
// アプリIDの取得
// レコード番号の取得
console.log(event);
// リクエストプロパティ(JSON)
var params = {
"app": 420,
"record": {
"日付": { "value": event.record.日付.value },
"計量機No": { "value": event.record.計量機No.value },
"連番": { "value": event.record.receipts.value[0].value.no.value },
"担当者1": { "value": event.record.担当者1.value },
"担当者2": { "value": event.record.担当者2.value },
"サイズ名": { "value": event.record.receipts.value[0].value.サイズ名.value },
"めっき種類": { "value": event.record.receipts.value[0].value.めっき種類.value },
"単重1A": { "value": event.record.receipts.value[0].value.単重1.value },
"単重2B": { "value": event.record.receipts.value[0].value.単重2.value },
"個数1A": { "value": event.record.receipts.value[0].value.個数.value },
"形態": { "value": event.record.receipts.value[0].value.形態.value },
}
};
// kintone REST API リクエスト ~ レコードの登録(POST)
kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params, function(resp) {
// POST成功
var putArray = [];
for (var i = 0; i < receipts.value.length; i++) {
if (i == 0) {
// 1行目にGETした値を更新(行idと更新したいフィールドのみ指定)
putArray.push({
"id": receipts.value[i].id,
"value": {
"単重計算後": {
"value": resp.record.単重計算後.value
}
}
});
} else {
// 2行目以降は更新しない(更新しない場合は行idのみ指定)
putArray.push({
"id": receipts.value[i].id,
});
}
}
// PUTリクエストプロパティ(JSON)
var params = {
"app": 418,
"id": kintone.app.record.getId(), // 自レコード番号
"record": {
"receipts": putArray
}
}; // kintone REST API リクエスト ~ レコードの更新(PUT)
kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function(resp) {
location.reload();
// PUT成功
}, function(error) {
// PUTエラー
});
}, function(error) {
// GETエラー
});
}, function(error) {
// POSTエラー
});
})();
G.Qさん
そちらのエラーは、edit.jsの258行目に「a」という変数が定義されていないというエラーですが
ひとまず以下を変更してみてください。
async/awaitを使用する場合は、各kintone.apiの前に「await」を付けることで同期処理になります。
「app.record.create.submit」「app.record.edit.submit」イベント内で処理する場合は、PUT処理は不要になります。
①POST
②GET
③テーブルの指定値を上書き
event.record.receipts.value[0].value.単重計算後.value = resp.record.単重計算後.value;
修正内容が二転三転してすみません。
koichiさん
上記直してみましたが、やはりうまくいきません。
POSTもできていないので、コードの書き方に誤りがあるのでしょうか。
こちらこそ、ながらくお付き合いいただき、ありがとうございます
(function() {
"use strict";
kintone.events.on('app.record.create.submit',
'app.record.edit.submit',
function(event) {
// アプリIDの取得
// レコード番号の取得
console.log(event);
// リクエストプロパティ(JSON)
var params = {
"app": 420,
"record": {
"日付": { "value": event.record.日付.value },
"計量機No": { "value": event.record.計量機No.value },
"連番": { "value": event.record.receipts.value[0].value.no.value },
"担当者1": { "value": event.record.担当者1.value },
"担当者2": { "value": event.record.担当者2.value },
"サイズ名": { "value": event.record.receipts.value[0].value.サイズ名.value },
"めっき種類": { "value": event.record.receipts.value[0].value.めっき種類.value },
"単重1A": { "value": event.record.receipts.value[0].value.単重1.value },
"単重2B": { "value": event.record.receipts.value[0].value.単重2.value },
"個数1A": { "value": event.record.receipts.value[0].value.個数.value },
"形態": { "value": event.record.receipts.value[0].value.形態.value },
}
};
// kintone REST API リクエスト ~ レコードの登録(POST)
await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', params, function(resp) {
// POST成功
var putArray = [];
for (var i = 0; i < receipts.value.length; i++) {
if (i == 0) {
// 1行目にGETした値を更新(行idと更新したいフィールドのみ指定)
putArray.push({
"id": receipts.value[i].id,
"value": {
"単重計算後": {
"value": resp.record.単重計算後.value
}
}
});
} else {
// 2行目以降は更新しない(更新しない場合は行idのみ指定)
putArray.push({
"id": receipts.value[i].id,
});
}
}
// PUTリクエストプロパティ(JSON)
var params = {
"app": 418,
"id": kintone.app.record.getId(), // 自レコード番号
"record": {
"receipts": putArray
}
};
event.record.receipts.value[0].value.単重計算後.value = resp.record.単重計算後.value;
/* // kintone REST API リクエスト ~ レコードの更新(PUT)
kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params, function(resp) {
location.reload();
});
*//* // PUT成功
}, function(error) {
// PUTエラー
});
*/
}, function(error) {
// GETエラー
});
}, function(error) {
// POSTエラー
});
})();