文字列の結合について

指定したフィールドの文字列を結合したいと考えています。

各WEBページを参考にJavascriptの作成を試みたものの

入力内容を取得し対象のフィールドで入力させる事すらもできず難航しております…。

 

文字列A

文字列B

文字列C

 

文字列D=文字列A+文字列B+文字列C

 

にしたいと考えています。

 

ただ文字列Aが空白だったり、文字列BとCが空白だったりとその時々によって異なる為、フォームの自動計算ではエラーになるのでJavascriptで構築したいと考えています。

 

文字列Aが空白の場合は

文字列D =文字列B+文字列C

文字列BとCが空白の場合は

文字列D = 文字列A

※初期値を空白にして自動計算とも考えましたが文字列Aはルックアップで取得した文言の為、初期値を設定する事はできませんでした。

 

初歩的な質問ではございますがお力添えいただけますと幸いです。

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

Toshi さん

下記コードで、連結できると思います。
フィールドコードやセパレータをアプリに合わせて変更してください。

(function() {
"use strict";

var fields = [
{ to: '文字列D', from: ['文字列A','文字列B','文字列C'], sep: '-' },
// { to: '文字列D1', from: ['文字列A1','文字列B1','文字列C1','文字列C2'], 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;
}

});
})();

 

rex0220さま

 

早速の回答有難う御座います。

結合時の記号や細かい設定まで組み込んでいただき有難う御座います。

試してみたところ問題なく実装する事ができました!

 

6列目に

// { to: '文字列D1', from: ['文字列A1','文字列B1','文字列C1','文字列C2'], sep: '' }

とありますが、例えば

{ to: ‘文字列AAA’, from: [‘文字列A’,‘文字列B’], sep: ‘-’ },
{ to: ‘文字列BBB’, from: [‘文字列A’,‘文字列B’,‘文字列C’], sep: ‘-’ },

上記のように文字列Aと文字列B同じものをそれぞれ違う文字列に結合する事は可能なのでしょうか。

度重なる質問で申し訳ございません。

 

宜しくお願い致します。

>上記のように文字列Aと文字列B同じものをそれぞれ違う文字列に結合する事は可能なのでしょうか。

現コードでは、change イベントで下記の部分が1回しか処理されません。

record[to].value = concatText(fields[pno].from, sep);

この部分を、対象文字列が含まれる配列をループで探して、処理するようにすれば、可能です。

そんなに難しい変更ではないと思いますので、試してみてください。

 

rex0220様

お礼が遅くなり申し訳ございません。

ご教授いただいた方法で実装する事ができました!迅速かつ的確なアドバイスをいただき有り難う御座いました。

rex0220 様

いつもお世話になっております。横から失礼致します。

私も似たような動きをしたくて、この投稿を参考にさせていただいております。

大変恐縮でございますが、以下のコードをお時間あるときに解釈していただくことは可能でしょうか?

初心者のものでコードの構造や意味を理解するのにすごく時間かかっております。

お手数をおかけして申し訳ございませんが、ご回答いただければ幸いです。どうぞよろしくお願い申し上げます。

// 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;

goro さん

これは、文字結合を複数項目処理するために、その準備を行っています。

例えば下記のような指定では、文字列D と 文字列D1 に文字結合を行います。

連結先項目と連結元項目、区切り文字を配列で定義しています。

var fields = [
{ to: '文字列D', from: ['文字列A','文字列B','文字列C'], sep: '-' },
{ to: '文字列D1', from: ['文字列A1','文字列B1','文字列C1','文字列C2'], sep: '' }
];

 

 

連結元項目の値が変わったときに処理したいので、処理するイベントと処理対象の配列の位置を取得します。

// 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;
}
}

 

こんな処理結果になります。

changeType:{
'app.record.create.change.文字列A':0,
'app.record.edit.change.文字列A':0,
'app.record.index.create.change.文字列A':0,
'app.record.index.edit.change.文字列A':0,
'app.record.create.change.文字列B':0,
'app.record.edit.change.文字列B':0,
'app.record.index.create.change.文字列B':0,
'app.record.index.edit.change.文字列B':0,
...
}

// changeTypeオブジェクトのキー部分を取得すると、処理するイベントの配列になります。
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;

これで、連結元項目の値が変わったときに、対象となる連結先項目が処理されます。

rex0220 様

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

早速ご返事いただき、本当にありがとうございます。勉強させていただきます。

いつも本当にありがとうございます。