同一レコード内の文字列複数行のコピー

同一のレコード内に文字列複数行のフィールドがいくつかあり、

それらを1:1でコピーしてくるという機能を追加したいと考えています。

致命的な問題ではないのですが、

その他の入力項目が多く、

下にスクロールした際に最終的にまとまっている仕様にしたいです。

 

無料のプラグインで解決できれば解決したいですが、

それが難しいようであればjavascriptで解決できないかと考えております。

 

何かいい方法をご存知の方がいらっしゃったら、

ご教示いただけると幸いです。

 

よろしくお願いいたします。

kyoden さん

こんにちは!

 

仰っている内容がイマイチ理解できておらず、恐縮なのですが、

各文字列(複数行)フィールドの値を別のフィールドにコピーするといった方法を

ご検討ということでしょうか。

※ 以下のようなイメージでしょうか。。。?

 

   文字列(複数行)1 => コピー先1

   文字列(複数行)2 => コピー先2

   文字列(複数行)3 => コピー先3

 

上記で合ってるのなら、フィールドが増えることになりますので、

それよりも、各項目を「グループ」フィールドでグルーピングして、

フィールドの開閉などで見やすさは解消されそうですが、いかがでしょうか。

 

また、調べてみたところ、rex0220 さんが提供しているプラグインの中に、

項目をタブで分けて表示させることが可能なプラグインがあるようです。

https://rex0220.stores.jp/items/589fb8079821cc61ad00b11e

 

無料ではないようですが、ご希望の動作が可能であれば、

プラグインの購入も検討してみてはいかがでしょうか。

kyodenさん、こんにちは。

プロジェクト・アスノートの松田です。

項目数の多い(縦長の)フォームの、途中段階にあるいくつかの情報を、最終的にまとめて参照したい、ということですかね?

長い業務プロセスのワークフローなどを作るときには、そういったニーズもあるかと思います。

 

フィールドの入力データを、別のフィールドにコピーするだけでしたら、簡単なJavaScriptカスタマイズで可能です。

https://developer.cybozu.io/hc/ja/articles/203331050

上記の記事を参考に、

  1. 各submit系イベント(保存実行前イベント)で
  2. eventオブジェクトから、コピー元のフィールドデータを取得して
  3. eventオブジェクト内の、コピー先のフィールド値を書き替える
  4. eventオブジェクトをreturnする

という手順でよろしいかと思います。

また、このコピー先フィールドは参照するだけなので、編集画面を開いたときには編集不可にしておくほうが良いかもですね。

この辺も上記の記事に記載がありますので参考にしてみてください。

 

補足としては、

あとからそのレコードのデータを活用する際には、同じデータのフィールドが複数あることに注意が必要ですね。

もしプロセス管理を使っているようでしたら、アクセス権の設定により、作業者にだけ見せるというの工夫もできるのかなと思いました。

 

以上、参考になれば幸いです

 

文系男さん

 

 > 文字列(複数行)1 => コピー先1文字列(複数行)1

 >文字列(複数行)2 => コピー先2文字列(複数行)2

 >文字列(複数行)3 => コピー先3文字列(複数行)3

 

のような感じです。

グループ・タブ等は既に使っておりますが

松田さんがおっしゃるイメージのほうで、

項目数の多い(縦長の)フォームの、途中段階にあるいくつかの情報を、最終的にまとめて参照したい、ということなので、

今回の目的からは少しずれます。

 

ご回答いただいたのに申し訳ございません。

松田さん

 

仰るように、

>項目数の多い(縦長の)フォームの、途中段階にあるいくつかの情報を、最終的にまとめて参照したい、

ということです。

 

https://developer.cybozu.io/hc/ja/articles/203331050

こちらの記事参考にさせていただきます。

ありがとうございます

kyoden さん

 

そういうことでしたか。

背景に考慮せず、軽率な発言をいたしました。

申し訳ございません。

 

ニーズについては、Shotaro Matsuda さん、ご説明いただきありがとうございます。

今後は背景なども考えた上で色々な提案をしていければと思います。

松田さん

提示いただいたリンク先を拝見してコピーできるか試したのですが、

下記のような書き方であっていますでしょうか?

javascriptの書き方に慣れていないため、

問題点があればご指摘いただきたいです。

よろしくお願いいたします。

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

 

|   | (function () { |
|   | “use strict”; |
|   | kintone.events.on([‘app.record.create.submit’, ‘app.record.edit.submit’], function (event){ |
|   | var record = event.record; |
|   | var price = record[‘単価’].value; |
|   |   |
|   | record[‘単価_参照用’].value = price; |
|   |   |
|   | return event; |
|   | }); |
|   |   |
|   | // レコード追加画面が表示された時, レコード編集画面が表示された時のイベント |
|   | kintone.events.on([‘app.record.edit.show’, ‘app.record.create.show’], function (event) { |
|   | // 「単価_参照用」フィールドの入力を制限 |
|   | event.record[‘単価_参照用’].disabled = true; |
|   |   |
|   | return event; |
|   | }); |
|   | })(); |

kyodenさん、

こんにちは。特に問題はないかと思いますが、うまくいかないですか?

アプリの動作は、どのような状況でしょうか?
コンソールに何かエラー等の表示はありますか?

コンソールでエラーの表示はなく、

何も表示されず保存ができます。

ただし、何もコピーされていない状態です。

 

実際は

var record = event.record;
var price = record[‘単価’].value;
var price2 = record[‘単価2’].value;

record[‘単価_参照用’].value = price;
record[‘単価2_参照用’].value = price2;

 

の部分のここでいう単価の部分が、

全て文字列複数行で15個あるイメージです。

 

文字列複数行の場合、

こちらの変数宣言の仕方が異なる等の事象はありますか?

また、使ってはならない英単語等あれば教えていただけると幸いです。

よろしくお願いいたします。

こちらで簡単なアプリを作って検証してみました。

参考までに。

eventオブジェクト内の処理は問題ないように見えますが、

全体の処理をチェックしたほうがよろしいかと思います。

例)イベント指定、フィールドコード、書き換え後returnしているか 等

 

動いているソース:

(function () {
"use strict";
kintone.events.on([
'app.record.create.submit',
'app.record.edit.submit',
'app.record.index.edit.submit'], function (event) {
var record = event.record;
record['コピー先']['value'] = record['コピー元']['value'];
record['コピー先2']['value'] = record['コピー元2']['value'];
return event;
});

kintone.events.on(
['app.record.create.show', 'app.record.edit.show', 'app.record.index.edit.show'], function (event) {
var record = event.record;
record['コピー先']['disabled'] = true;
record['コピー先2']['disabled'] = true;
return event;
});
})();

サンプルのjsを書いていただきありがとうございます。

 

フィールドコードが一部誤っていたために、

保存やコピーができなかったようです。

 

コードを修正し無事に解決いたしました。

ありがとうございました。

うまく動いたようで、よかったです!

松田さん

以前ご教示いただいたこちらの文字列複数行を別のフィールドへコピーする件ですが、

このjs単体では問題なく動作しますが、

フィールドの文字数をカウントしてみよう

のURLにあるjsを一緒のアプリに入れ込むと保存ボタンが押せなくなります。

どちらも単体ではちゃんと動作しております。

この場合恐らくjs同士が競合しているのではないかと思われるのですが、

これを回避するにはどのようにしたらよいのでしょうか?

 

ちなみにコンソール画面では

Uncaught SyntaxError: Unexpected token u in JSON at position 0

Uncaught TypeError: Cannot read property ‘length’ of undefined

というエラーが見つかりました。

kyodenさん、こんにちは。

今回のケースですと、どちらのJSも同じsubmit系のイベントで、レコードオブジェクトを書き換えてreturnする、という流れなので、処理がバッティングしてしまう可能性が高いと思います。

対応策としては、双方の処理を1つのカスタマイズJSにまとめてみてはどうでしょうか?

 

補足です。

こんなイメージになるかと思います。

※フィールド文字数カウントの記事で書かれていたサンプルコードに、上記のフィールド転記の処理を入れ込む形でまとめてみた例です。

 

(function () {
'use strict';

kintone.events.on(['app.record.create.submit', 'app.record.edit.submit', 'app.record.index.edit.submit'], function (event) {
// 本文に入力された文字数を取得
var rec = event.record;
var st = rec['honbun']['value']
var result = 0;

//改行を0.5文字でカウント
for (var i = 0; i < st.length; i++) {
if (st.charAt(i) === "") {
result += 0.5;
}
}

//空白文字を削除
var st2 = st.replace(/\s+/g, "");

//半角は0.5文字、全角は1文字でカウント
for (var j = 0; j < st2.length; j++) {
var c = st2.charCodeAt(j);
if ((c >= 0x0 && c < 0x81) || (c === 0xf8f0) || (c >= 0xff61 && c < 0xffa0) || (c >= 0xf8f1 && c < 0xf8f4)) {
result += 0.5;
} else {
result += 1;
}
}

//文字数フィールドに文字数を代入
rec['count']['value'] = result;

// 文字列複数行からのコピー転記処理
rec['コピー先']['value'] = rec['コピー元']['value'];
rec['コピー先2']['value'] = rec['コピー元2']['value'];

return event;

});
})();