JavaScriptからフィールドコード指定し値をセットしたが、画面に表示されない。

フィールドコード「space3」に対して、JavaScriptから値を設定したいです。

以下の抜粋したコードを記入しても、画面上のフィールドには何も値が表示されません。しかし、alertでrecordを表示した場合、セットした値がメッセージボックスには表示されます。

record[‘space3’].disabled = false;
record[‘space3’].value = ‘ああああ’;
alert(record[‘space3’].value);

また、根本的にアプリの「フォーム」で置いた部品(数値や文字列)に対して、JavaScript上から値をセットできないのでしょうか?

ご教授願います。

------------------以下プログラムです

(function() {
‘use strict’;

var events = [
‘app.record.detail.show’,
‘app.record.edit.show’ ,

‘app.record.create.show’,
‘app.record.index.edit.show’

];

kintone.events.on(events, function(event) {
var clientName = event[“record”][“取引先コード”][“value”];
var relatedAppId = kintone.app.getRelatedRecordsTargetAppId(‘案件管理’);
var query = ‘取引先コード="’ + clientName + ‘" and 受注金額 != “”’;
var outputFields = [‘受注金額’];
var appUrl = kintone.api.url(‘/k/v1/records’,true);

var params = {
‘app’: relatedAppId,
‘query’: query,
‘fields’: outputFields
};

var elementId = ‘space1’;

kintone.api(appUrl, ‘GET’, params, function(resp) {
var amount = 0;
for (var i = 0; i < resp.records.length; i++) {
amount += parseFloat(resp.records[i].受注金額.value);
}

var divTotalAmount = document.createElement(‘div’);
var wString = String(amount.toFixed(0).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, ‘$1,’));
divTotalAmount.style.fontWeight = ‘normal’;
divTotalAmount.style.textAlign = ‘right’;
divTotalAmount.style.fontSize = 12;
divTotalAmount.innerHTML = ‘\’ + wString + ‘-’;
kintone.app.record.getSpaceElement(elementId).appendChild(divTotalAmount);

var record = event.record;
alert(record[‘数値_8’].value);
record[‘space3’].disabled = false;
record[‘space3’].value = ‘ああああ’;
alert(record[‘space3’].value);

return event;
});
});
})();

社内ネットワーク管理者さん

はじめまして。[space3]フィールドはおそらく、このカスタマイズファイルを適用しているアプリにあるフィールドだと思われますが、

コード全体を見た感じですと、関連レコード一覧フィールドで参照しているアプリに対して叩いているREST API(レコードの取得)の中に

[space3]フィールドについてのコードが書かれているのでその関係で動かないのかな…と思いました。

 

もしくは、[space3]フィールドが関連レコード一覧フィールドで参照しているアプリの中のフィールドでしたら、

REST API内に記述しているので、下記の画像のように「var record = resp.record;」に書き換える必要があるかと思います。

 

社内ネットワーク管理者さんの意図しているところとずれていましたらすみません。参考になればと思います。

返信ありがとうございます!

単純にコードを変更してみましたが、上手く動きませんでした。

ちなみに、[space3]はフォームの数値フィールドです。
一旦、レコードの値を表示させてますが、その後にJavaScriptで明細集計した結果を[Space3]フィールドに入れようとしています。

まだキントーンはうろ覚え状態なので、もう少し的確に説明出来るように調査してみます。

 

 

社内ネットワーク管理者さん

なるほど、これじゃ動きませんでしたか…。

うまく伝わっているか不安なのですが、こちらのアプリ(子アプリとします)のフォームには「関連レコード一覧」フィールドで紐付いているアプリ(親アプリとします)があって、親アプリにあるレコードから情報を取得して、子アプリで明細を集計して[space3]フィールドに出力する、という認識であっていますでしょうか?

kintoneを初めたばかりだとフィールドやフォームの言葉でさえも混乱してしまいますよね。私も初めはそんな感じでした…。

社内ネットワーク管理者さんからのアプリでどんなことをしたいのかの説明お待ちしています!

ご返信ありがとうございます。

読み取っていただいた通りです。

現状は下記のように処理されています。

elementIdは画面に反映されるのにspace3は画面に反映されない部分が最大の疑問です。

最終的にはelementIdの値をspace3に入れたいですが、それが上手くできず、試行錯誤の中でまずはspace3を直接更新しようとした段階のコードです。

 

上手く説明できず、お手数をお掛けしていますが、コメントいただけると助かります。

社内ネットワーク管理者さん

お返事が遅くなってしまい、失礼しました。

私のほうでいろいろ試してみたのですが、社内ネットワーク管理者さんと同じような状況になってしまいました…。

解決策として、レコードに値をセットするAPIを叩いてあげるとセットできました。( ドキュメント:https://developer.cybozu.io/hc/ja/articles/201942014 )

●(59行目)kintone.app.record.set(event); を実行する直前。まだ[space3]フィールドに「1111」はセットされていません。

 

●(59行目)kintone.app.record.set(event); を実行したあと。[space3]フィールドに「1111」が入力されました!

私の中の認識でも社内ネットワーク管理者さんと同じように値を直接セットして、return event; をしてあげると更新するものだと思っていましたので勉強になりました。ありがとうございます。

これで実際に動くといいですね。ぜひ試してみてください!

rkpsさん

確認が遅くなり、申し訳ございません。

熱心に調べていただき、ありがとうございます。

試してみましたが、上手く動作しませんでした。(何も変わらずでした。)

余分な処理やフィールドを省いて、テスト用のアプリを作成してみました。

それでも、上手く動作しないので、コードの書き方以外に何か漏れているか疑っています。

 

(function() {
  ‘use strict’;

   var events = [
    
       ‘app.record.detail.show’,
       ‘app.record.edit.show’ ,
       ‘app.record.create.show’,
       ‘app.record.index.edit.show’

   ];

   kintone.events.on(events, function(event) {

   var record = event.record;

   // フィールドの値の書き換え
   alert(record[“space3”].value)
   record[“space3”].value = “1111”;
   alert(record[“space3”].value)

   kintone.app.record.set(event);
   return event;

  });
})();

 

rkpsさん(追記)

こちらの伝え漏れがありました。情報を表示したいのは「詳細画面」(イベントは「‘app.record.detail.show’」)です。

やりたい事は、「Aアプリ」の一覧画面から詳細画面を表示した際、「Bアプリ」データをあるキーで集計した結果を表示したい、
という事です。

今の迂回案として、「Bアプリ」を更新した場合、「Aアプリ」の集計値フィールドに集計値を更新してやる」という
変な方法で待応する事になりそうです・・・。

ちなみに、先日教えて頂いたコードは編集画面(app.record.edit.show)の処理に記入して動作を確認しました。
※「土曜日 時間 09:09」返信の添付画面も「キャンセル」「保存」のボタンが出ているの、編集画面だと思います。

以下こちらで試したCDです。
6行目の部分が「app.record.edit.show」となってます。

 

詳細画面に、値を表示する方法があれば、ぜひ教えて下さい。

よろしくお願いします。

rkpsさんへ

サイボウズのサポートから回答を頂きましたので、転記します。
結論としては「できない」との事です。

迂回案として「PUTを使って対処する方法」が文中にありましたが、ぱっと見理解できていないので、
時間を使って調べよう思います。

色々と回答いただき、有難うございました。
以下、サポートからのメール転載です。


恐れ入ります。レコード詳細画面表示時イベント “app.record.detail.show”
では、イベントオブジェクトを用いて、フィールドの値を更新することは、
できないようになっております。
ご期待に沿うことができず、誠に申し訳ございません。

“app.record.detail.show” で、イベントオブジェクトを用いて、
実行できる操作については、以下のページにて案内しております。
ご参照ください。

   ▼ レコード詳細画面の表示後イベント
   https://developer.cybozu.io/hc/ja/articles/201941974#step1
   ※ “eventオブジェクトで実行できる操作” 項目をご覧ください。

   ⇒ 以下のページより、各イベントの詳細を確認することが可能です。

      ▼ kintone JavaScript API一覧
      https://developer.cybozu.io/hc/ja/articles/360000361686
      ※ “イベント” 項目をご覧ください。

「kintone」で、“app.record.detail.show” 発生時にレコードの更新を
行う場合、レコード更新処理 “PUT” を実行する必要がございます。

現在作成されている処理において、イベント内でレコード更新処理 “PUT”
を実行し、該当のフィールドを更新することで、ご希望の動作が可能と
考えられます。

なお、レコード更新処理 “PUT” を用いて、変更した値を画面上に
反映させる場合は、画面の更新が必要となります。

また、“app.record.detail.show” 発生時に、画面更新処理を記述した場合、
記述内容によっては、無限ループに陥る可能性がございます。
あらかじめ、ご留意ください。

参考ですが、レコード詳細画面に独自のボタンを作成し、押下時に
レコードの更新、画面更新の処理を実行することで、無限ループを
回避することが可能と考えられます。

しかしながら、恐縮ですが、処理の詳細に関しましては、プログラムの
内容に依存し、記述方法も多岐に渡るため、サポート対象外となります。
重ねてお詫び申し上げます。

 

社内ネットワーク管理者さん

お返事が大変遅くなりました。

お力添えできずすみませんでした…。わざわざサイボウズのサポートからの返信を共有してくださりありがとうございます。

今回の件は私の知識の中で抜けていたところだったので大変勉強になりました。

カスタマイズは難しいところも多くありますが、できるとうれしいのでこれからもお互いにがんばりましょう^^

rkpsさん

今回の件では、色々お世話になりました。

また、フォローも頂き、大変助かりました。今後も質問をちょろちょろすると思いますが、

その際はよろしくお願いします。

それでは。