JavaScriptで動的に作成したフォームの値でレコードを作成したい。

お世話になっております。

少し煮詰まってしまったので、書き込ませていただきます。

レコード追加画面にて、動的にドロップダウンを作成し、eventオブジェクトのrecord.valueに人物名に対応した数値を格納するところまでは成功したのですが、eventをreturnしても反映されませんでした。

原因、分かりますでしょうか?

 

※要素の作成の記述などは省いております。

また、for文で何重にも囲んでいたので関係ありそうな箇所のみ抜粋してあります。

実際には複数のrecord.valueを書き換えて格納しています。

 

 

//保存実行時イベント////////////////////////////////////////////////////////

var submitEvents = [“app.record.edit.submit”,“app.record.create.submit”];

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

 

    var record = event.record;

 

    // ドロップダウンの値取得(氏名)
    var selectedIndex_name = document.getElementById(submitName).options.selectedIndex;
    var keyword_name = document.getElementById(submitName).options[selectedIndex_name].text;

    // ドロップダウンの値取得(点数)
    var selectedIndex_point = document.getElementById(pointName).options.selectedIndex;
    var keyword_point = document.getElementById(pointName).options[selectedIndex_point].text;

 

    // 条件が一致したら実行 (変数fcはフォームコード)
    if(labelName === keyword_name){

        // 点数に応じてrecordのvalueに数値を格納(2点~5点)
        if(keyword_point === “2点”){
                record[fc][‘value’] = 2;
        }
        else if(keyword_point === “3点”){
                record[fc][‘value’] = 3;
        }
        else if(keyword_point === “4点”){
                record[fc][‘value’] = 4;
        }
        else if(keyword_point === “5点”){
                record[fc][‘value’] = 5;
        }
    }
    else{
         return event;
     }

});

okamoさん

 

こんにちは。

上記のコードですと、return event;がelse文に入りますので record[fc][‘value’] の値を書き換えた場合には return event; されません。

    else{
         return event;
     }

このelse文をとってみてお試しください。

 

//保存実行時イベント////////////////////////////////////////////////////////

var submitEvents = ["app.record.edit.submit", "app.record.create.submit"];

kintone.events.on(submitEvents, function(event) {
  var record = event.record;
  // ドロップダウンの値取得(氏名)
  var selectedIndex_name = document.getElementById(submitName).options.selectedIndex;
  var keyword_name = document.getElementById(submitName).options[selectedIndex_name].text;

  // ドロップダウンの値取得(点数)
  var selectedIndex_point = document.getElementById(pointName).options.selectedIndex;
  var keyword_point = document.getElementById(pointName).options[selectedIndex_point].text;


  alert("labelName : " + labelName + "keyword_name : " + keyword_name);
  // 条件が一致したら実行 (変数fcはフォームコード)
  if (labelName === keyword_name) {
    // 点数に応じてrecordのvalueに数値を格納(2点~5点)
    if (keyword_point === "2点") {
      record[fc]['value'] = 2;
    } else if (keyword_point === "3点") {
      record[fc]['value'] = 3;
    } else if (keyword_point === "4点") {
      record[fc]['value'] = 4;
    } else if (keyword_point === "5点") {
      record[fc]['value'] = 5;
    }
  }
  return event;
});

 

 

 

okamoさん

かき氷さんの書かれている内容にプラスして、細かい点ではあるのですが、
if文の中で書かれている、「record[fc][‘value’] = 2;」の [fc] の部分は、
フィールドコードを直接指定している箇所になるので、[‘fc’] と
シングルクォーテーションで囲っていただいたほうがよいと思いました^^

>カキ氷さん

 

返信ありがとうございます。助かります。初心者で申し訳ありませんが、よろしくお願いします。

やってみたのですが、ダメでした。

ちょっと複雑に書きすぎてしまっていたので省略したのですが、実際にはfor文でユーザーの数(userCount)だけ回し、「2点」~「5点」の文字列が一致したときにrecord[fc][value]に値を格納し、そのfor文を抜けた後にreturn eventしているところまでは問題なしとデバックして確認できているのですが、実際に追加されたレコードはどれも空っぽでした。(elseの中でreturnはご指摘の通りやめています)

 

for文を抜けた後のrecordの配列はバッチリなのですが、return eventで返っていったあとに結果に反映されない、と言うべきでしょうか?

複数のレコード書き換えはいっぺんに行えない、とも考えられるのかなと思いましたが、ご存じでしょうか。

 

 

>furumaiさん

 

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

すみません、省略してしまっているのですが、fcは変数でfunctionの引数から渡ってきたフィールドコード文字列を格納しています。

okamo さん

 

>複数のレコード書き換えはいっぺんに行えない、とも考えられるのかなと思いましたが、ご存じでしょうか。

記載されたサンプルコードから新規追加画面、編集画面のレコード保存前イベントで値を動的に設定して保存する認識だったのですが、複数のレコードを取り扱うとはどういうことでしょうか。

上記の認識であればサンプルのような形であれば設定可能です。

複数のレコードを取り扱う場合、例えばRestAPIで複数レコードを登録とかになるとやり方が変わってきます。

もしかしたら記載されている部分が問題ではなく、もっと大枠に原因があるかもと思いました。

カキ氷さん

 

すみません。レコードという言葉の認識を誤っていました。仰るとおり、登録するのは単一レコードに対してです。

この文であれば可能のはずとのこと、了解しました。もう少しデバッグなどして原因を探ってみようと思います。ありがとうございました。

okamo さん

 

ご確認ありがとうございます。単一レコードとのこと認識致しました。

あと原因となりうるのは、レコードオブジェクトの構成が正しくない場合があるかと思います。

以下のようにログを出力して、元レコードと更新後のレコードで構成があっているか差分を確認してみると何かわかるかもしれません。

kintone.events.on(submitEvents, function(event) {
 var record = event.record;
 console.log('start: ' + JSON.stringify(record, null, ' ')); //jsonをログで出力

・・・

 console.log('end: ' + JSON.stringify(record, null, ' ')); //jsonをログで出力
 return event;
});

 

カキ氷さん

 

ありがとうございます。ログで調べてみたところ、recordの内容に問題はなく、上記の構文も問題なさそうだということをヒントにreturnする位置に原因がありそうだったので弄ってみたところ、上手くいきました。

拙い質問で混乱させて大変申し訳ありませんでした。

okamo さん

returan が問題でしたか。 一先ず解決したようでよかったです。