https://developer.cybozu.io/hc/ja/articles/203030394
こちらの記事を元にコードを作成してみましたが、どうしてもうまくいきません。どこがおかしいかご教授いただけると助かります。
【運用内容】
・ゲストスペースで運用を考えております。
→ゲストスペースIDは「35」
・関連レコード参照先のマスタアプリ「アプリA」
・関連レコード一覧を表示させるアプリ「アプリB」
・関連レコード一覧のフィールドコード「関連レコード一覧」
・表示するレコードの条件:「会場名_開催日」=「会場名_開催日」
・集計したい文字:「申込結果」フィールドの「OK」の数
※他にも「NG」「見込」の数も集計したいです
・集計した数を登録する文字フィールド:「加盟社数」
※「NG」「見込」の数も「フィールドA」「フィールドB」に登録したいです
以上の運用を考えております。
素人でうまく表現できていないところもあると思いますが何卒お力添え宜しくお願い致します。
(function() {
"use strict";
var events = ['app.record.create.submit.success', 'app.record.edit.submit.success','app.record.index.edit.submit.success']
kintone.events.on(events, function(event) {
var record = event.record;
var related = kintone.app.getRelatedRecordsTargetAppId('関連レコード一覧');
return kintone.api(kintone.api.url('/k/guest/35/v1/records', true), "GET", {
app: related,
totalCount: true,
query: '会場名_開催日 ="' + record.会場名_開催日.value + '" and 申込結果 in ("OK")'
}).then(function (res) {
return kintone.api('/k/guest/35/v1/record', 'PUT', {
"app":kintone.app.getId(), //マスタのアプリID
"updateKey": {
"field": "会場名_開催日",
"value": record.会場名_開催日.value
},
"record": {
"加盟社数": {
"value": res.totalCount
}
}
});
}).then(function () {
return events;
});
});
})();
大ちゃん様
お世話になっております。
cstapの江田と申します。
どこが一番の問題かは分かりませんが、気になった点を書きます。
kintone.app.getId()の横にコメントで「マスタのアプリID」とありますがJavaScriptを読み込ましているのはアプリAなのですか?
kintone.app.getRelatedRecordsTargetAppId()を利用しているのでアプリBで読み込ませるコードな気もしますが…
https://developer.cybozu.io/hc/ja/articles/201942014#step7
アプリAで読み込ませるコードであれば、
GETでのappはkintone.app.getId()、PUTでのappはアプリBのアプリIDを数字で直打ちすることになると思います。
アプリBで読み込ませるコードであれば、
「success」イベントではなく単純に「submit」イベントで処理すれば、REST APIでPUTせずともeventオブジェクトを書き換えreturnするだけで加盟社数を書き換えられます。
https://developer.cybozu.io/hc/ja/articles/201941984#step2
kintone.api.url()で第2引数をtrueにした場合は、第1引数で「/guest/**」を含める必要はありません。
https://developer.cybozu.io/hc/ja/articles/202166310#step2
最後returnするのはeventsではなくeventだと思います。
沢山ご指摘ありがとうございます!
その後自分なりにいろいろいじってみたところ、上記のご指摘通りの修正で作成できました。
下記のようなコードで作成しました。
(function() {
"use strict";
//レコードの編集、詳細画面で適用する
var events = [
'app.record.detail.submit',
'app.record.edit.submit',
'app.record.index.edit.submit'
]
kintone.events.on(events, function(event) {
var record = event.record;
var client_rid = event.recordId;
var related = kintone.app.getRelatedRecordsTargetAppId('関連レコード一覧');
var offset = 0;
var loop_end_flg = false;
var records = new Array();
while(!loop_end_flg){
var query = '会場名_開催日 ="' + record['会場名_開催日'].value +
'" and 申込結果 in ("OK")' +
' limit 100 offset ' + offset;
query = encodeURIComponent(query);
var appUrl = kintone.api.url('/k/guest/35/v1/records') + '?app='+ related + '&query=' + query;
// 同期リクエストを行う
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", appUrl, false);
xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
xmlHttp.send(null);
//取得したレコードをArrayに格納
var resp_data = JSON.parse(xmlHttp.responseText);
if(resp_data.records.length > 0){
for(var i = 0; resp_data.records.length > i; i++){
records.push(resp_data.records[i]);
}
offset += resp_data.records.length;
}else{
loop_end_flg = true;
}
}
var amount = records.length;
record.加盟社数.value = amount;
return event;
});
})();
・アプリA、アプリBそれぞれ参照条件にすフィールド名を「会場名_開催日」に変更
・関連レコードの「申込結果」というフィールドにある「OK」だけをカウント
・カウント結果を「加盟社数」というフィールドに追加。
以上で完成いたしました。
別の質問です。
関連レコードなのでどうしてもマスタ側のデータが更新された場合、集計数に誤差が出るため都度、再保存を手動で行っております。
このような動的なデータに合わせてレコードの自動更新を実装することは可能でしょうか?
もしくは、一覧画面上に「一括更新」というようなボタンを付けてもいいかなと思っておりましたがうまく実装できずにおります。
是非お知恵を宜しくお願い致します!