フィールド間のコピー

ボタンをクリックして、TEST1のフィールドの値をTEST2のフィールドへコピーしたいです。

こちらこちらを見ながらどうにかTEST1のフィールドの値を取得するところまでは出来たのですが、取得した値をTEST2のフィールドへ入れる書き方が分かりません。本来は複数の値をコピーするつもりですが、一つもできないので先に進めない状況です。

超初心者です。ご教授頂けますと幸いです。

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

ーーーーーーーーーーーーーーーーーーーー

(function() {
“use strict”;
kintone.events.on(‘app.record.detail.show’, function(event) {
var mySpaceFieldButton = document.createElement(‘button’);
mySpaceFieldButton.id = ‘copy_button’;
mySpaceFieldButton.innerHTML = ‘copy’;
mySpaceFieldButton.onclick = function () {

var fieldValue = ‘’;
var rec = kintone.app.record.get();
if (rec) {
fieldValue = rec.record.test1.value;
}
record.test2.value = fieldValue; ←ココがうまくいきません
}
kintone.app.record.getSpaceElement(‘my_space_field’).appendChild(mySpaceFieldButton);
});
})();

ーーーーーーーーーーーーーーーーーーーー

山崎さん、こんにちは。

考え方を含めてお答えします。

レコードの値の取得が「kintone.app.record.get」で実現できていますね。
同じように値のセットができるAPIがないか、 JavaScript APIの一覧 から探してみてください。

「値の取得」の下に「値のセット」(kintone.app.record.set)が見つかるかと思います。

kintone.app.record.set の詳細を確認してみると、利用できる画面は下記となっています。

  • レコード追加
  • レコード編集

山崎さんのコードでは、レコード詳細画面(‘app.record.detail.show’)で動くように書かれているので、
「kintone.app.record.set」を使うことはできません。

※copyボタンをレコード詳細画面ではなくレコード追加・編集画面で使いたい、ということでしたらこのAPIが使えます。
具体的なサンプルコードはこのコメントの最後に記載してあります。

 

他の方法を探してみましょう。
JavaScript APIの一覧には、他にフィールド値を更新できそうなものがないので、REST APIの一覧 を確認してみます。
レコード(1件) 更新 が使えそうです。(REST API 一覧(レコード)の3行目)

レコードの更新(1件)のページを開き、「JavaScriptサンプル」という項目を確認してください。サンプルコードが載っています。

var body = {
"app": 1,
"id": 1001,
"record": {
"文字列__1行": {
"value": "ABC"
}
}
};

kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body, function(resp) {
// success
console.log(resp);
}, function(error) {
// error
console.log(error);
});

bodyという変数の中に、対象レコードの情報を入れて渡していますね。(詳細はドキュメントを読んでください)
アプリID、レコードID、更新するフィールド名とその値が指定されているので、自分の環境に合わせて書き換えてください。
※アプリIDとレコードIDは、それぞれ取得するAPIがあるのでJavaScript APIの一覧 から探してみてください。

これでレコードの値を更新できます。が、今開いている画面は自分でリロードしないと表示が変わらない、という状態になりますので、
更新できたら画面のリロード処理も入れてあげてください。

(function() {
"use strict";
kintone.events.on(['app.record.detail.show'], function(event) {
var mySpaceFieldButton = document.createElement('button');
mySpaceFieldButton.id = 'copy_button';
mySpaceFieldButton.innerHTML = 'copy2';
mySpaceFieldButton.onclick = function() {

var fieldValue = '';
var rec = kintone.app.record.get();
if (rec) {
fieldValue = rec.record.test1.value;
}

var body = {
"app": kintone.app.getId(),
"id": kintone.app.record.getId(),
"record": {
"test2": {
"value": fieldValue
}
}
};

kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body, function(resp) {
// success
console.log(resp);
location.reload(true); // 画面をリロード
}, function(error) {
// error
console.log(error);
});

}
kintone.app.record.getSpaceElement('my_space_field').appendChild(mySpaceFieldButton);
});
})();

 

なお、レコード編集中にボタン操作で値を反映したいという場合のサンプルは下記のとおりです。
レコード追加画面の表示イベント編集画面の表示イベントを利用して kintone.app.record.set で値の書き換えができます。

(function() {
"use strict";
kintone.events.on(['app.record.edit.show', 'app.record.create.show'], function(event) {
var mySpaceFieldButton = document.createElement('button');
mySpaceFieldButton.id = 'copy_button';
mySpaceFieldButton.innerHTML = 'copy';
mySpaceFieldButton.onclick = function() {

var fieldValue = '';
var rec = kintone.app.record.get();
if (rec) {
fieldValue = rec.record.test1.value;
}
rec.record.test2.value = fieldValue;
kintone.app.record.set(rec);
}
kintone.app.record.getSpaceElement('my_space_field').appendChild(mySpaceFieldButton);
});
})();

 

たまごさん、分かりやすくご丁寧なご説明ありがとうございます!

kintone.app.record.set、気になっており、コードの中に入れて
こねくり回してみたりしていました。

またapp.record.detail.show←が違うのかなと思いedit.showやcreate.showなども試していたおですが、根本的な認識が甘かったです。

レコードとフィールドの認識が曖昧で、record=フィールド?ん?いや違うのか?、とはっきりしないままやっており、
アプリID、レコードID、フィールド、をちゃんと指定してあげないといけないことに気付けませんでした。

まだ他の方のコードのコピペして弄る程度のレベルですが、
たまごさんに頂いたサンプルコードをしっかり物にしたいと思います。

リロード処理のオマケもありがとうございます!
今後ともよろしくお願い致します。

 

横から失礼致します。

このケースですと、TEST2のフィールドにコピーされた文字列を編集することも可能でしょうか?

flowersさん

はい、上のコメントのコードだと編集可能になっています。

TEST2フィールドを編集不可にしたいのなら、編集するときのイベントでフィールドを編集不可の制御をすることができます。
イベントのドキュメントで「フィールドの値に応じた制御」という項目に
「フィールドの編集可/不可を設定する」が書かれていたら、そのイベントでフィールド編集の可否を変更できます。

レコードを編集するときに特定のフィールドだけ編集不可にしたいのであれば、下記イベントが対象となります。

各イベントの説明を読んでいくと、「フィールドの値に応じた制御」に
「フィールドの編集可/不可を設定する をご参照ください。」と書かれていると思うので、リンク先()を見てみてください。

サンプルに書かれている通り、フィールドの disabled に true を設定して return することでフィールドを編集不可にできます。

 

test2フィールドを編集不可にするなら、こんな感じですね。

(function () {
"use strict";
var editEvents = [
'app.record.create.show',
'app.record.edit.show',
'app.record.index.edit.show'
];
kintone.events.on(editEvents, function (event) {
var record = event.record;
record['test2'].disabled = true;
});
return event;
})();

 

たまごさん

ありがとうございます!編集可能としたいので、上の例を参考にしてみます。