別アプリ参照のルックアップフィールドの更新に関しまして

お世話になっております。

日々こちらを参照しまして、kintoneのカスタマイズを行っておりますが、どうしても対応ができない部分がございまして、投稿させていただきました。

 

下記コードは2つのアプリをAとBにおいて、Aアプリでフィールド「serviceName」をBアプリのルックアップ先として、紐づけているフィールド2か所をAアプリが更新された場合にBアプリのルックアップ先も更新をしたいために、Aアプリに設定しているものになります。

【Aアプリ】を下記のように更新した場合に、

  • サービス名 : 自転車
  • 担当者①:1さん ⇒ 2さん
  • 担当者②:3さん ⇒ 4さん

【Bアプリ】も同じように担当者①と担当者②を更新したい。

  • サービス名 : 自転車(ルックアップ)
  • 担当者①:1さん ⇒ 2さん(フィールドコピー)
  • 担当者②:3さん ⇒ 4さん(フィールドコピー)

更新自体はレコードのサービス名を上書きすることで実施しております。

同期処理を加えていないためなのかがわからないのですが、一覧画面・詳細画面ともにsubmit.successの場合に動作しているにも関わらず、フィールドが更新されない場合あります。

この場合の解決方法に関してご教示いただけますと幸いです。

(function() {
‘use strict’;

kintone.events.on([‘app.record.edit.submit.success’, ‘app.record.index.edit.submit.success’], function(event) {

// 更新レコードからサービス名を取得
var serviceName = event[‘record’][‘serviceName’][‘value’];

// 「サービス名」を引渡して検索処理関数を実行
fetchRecords(serviceName);

});

function fetchRecords(serviceName) {

var appId = JINJI_APPID;

// 抽出条件 ⇒ 該当サービス名かつ在籍状況が「入社前または在籍」のレコード
var query = “ルックアップ_0 = "” + serviceName + “" and ラジオボタン in ("入社前","在籍") order by Record_number asc”;

// 抽出情報 ⇒ レコード番号, サービス名
var fields = [“$id”, “ルックアップ_0”];

// 検索条件
var params = {
‘app’ : appId
,‘query’ : query
,‘fields’ : fields
};

// 検索処理実行
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params, function(resp) {

// success
console.log(resp);

// 検索結果が1レコード以上ある場合、更新情報生成処理を実行
if(resp.records.length > 0) {
createUpdateRecords(appId, resp.records);
};

}, function(error) {

// error
console.log(error);

});

};

function createUpdateRecords(appId, records) {

// 更新用のレコード格納用配列
var afterRecords = [];

// 検索結果のレコード数分処理を実施
for (var i = 0; i < records.length; i++) {

// レコード情報を変数にセット
var newRecord = records[i];

// 更新対象のレコードのレコード番号とサービス名を配列に格納
afterRecords[i] = {
‘id’ : newRecord[‘$id’][‘value’]
,‘record’ : {
‘ルックアップ_0’ : {
value : newRecord[‘ルックアップ_0’][‘value’]
}
}

};

};

// アプリIDとレコード情報を引き渡し用のパラメータにセット
var params = {
‘app’ : appId
,‘records’ : afterRecords
};

// 更新対象が1レコード以上あれば更新処理を実施
if(afterRecords.length > 0) {
updateExecution(params);
};

};

/* 更新処理実行
* @param params 更新用のアプリIDとレコード情報
*/
function updateExecution(params) {

kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, params, function(resp) {

// success
console.log(resp);

}, function(error) {

// error
console.log(error);

});

};

})();

 

こんにちは、Yoshidaです。

Aアプリの結果でBアプリを操作する際は、Promiseを利用すると良いかと思います。

https://developer.cybozu.io/hc/ja/articles/215029846

こちらが参考になります。

Kazuhiro Yoshidaさん

 

コメントおよび参考ページ情報もありがとうございます。

やはりPromiseを利用するべきなのですね。

重ねての質問で申し訳ございませんが、今回のようにAPIとして、submit.successを利用した場合も

Promiseを利用して同期処理を行うようにしておくほうが、確実ということでしょうか?

むしろこの場合submit.successではなく参考ページのようにsubmitまでにしておいたほうがよろしいのでしょうか?

 

とはいえ、まずはPromiseを利用してのソースに変更してみたいと思います。

 

こんにちは。

https://developer.cybozu.io/hc/ja/articles/204537310-%E7%AC%AC11%E5%9B%9E-kintone-REST-API%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E6%9B%B4%E6%96%B0

こちらが参考になるかと思います。

Kazuhiro Yoshidaさん

 

類似例に関しての参考ページもありがとうございます。

ほぼ同じような動きをされているので、参考にしまして修正してみたいと思います。

 

ありがとうございます!