【追加質問】別アプリの値更新処理について(対象:キーの一致する複数レコード)

いつもお世話になっております。

『第11回 kintone REST APIを利用したレコード更新』を参考にコードを作成し、こちらの質問にてアドバイスをいただきやりたいことが実現できましたが、さらに機能を追加しようと色々試みたところ、また壁に当たってしまいました。

大変恐縮ですが、どなたかご教授頂けると幸いです。

何卒宜しくお願いいたします。


■やりたいこと(実現できたこと)

①アプリAの【_4月確認】(チェックボックス)の値を『済』にする。

②アプリBの更新対象レコード(アプリAで編集したレコードの「表示コード」と同じ表示コードが存在する複数レコードを取得する。

③②で取得した更新対象レコードの【_4月確認】(チェックボックス)の値を『済』にする。


■実現できないこと

④ アプリAの_4月確認の値(チェックボックス)が『済』ではない場合、アプリBの更新処理(「_4月確認」の値を『空白』にする)を実行する。

⑤他の月(4~3月)同様に同じ処理を実装したい。

※チェックボックスはアプリAB双方とも「_4月確認」「_5月確認」のように各月独立している。


■分からないこと

・④はif(event.record[‘_4月確認’].value === ‘済’){}~で値を判定し処理を実行させると思いますが、その場合の記述方法

・⑤のようにチェックボックスを独立させている場合、スマートなコード記述方法がないか

(function() {
"use strict";

// アプリBのアプリID
var updateAppId = 11;


function checkBoxCheck(records) {

var putRecords = [];
for (var i = 0, l = records.length; i < l; i++) {
var record = records[i];
putRecords[i] = {
id: record.$id.value,
record: {
"_4月確認": {
value: ["済"]
}
}
};
}
return putRecords;
}


//保存成功後イベント
kintone.events.on(['app.record.edit.submit.success', 'app.record.index.edit.submit.success'], function(event) {
var hyouji = event.record["定期清掃表示コード"].value;



// レコードの一括取得(100件まで)
var paramGet = {
"app": updateAppId,
"query" : "定期清掃表示コード = " + hyouji
};
console.log(paramGet);
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', paramGet).then(function(resp) {

// アプリB対象レコードの更新
var records = resp.records;
var token = "9IoKNgv3H6IeUx7BPVb8UoVEjwP5jCRTmA8nKVJh";
var header = {
"X-Cybozu-API-Token": token,
"Content-Type": "application/json"
};
var paramPut = {
'app': updateAppId,
'records': checkBoxCheck(records)
};
return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', paramPut);

}).then(function(resp2) {

// 処理成功
alert('4月確認の一括チェックが完了しました。');
console.log(resp2);
return event;

}).catch(function(error) {

// エラー表示をする
alert('4月確認の一括チェックでエラーが発生しました。' + error.message);
console.log(error);
return event;

});

});

})();

 

編集しているレコードの、例えば「_4月確認」のチェックボックスの値('済み’か空欄か)を他レコードに更新したいということでしたら条件分岐は不要かと思います。
(他にも値が設定されていた場合は条件分岐が必要になるかもしれませんが)

上記動き、かつ複数のチェックボックスの値を処理する場合は以下のようにします。

// アプリBのアプリID
var updateAppId =11;
functioncheckBoxCheck(records) {
var putRecords = [];
for (vari =0, l = records.length; i < l; i++) {
var record = records[i];
putRecords[i] = {
id: record.$id.value,
record: {
"_4月確認": {
value: ["済"]
}
}
};
}
return putRecords;
}

↓上記部分を以下に書き換える

// アプリBのアプリID
var updateAppId = 11;

// チェックするフィールドコード
var checkList = ["_4月確認", "_5月確認", "_6月確認"]; // 更にある場合は適宜追加する

function checkBoxCheck(records) {
var putRecords = [];
for (var i = 0, l = records.length; i < l; i++) {
var record = records[i];
putRecords[i] = {
id: record.$id.value,
record: {}
};
for (var j in checkList){
putRecords[i].record[checkList[j]] = {
value: record[checkList[j]].value
};
}
}
return putRecords;
}

FM様

コメントありがとうございます!

ご指摘いただいたコードを反映させてみましたが、残念ながら値が反映されませんでした。

console.logで調べたところ、アプリAのチェックボックスに『済』が入っていても、取得出来ていませんでした。

 

おそらく、アプリAとアプリBで連動するチェックボックスのフィールドコードが一致していないことが影響していると考えられます。

大変申し訳ございませんでした。

 

アプリA:_4月確認_定期,_5月確認_定期,_6月確認_定期、

アプリB:_4月確認,_5月確認,_6月確認,

 

ただ、ここから先をどうしたら良いか、知識不足のため解決できません。

大変お手数ですが、再度ご教授頂けると幸いです。

宜しくお願いいたします。

 

動作確認はしていませんが以下の様になるかと。
アプリA,Bそれぞれのフィールドコードを配列で指定して、forで回して各レコードの情報取得・代入をしています。

(function () {
"use strict";
// アプリBのアプリID
var updateAppId = 11;
var setValue = {};

// アプリAのフィールドコード
var aCheckList = ["_4月確認_定期", "_5月確認_定期", "_6月確認_定期"];
// アプリBのフィールドコード、aCheckListと値の数・順番を合わせる
var bCheckList = ["_4月確認", "_5月確認", "_6月確認"];

function checkBoxCheck(records) {
var putRecords = [];
for (var i = 0, l = records.length; i < l; i++) {
var record = records[i];
putRecords[i] = {
id: record.$id.value,
record: {}
};
for (var j in bCheckList){
putRecords[i].record[bCheckList[j]] = {
value: setValue[aCheckList[j]]
};
}
}
return putRecords;
}
//保存成功後イベント
kintone.events.on(['app.record.edit.submit.success', 'app.record.index.edit.submit.success'], function (event) {

var hyouji = event.record["定期清掃表示コード"].value;
// レコードの一括取得(100件まで)
var paramGet = {
"app": updateAppId,
"query": "定期清掃表示コード = " + hyouji
};

for(var k in aCheckList){
setValue[aCheckList[k]] = event.record[aCheckList[k]].value;
}

console.log(paramGet);
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', paramGet).then(function (resp) {
// アプリB対象レコードの更新
var records = resp.records;
var token = "9IoKNgv3H6IeUx7BPVb8UoVEjwP5jCRTmA8nKVJh";
var header = {
"X-Cybozu-API-Token": token,
"Content-Type": "application/json"
};
var paramPut = {
'app': updateAppId,
'records': checkBoxCheck(records)
};
return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', paramPut);
}).then(function (resp2) {
// 処理成功
alert('4月確認の一括チェックが完了しました。');
console.log(resp2);
return event;
}).catch(function (error) {
// エラー表示をする
alert('4月確認の一括チェックでエラーが発生しました。' + error.message);
console.log(error);
return event;
});
});
})();

FM様

やりたいことが実現できました!!!!!!!!!!

本当にありがとうございます!!!!!

 

現在javascriptを一から勉強中で、まだまだkintoneの配列を思い通りに操作できないでおりましたが、

頂いたアドバイスのおかげで色々見えてきたものがありました!

 

また何かありましたらご相談させていただけたらと思いますので、

その際にはご指導いただけると幸いです。

 

本当にありがとうございました!!!!!

FM様

 

以前ご教示いただいた上記コードですが、実際の運用にのせたところ、予期せぬ挙動が出てしまいました。

よろしければ、またお知恵をお貸しいただければと思います。

 

■現状

・上記の保存後実行イベントは、現状どのユーザーでも有効となっているが、

アプリAのフィールドコード aCheckList と

アプリBのフィールドコード bCheckList のフィールドには、

標準機能で特定のユーザー(user1,user2,user3)以外は編集不可にしている。

 

・この状況で特定のユーザー以外の方がレコード編集後、保存ボタンを押すとエラーが出てしまう。

 

■やりたいこと

・特定のユーザー(user1,user2,user3)が編集した場合のみ、上記コードが実行されるようにしたい。

 

お忙しいところ恐れ入りますが、アドバイスの程宜しくお願いいたします。

// レコードの一括取得(100件まで)
の前に、ログインユーザーの情報を取得してログインID等を判定して頂ければ実現可能かと思います。

ログインユーザーの情報を取得する のAPIを使ってみてください。

FM様

返信ありがとうございます。

こんな感じでコードを追加しましたが、動いていないようです。

developerツールで見てもエラーが出ていないので、そもそも記述が間違っているのか、記述箇所が間違っているのか

判定できません。

お手数ですがアドバイスをお願いいたします。

  // 保存成功後イベント

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

    var user = kintone.getLoginUser();

    if (user.code === 'user1' && user.code === 'user2' && user.code === 'user3') {

      var hyouji = event.record['定期清掃表示コード'].value;

      // レコードの一括取得(100件まで)

      var paramGet = {

        'app': updateAppId,

        'query': '定期清掃表示コード = ' + hyouji

      };

      for (var k in aCheckList) {

        setValue[aCheckList[k]] = event.record[aCheckList[k]].value;

      }

      console.log(paramGet);

    

      return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', paramGet).then(function(resp) {

        // アプリB対象レコードの更新

        var records = resp.records;

        var token = '9IoKNgv3H6IeUx7BPVb8UoVEjwP5jCRTmA8nKVJh';

        var header = {

          'X-Cybozu-API-Token': token,

          'Content-Type': 'application/json'

        };

        var paramPut = {

          'app': updateAppId,

          'records': checkBoxCheck(records)

        };

        return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', paramPut);

      }).then(function(resp2) {

        // 処理成功

        alert('一括チェックが完了しました。');

        console.log(resp2);

        return event;

      }).catch(function(error) {

        // エラー表示をする

        alert('一括チェックでエラーが発生しました。' + error.message);

        console.log(error);

        return event;

      });

    }

    });

})();
if (user.code === 'user1' && user.code === 'user2' && user.code === 'user3') {

上記部分ですが、&&で繋げてしまうと「user.codeがuser1かつuser2かつuser3の時」となってしまうので、常にfalseの判定になります。

if (user.code === 'user1' || user.code === 'user2' || user.code === 'user3') {

としてみてください。

FM様

返信ありがとうございます。

おかげで無事解決することができました!!

ありがとうございます!!助かりました。

 

ただ、ものすごく初歩的なミスで、気づけなかった自分が恥ずかしいです。。。

今後ともよろしくお願いいたします!!