指定したフィールドの文字結合を行いたいと考えております。
様々なWEBのページを参考にしJavascriptをいじっているのですが、なかなか実装できずにいます。
やりたいことは下記の通りです。
FirstName
LastName
NickName
というフィールドがあります。
FirstName & " "& LastName & “|” & NickName
というような文字結合を行いたいのですが、
NickNameは使用する際とそうでない場合とがあるため
NickNameが入力されている場合にのみ
“|” と NickName
が文字結合されるようにしたいです。
方法をご存知の方がいらっしゃいましたら、方法をご教授頂けないでしょうか。
ken-ikezakiさん、こんにちは。
プロジェクト・アスノートの松田です。
現在、うまくいっていないJavaScriptのソースと、エラー等の情報をいただければ、
より具体的な問題点と、改善のアドバイスができるかと思います。
よろしくお願いします。
松田さん
ご返信ありがとうございます。
今、他の方の投稿を参考に試しに下記のようにjavascriptを組んでいるのですが、
現状、エラーは出ないのですが"employee_name"に文字が結合されない状態になっております。
また、この先、 “|” と NickName が条件によって文字結合されるためにはどのように変更すれば良いでしょうか?
(function() {
“use strict”;
var fields = [
{ to: ‘employee_name’, from: [‘FirstName’,‘LastName’,‘Nickname’], sep: ‘-’ },
// { to: ‘employee_name’, from: [‘FirstName’,‘LastName’,‘Nickname’], sep: ‘’ }
];
// 追加、編集画面表示イベント
kintone.events.on([‘app.record.create.show’,‘app.record.edit.show’,‘app.record.index.edit.show’], function (event) {
var record = event.record;
for (var i = 0; i < fields.length; i++) {
record[fields[i].to].disabled = true;
}
return event;
});
// text change イベント
var changeType = {};
for (var i = 0; i < fields.length; i++) {
for (var j = 0; j < fields[i].from.length; j++) {
changeType[‘app.record.create.change.’ + fields[i].from[j]] = i;
changeType[‘app.record.edit.change.’ + fields[i].from[j]] = i;
changeType[‘app.record.index.create.change.’ + fields[i].from[j]] = i;
changeType[‘app.record.index.edit.change.’ + fields[i].from[j]] = i;
}
}
var changeEvents = Object.keys(changeType);
kintone.events.on(changeEvents, function(event) {
var record = event.record;
var pno = changeType[event.type];
var to = fields[pno].to;
var sep = fields[pno].sep;
record[to].value = concatText(fields[pno].from, sep);
return event;
function concatText(pArray, pSeparator) {
var str = ‘’;
for (var i = 0; i < pArray.length; i++) {
if (record[pArray[i]].value) {
if (str) {
str += pSeparator;
}
str += record[pArray[i]].value;
}
}
return str;
}
});
})();
ken.ikezakiさん
こんにちは。
配列を用いているのは、フィールドの指定を汎用化させようということですかね?
今回のケースのようにフィールドが分かっていて固定できるのであれば、
各フィールドのイベントは、普通に書いた方がわかりやすいと思います。
kintone.events.on( [
'app.record.create.change.FirstName',
'app.record.create.change.LastName',
・・・・(各フィールドの新規レコード追加/編集画面での値変更イベント)・・・
'app.record.edit.change.NickName'
], function(event) {
全体構造は、こちらのドキュメントを参考に
- event.recordから各フィールドの値を取り出して
(record[‘fieldcode’][‘value’])
- それを結合する処理
- 反映(目的フィールドの値を書き換えて、eventオブジェクトをreturn)
2の値の結合は、変数(例えばName)に、順番に追加していく(+=演算子)
フィールドの有無による条件分岐は、シンプルにif文で次のような感じで良いと思います。
// Nameという変数にFirstName & " "& LastName があるとして、NickNameフィールドにデータがあるときだけ追記
if(record.NickName.value){
Name += "|"+ record['NickName']['value'];
}
参考になりますでしょうか。
松田さん
javascript初心者の私でもとても分かりやすいご回答誠にありがとうございます。
ご指摘の通り、配列を用いているのは汎用化させたいという考えからでした。
追加での質問で大変恐縮なのですが、
employee_name というフィールドにIF文で文字結合されたものを反映させたい場合、
どのようにjavascriptを作成すれば良いでしょうか。
下記のように組んでみたのですが、うまく反映されませんでした。
何か改善策ございましたらご教授頂けませんでしょうか?
kintone.events.on( [
'app.record.create.change.FirstName',
'app.record.create.change.LastName',
'app.record.edit.change.NickName'
], function(event) {
var record = event.record;
var lastname = record.LastName.value;
var firstname = record.FirstName.value;
var nickname = record.NickName.value;
var fullname = record.employee_name.value;
employee_name = FirstName + " " + LastName
// fullnameという変数にFirstName & " "& LastName があるとして、NickNameフィールドにデータがあるときだけ追記
if(record.NickName.value){
fullname += "|"+ record.NickName.value;
}
})();
ikezakiさん
ドキュメントに記載のある、
「record オブジェクトのフィールドの値を書き換えて event オブジェクトを return した場合、その値でフィールドの値を更新します。」
の中の、eventオブジェクトをreturnする、という処理が抜けていますね。
下記リンクのサンプルにもあるように、return eventを最後に入れてあげる必要がありますね。
これで、書き換えた値が反映される、という理解でいいと思います。
https://developer.cybozu.io/hc/ja/articles/202166270-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E7%B7%A8%E9%9B%86%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88
松田さん
ご指摘ありがとうございます!
早速、以下のように設定してみたのですが、やはり
employee_name に反映されない状態になっております。
何か他に問題点等ございますでしょうか?
kintone.events.on( [
'app.record.create.change.FirstName',
'app.record.create.change.LastName',
'app.record.edit.change.NickName'
], function(event) {
var record = event.record;
var lastname = record.LastName.value;
var firstname = record.FirstName.value;
var nickname = record.NickName.value;
var fullname = record.employee_name.value;
employee_name = FirstName + " " + LastName;
// fullnameという変数にFirstName & " "& LastName があるとして、NickNameフィールドにデータがあるときだけ追記
if(record.NickName.value){
fullname += "|"+ record.NickName.value;
return event;
}
})();
ikezakiさん
変数というのは、JavaScriptのプログラムの中だけで取り扱う、データの入れ箱です。
最終的に反映させたい値を、変数をうまく使って作り上げていく必要があります。
fullnameという変数であれば、その変数の中身が最終的に、 FirstName & " "& LastName & “|” & NickName
となるように、ロジックが組まれていないといけません。
現状では、最終的に必要な値がきちんと作られていないと思いますので、
- fullnameに FirstName + " " + LastName を入れる
- そこにNickNameがあるときだけ、 “|” + NickName を追記
となっているか、再度見直してみてください。
そして、
「record オブジェクトのフィールドの値を書き換えて event オブジェクトを return した場合、その値でフィールドの値を更新します。」
の「record オブジェクトのフィールドの値を書き換えて 」という部分の処理が抜けています。
最終結果が入った変数を、record.employee_name.value に入れてあげる必要がありますね。
松田さん
お忙しい中ご回答いただきありがとうございます。
ご指摘通り再度見直して変更したところ、無事設定できました。
松田さんが丁寧に解説してくださったおかげです。
本当にありがとうございました。