イベント間のデータの受け渡し

何を実現したいのかを書きましょう

イベント間のデータの受け渡しにつて教えてください。

「レコード追加画面表示後」のイベントで管理番号フィールドに自動採番できるようプログラムを作ってましたが
不具合が発生した為、「レコード追加画面で保存する時」のイベントで自動採番する様に変更したいです。
自動採番の条件としては
①レコードを追加するを押した時**”新規採番”**
②レコードを再利用するを押した時**”新規採番”**
③アクションボタン「差替え」を押した時**”採番しない”**
としてます。
アクションボタンはレコード内容全コピーとし、管理番号も引き継ぎます。

レコード再利用するを押した時はevent.reuseでtrueになるのでその値で判断させて新規採番させようと思ってます。
但し、「レコード追加画面で保存する時」のイベントではreuseに値が入らないので、「レコード追加画面表示後」イベントからreuseの情報を「レコード追加画面で保存する時」イベントで実行される関数に引き渡してreuseの値を使おうと思ってプログラムを書きましたが
kintoneで実行して、保存ボタンを押した時にプログラムが暴走しています。
konsole.logで確認すると、採番までは出来ているように思いますが
保存の時にkintoneが固まって動かず保存できません。
「レコード追加画面で保存する時」のイベント
kintone.events.on(hozonEv,managementno(event,reuse,kanriNo));
の場所やデータの受け渡し方法が
悪い気もするのですが、原因が分からなので
どなたか、教えてください。
こういった仕様にせずに、別の方法もあるかと思いますが
イベント間のデータの受け渡し方法をどのようにやるのか?
こういったプログラムの組立方は無理なのかどうか?
を知りたいという事もあり、投稿しました。
データの受け渡しやfunction(event)を使っているものの
このeventも消すとどうなるかとかもいまいち
理解できておりません。

すみませんが、よろしくお願いします。

発生した問題やエラーメッセージを具体的に書きましょう

保存するを押すとコンソールに
Uncaught TypeError: a is not a function
が表示されます。

実行したコードをコピー&ペーストしましょう

//管理番号を自移動採番
//
//getno2-1-2.js

(() => {
    'use strict';
    const hozonEv  = 'app.record.create.submit';  //保存時のイベント
//    const kanriNo = 'app.record.create.show';

    function managementno(event,reuse,kanriNo){
//        const record = event.record;
//        let kanriNo = record['管理番号'].value;
        console.log('保存イベント管理番号'+kanriNo);
        console.log('保存イベントreuse:'+reuse);
        debugger;

        //取得してくるデータ内容を指定 顧客管理番号を降順で一番大きい数字を1件取得する。(最大顧客番号の取得)
        //クエリで取得データの指定 
        const body = {
        app: event.appId,
        fields:['管理番号'],  //欲しいデーターの場所を指定
        query:'order by 管理番号 desc limit 1'   //「order by  管理番号 desc」で並び順を変える
      };
      //レコードから管理番号を取得 複数レコードを取得する時の宛先「/k~records」
        return kintone.api(kintone.api.url('/k/v1/records',true),'GET',body).then(function(resp){ 
        console.log(`resp:${resp.records[0].管理番号.value}`); 
        debugger;
        if(resp.records.length ===0) {
            event.record['管理番号']['value'] = 1;    //レコード1個目の時初期値設定
          } else if ((kanriNo === undefined )||(kanriNo !== undefined && reuse === true)){
            console.log('新番号取得');  
            const newUid = Number(resp.records[0].管理番号.value) + 1;
            event.record['管理番号']['value'] = newUid;
            console.log('新番号'+newUid);
            debugger;  
          }else{
            console.log('差替え');
          }        
       
        return event;  
        }).catch(function(error){
            console.log(error);  //error
        });    
    }  
   
    kintone.events.on('app.record.create.show', function(event)  {  //追加画面イベント
      const record = event.record;
      let reuse = event.reuse;   //レコード再利用の時reuse=true
      let kanriNo = record['管理番号'].value;

      console.log(record);
      console.log('追加画面reuse'+reuse);
      console.log('追加画面管理番号'+kanriNo);
      
      kintone.events.on(hozonEv,managementno(event,reuse,kanriNo));  //保存時のイベント     
      
      return event;      
  });        
  
})();

inobeさん

こんにちは

貼付けされたコードを下記のように
修正したところエラーなく処理されました。

//管理番号を自移動採番
//
//getno2-1-2.js

(() => {
    'use strict';

    let reuse;
    let kanriNo;

    kintone.events.on('app.record.create.show', function(event)  {  
      
      const record = event.record;
      reuse = event.reuse;
      kanriNo = record.管理番号.value;
      return event;
   });

   kintone.events.on('app.record.create.submit', function(event)  {

        const record = event.record;
        const body = {
         app: event.appId,
         fields:['管理番号'],
         query:'order by 管理番号 desc limit 1'
        };

        return kintone.api(kintone.api.url('/k/v1/records',true),'GET',body).then(function(resp){ 

        if(resp.records.length === 0) {
          record.管理番号.value = 1;
        } else if (!kanriNo || (kanriNo && reuse === true)){
          const newUid = Number(resp.records[0].管理番号.value) + 1;
          record.管理番号.value = newUid;
        } else {
          console.log('差替え');
        }        

        return event;  
        }).catch(function(error){

        console.log(error);
        return event;
        });
   });
})();
「いいね!」 1

yt yarai様

プログラムありがとうございます。
yt yaraiさんが書いている
kanriNo = record.管理番号.value;とすれば希望通りの動きをするのですが
私が書いている
kanriNo = record[‘管理番号’].value;とすると
アクションボタンを押したときも再利用ボタン押したときも
追加画面のイベント内の時はkanriNoに値が入っていいるのですが
保存イベントの内ではkanriNoの値がundefinedになります。
この動きの違いはどうしてでしょうか?

「いいね!」 1

inobeさん

保存イベントの内ではkanriNoの値がundefinedになる件ですが
基本的に
kanriNo = record.管理番号.value(ドット記法)
kanriNo = record[‘管理番号’].value(ブランケット記法)
どちらも同じように処理がされる気がします。

参考程度にドット記法・ブランケット記法に関しては
下記トッピク、ドット記法・ブランケット記法でググってみてください。
record.フィールドコード の動作が安定しない - kintone カスタマイズ - cybozu developer community

質問の件に戻りますが
inobeさんがkanriNo = record[‘管理番号’].valueに修正したコードを
貼り付けていただくことはできますか。

「いいね!」 1

yt yarai様

同じような動作になりました。
おそらく、kanriNo = record[‘管理番号’].value;のあたまに
元のプログラムの「let」が残っていたからだと思います。

今回教えていただいた解決策は
グローバル変数を使うという解釈であってますか?
このプログラム教えていただいた後、変数の宣言についてもしらべて
元のプログラムのletが残っていたのがいけなかったのだと、理解しました。
その部分を直すと、
kanriNo = record.管理番号.value;
kanriNo = record[‘管理番号’].value;
でも、同じ動きになりました。
投稿した時、迷走しながら作っていいたのですが
プログラム全体の書き方も、関数で呼び出したりせずに、
yt yaraiさんの書き方がすっきりして
わかりやすいです。
ありがとうございました。

「いいね!」 1

inobeさん

正常に動作するようになってよかったです。
create.submitの処理の際にevent.reuseがとれないため
inobeさんのおっしゃる通りグローバル変数を使いました。

「いいね!」 1

すみません、このプログラムでもう一つ問題があるので教えて欲しいのですが
管理番号を判断する時の
if(resp.records.length ===0) {
event.record[‘管理番号’][‘value’] = 1; //レコード1個目の時初期値設定
の部分ですが、このプログラムだとレコードが1個もない状態で
1発目のレコードの時は管理番号が採番されないまま空白で
レコード番号1として保存してしまいます。
この状態で次に新規レコードを作ると
レコード番号2の時に初めて管理番号1が採番されます。
なので、初回の場合強制的に1を採番させようと思って書いた
条件のif(resp.records.length ===0)が正しくないようです。
どうすれば、どこで判断すればいいでしょうか?
(レコード番号何番が1発目になるか分からないので、
レコード番号は判断材料に使えません。)
どうやら、const body以降は実行できず
respじたいも取得できていない動きをしている気がします。

問題解決しました。
if(resp.records.length ===0)で問題なく動きました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。