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

**URL:** <https://community.cybozu.dev/t/topic/9885>\
**Category:** kintone 開発相談\
**Created:** [2024 年 12 月 24 日午前 2:10 UTC](https://community.cybozu.dev/t/topic/9885 "2024-12-24T02:10:44Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![inobe](https://avatars.discourse-cdn.com/v4/letter/i/7ab992/32.png) [@inobe](https://community.cybozu.dev/u/inobe)\
**Post date:** [2024 年 12 月 24 日午前 2:10 UTC](https://community.cybozu.dev/t/topic/9885/1 "2024-12-24T02:10:44Z")

</div>

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

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

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

レコード再利用するを押した時は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  
が表示されます。

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

```javascript
//管理番号を自移動採番
//
//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;

        //取得してくるデータ内容を指定 顧客管理番号を降順で一番大きい数字を１件取得する。（最大顧客番号の取得）
        //クエリで取得データの指定 
        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;      
  });        
  
})();

```

---

<div class="post-metadata">

**Author:** ![yarai](https://avatars.discourse-cdn.com/v4/letter/y/0ea827/32.png) [@yarai](https://community.cybozu.dev/u/yarai)\
**Post date:** [2024 年 12 月 25 日午前 4:22 UTC](https://community.cybozu.dev/t/topic/9885/2 "2024-12-25T04:22:33Z")

</div>

inobeさん

こんにちは

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

```javascript
//管理番号を自移動採番
//
//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;
        });
   });
})();

```

---

<div class="post-metadata">

**Author:** ![inobe](https://avatars.discourse-cdn.com/v4/letter/i/7ab992/32.png) [@inobe](https://community.cybozu.dev/u/inobe)\
**Post date:** [2024 年 12 月 25 日午後 5:43 UTC](https://community.cybozu.dev/t/topic/9885/3 "2024-12-25T17:43:40Z")

</div>

yt yarai様

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

---

<div class="post-metadata">

**Author:** ![yarai](https://avatars.discourse-cdn.com/v4/letter/y/0ea827/32.png) [@yarai](https://community.cybozu.dev/u/yarai)\
**Post date:** [2024 年 12 月 26 日午前 1:27 UTC](https://community.cybozu.dev/t/topic/9885/4 "2024-12-26T01:27:05Z")

</div>

inobeさん

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

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

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

---

<div class="post-metadata">

**Author:** ![inobe](https://avatars.discourse-cdn.com/v4/letter/i/7ab992/32.png) [@inobe](https://community.cybozu.dev/u/inobe)\
**Post date:** [2024 年 12 月 26 日午前 1:56 UTC](https://community.cybozu.dev/t/topic/9885/5 "2024-12-26T01:56:36Z")

</div>

yt yarai様

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

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

---

<div class="post-metadata">

**Author:** ![yarai](https://avatars.discourse-cdn.com/v4/letter/y/0ea827/32.png) [@yarai](https://community.cybozu.dev/u/yarai)\
**Post date:** [2024 年 12 月 26 日午前 2:44 UTC](https://community.cybozu.dev/t/topic/9885/6 "2024-12-26T02:44:37Z")

</div>

inobeさん

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

---

<div class="post-metadata">

**Author:** ![inobe](https://avatars.discourse-cdn.com/v4/letter/i/7ab992/32.png) [@inobe](https://community.cybozu.dev/u/inobe)\
**Post date:** [2024 年 12 月 26 日午前 3:16 UTC](https://community.cybozu.dev/t/topic/9885/7 "2024-12-26T03:16:09Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![inobe](https://avatars.discourse-cdn.com/v4/letter/i/7ab992/32.png) [@inobe](https://community.cybozu.dev/u/inobe)\
**Post date:** [2025 年 1 月 6 日午前 1:23 UTC](https://community.cybozu.dev/t/topic/9885/8 "2025-01-06T01:23:55Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2025 年 1 月 9 日午前 1:24 UTC](https://community.cybozu.dev/t/topic/9885/9 "2025-01-09T01:24:54Z")

</div>

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