複数フィールドへのPUT更新について

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

【実現したいこと】

kintoneの一覧画面上で、「更新ボタン」を押下したときに

2つのフィールドに書かれている値をルックアップフィールドに反映させたいです。

「ルックアップ_0」のフィールドには反映できるところまで確認が取れました。

下記URLを参考に2つのフィールドを設定したつもりですが、うまくPUTできません。

https://developer.cybozu.io/hc/ja/community/posts/115010503666–%E7%B7%8A%E6%80%A5-PUT%E5%AE%9F%E8%A1%8C-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E5%88%A9%E7%94%A8-%E8%A4%87%E6%95%B0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E5%A4%89%E6%9B%B4-

 

(function() {
“use strict”;

function createPutRecords(records) {
//var record = event.record;
//console.log(records);
let putRecords = [];
for (var n = 0, l = records.length; n < l; n++ ) {
let record = records[n];
//console.log(record);

let tagID = record[‘文字列_複数行_’].value;
//console.log(tagID);

const number =tagID.slice(-10).replace(/[^0-9]/g,“”);

console.log(number);//ここまでOK

putRecords[n] = {

id:record.$id.value ,

record: {
‘ルックアップ_0’:{
value: number ,
lookup: {
//value: record[‘ルックアップ_0’].lookup.value = number
value: number

}
}
}
};
}

for (var j = 0, k = records.length; j < k; j++ ) {
let record2 = records[j];
//console.log(record2);

let LookUpNumber = record2[‘文字列__1行__4’].value;
console.log(LookUpNumber);

putRecords[j] = {  

id:record2.$id.value ,

record2: {
‘ルックアップ’:{
value: LookUpNumber ,
lookup: {
value: LookUpNumber

}
}
}
};
}

console.log(putRecords);
return putRecords;

}

kintone.events.on(‘app.record.index.show’, function(event) {
var oldButton = document.getElementById(‘updateButton’);
if(oldButton !== null) oldButton.parentNode.removeChild(oldButton);
var button = document.createElement(‘button’);
button.innerHTML = ‘update’;
button.id = ‘updateButton’;
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
button.addEventListener(‘click’, function() {

var records = event.records;
var Put_param = {‘app’: 1173,
‘records’: createPutRecords(records)};

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

// 処理成功
alert(‘ルックアップの更新が完了しました!’);
location.reload();
return event;

}).catch(function(error) {

// エラー表示をする
alert(‘ルックアップの更新でエラーが発生しました。’ + error.message);
return event;

});
});

});
})();

 

record2のみが反映されている状態となります。

初心者な質問で大変恐縮ではございますが、ご教示いただけますと幸いです。

何卒よろしくお願い申し上げます。

見た限りで気になった部分をコメントアウトして書き換えました(申し訳ありません検証はしていません)。2つのリクエストボディで更新するレコードが重複せず、更新するレコードが100件まで(kintoneの標準上限:これ以上を更新する場合@kintone/rest-api-client等を使うのが良いでしょう)の前提です。

最初に宣言している「putRecords」は配列というもので、配列の同じ位置(インデックス番号)に0から始まるループでリクエストボディを2つ書いているため、後に記載したrecord2が最初に記載したrecordを上書き(再代入)し、record2しか更新されない状態と思われます。この場合はpushを使うと良いでしょう。

(function() {
"use strict";

function createPutRecords(records) {
let putRecords = [];

for (var n = 0, l = records.length; n < l; n++ ) {
let record = records[n];
let tagID = record['文字列_複数行_'].value;
const number =tagID.slice(-10).replace(/[^0-9]/g,"");

console.log(number);

// putRecords[n] = {
putRecords.push({
id:record.$id.value,
record: {
'ルックアップ_0': {
value: number,
/* lookup: {
value: number
} こちらは必要ないと思います*/
}
}
});
// };
};

for (var j = 0, k = records.length; j < k; j++ ) {
let record2 = records[j];
let LookUpNumber = record2['文字列 __1行__ 4'].value;

console.log(LookUpNumber);

// putRecords[j] = {
putRecords.push({
id:record2.$id.value,
// record2: {
record: {
'ルックアップ': {
value: LookUpNumber,
/* lookup: {
value: LookUpNumber
} こちらは必要ないと思います*/
}
}
});
// };
};

return putRecords;
};

kintone.events.on('app.record.index.show', function(event) {
var oldButton = document.getElementById('updateButton');

if(oldButton !== null) oldButton.parentNode.removeChild(oldButton);

var button = document.createElement('button');

button.innerHTML = 'update';
button.id = 'updateButton';
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
button.addEventListener('click', function() {
var records = event.records;
var Put_param = {
'app': 1173,
'records': createPutRecords(records)
};

return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', Put_param).then (function(resp) {
alert('ルックアップの更新が完了しました!');
location.reload();
return event;
}).catch(function(error) {
alert('ルックアップの更新でエラーが発生しました。' + error.message);
return event;
});
});
});
})();

mls-hashimoto様

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

ご丁寧にコメントを頂戴いたしまして有難うございます。

説明足らずで申し訳ございません。更新するレコードが重複しております。

いただきましたコードで記述いたしましたところ、重複しているため更新できないとエラーが帰ってきました。

一旦は苦肉の策でボタンを二つ設けて別々に処理を行うことといたしました。

 

可能であれば、ご教示いただきたいのですが1つのボタンで重複するレコード内の別フィールドの更新処理を行う場合

どのような記述を行えばよいのでしょうか。初心者な質問で申し訳ございません。

質問ばかりで大変恐縮でございますが、何卒よろしくお願い申し上げます。

湊 知央 さま

申し訳ありません。idによる更新とupdateKeyによる更新とで少し勘違いをしていました。

以下で可能と思います。1つのリクエストボディに2つのルックアップフィールドを記述することで可能です。

(function() {
"use strict";

function createPutRecords(records) {
let putRecords = [];

for (var i = 0; i < records.length; i++) {
let tagId = records[i]['文字列_複数行_'].value.slice(-10).replace(/[^0-9]/g, '');
let lookUpNum = records[i]['文字列 __1行__ 4'].value;
let putRecord = {
'id': records[i]['$id'].value,
'record': {},
};

if (tagId) {
putRecord.record['ルックアップ_0'] = {
'value': tagId
};
}
if (lookUpNum) {
putRecord.record['ルックアップ'] = {
'value': lookUpNum
};
}

putRecords.push(putRecord)
};

return putRecords;
};

kintone.events.on('app.record.index.show', function(event) {
var oldButton = document.getElementById('updateButton');
var button = document.createElement('button');

if(oldButton !== null) oldButton.parentNode.removeChild(oldButton);

button.innerHTML = 'update';
button.id = 'updateButton';
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
button.addEventListener('click', function() {
var Put_param = {
'app': 1173,
'records': createPutRecords(event['records'])
};

return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', Put_param).then(function(resp) {
alert('ルックアップの更新が完了しました!');
location.reload();
}).catch(function(error) {
alert('ルックアップの更新でエラーが発生しました。' + error.message);
});
});
});
})();

mls-hashimoto様

お世話になります。

ご丁寧にコードまで記述いただきまして誠に有難うございます。

おかげ様で意図通りの動作を行うことができました!

お忙しいところ、誠に有難うございます!

引き続き、何卒よろしくお願い申し上げます。