kintone イベント処理の return 文について

kintone のJavaScript カスタマイズ・プラグインで、イベント処理のreturn文が動作に影響します。
いろいろなパターンを試して影響を調べてみます。

# 概要

レコード編集画面の表示後イベントで、項目の書き換えで検証。

- イベント処理のreturn文の書き方で、動作が変わる。
- return なし、return; のどちらも、return undefined; と同じ。
- 複数のイベント処理を登録した場合、最後のイベント処理のreturn文で動作が決まる
    - 最後のイベント処理が return event; していれば、項目の書き換えがOK
    - 最後のイベント処理が return; していれば、項目の書き換えがNG


## イベント処理が一つの場合

|rerun 方法|項目の書き換え|
|:-----------|------------:|:------------:|
|rerun event;|〇|
|rerun;|✕|
|rerun なし|✕|

## イベント処理が二つの場合

|イベント1|イベント2|項目の書き換え|
|:-----------|------------:|:------------:|
|rerun event;|rerun event;|〇|
|rerun event;|rerun;|✕|
|rerun;|rerun event;|〇|
|rerun;|rerun;|✕|

## イベント処理で return; した場合の影響

プラグインのイベント処理で、return; した場合、他のプラグインの処理結果に影響します。
プラグインのインストール順によって、実行順序が変わるため、再インストールによって、正常なプラグインが動作しなくなったりします。

## イベント処理終了時は、return event; しましょう。
プラグイン導入・再インストール時などの余計なトラブルの防止になります。
※例外として、プロセス管理のアクションイベントで、レコード更新権限が無い場合は、return event; 出来ません。

# レコード編集画面の表示後イベント　return event;

担当者名を'TEST1' に書き換えて、return event; すると、画面に反映されます。
通常のイベント処理の終わり方です。

```.js
(function() {
  'use strict';
  kintone.events.on('app.record.edit.show', function(event) {
    event.record.担当者名.value = 'TEST1';
    return event;
  });
})();
```

![2021-12-08_23h43_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e0341bcd-1256-2ab5-6997-a9ba21c57b58.png)


# レコード編集画面の表示後イベント return なし

担当者名を'TEST1' に書き換えて、return文を忘れると、画面に反映されません。

```.js
(function() {
  'use strict';
  kintone.events.on('app.record.edit.show', function(event) {
    event.record.担当者名.value = 'TEST1';
  });
})();
```

![2021-12-08_23h46_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4b18da1c-2591-f3d9-df5a-dd21167e97ae.png)


# レコード編集画面の表示後イベント return;
担当者名を'TEST1' に書き換えて、return; すると、画面に反映されません。

```.js
(function() {
  'use strict';
  kintone.events.on('app.record.edit.show', function(event) {
    event.record.担当者名.value = 'TEST1';
    return;
  });
})();
```
![2021-12-08_23h46_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2313e699-4ad6-fa9a-0a44-1c28f9c22a73.png)

# 関数の return なし、return; とは？

return なし、return; のどちらも、return undefined; と同じです。

[MDN undefined](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/undefined) : 値が代入されていない変数の状態と同じ 

[MDN 関数の戻り値](https://developer.mozilla.org/ja/docs/Learn/JavaScript/Building_blocks/Return_values) によると return 文なしは、
>関数によっては何も値を返しません (この場合、リファレンスページでは戻り値を void または undefined として記載しています)

chrome で実行した場合、undefine を返しています。

return;　は、[MDN return](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/return) から
>値が省略された場合は undefined が代わりに返されます。

# 複数のイベント処理　return event; return event;

- イベント処理1: 担当者名を'TEST1' に書き換えて、return event; 
- イベント処理2: return event; 

すると、画面に反映されます。
通常のイベント処理の終わり方です。

```.js
(function() {
  'use strict';
  kintone.events.on('app.record.edit.show', function(event) {
    event.record.担当者名.value = 'TEST1';
    return event;
  });
  kintone.events.on('app.record.edit.show', function(event) {
    return event;
  });
})();
```

![2021-12-08_23h43_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e0341bcd-1256-2ab5-6997-a9ba21c57b58.png)

# 複数のイベント処理　return event; return;

- イベント処理1: 担当者名を'TEST1' に書き換えて、return event; 
- イベント処理2: return; 

すると、画面に反映されません。

```.js
(function() {
  'use strict';
  kintone.events.on('app.record.edit.show', function(event) {
    event.record.担当者名.value = 'TEST1';
    return event;
  });
  kintone.events.on('app.record.edit.show', function(event) {
    return;
  });
})();
```
![2021-12-08_23h46_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2313e699-4ad6-fa9a-0a44-1c28f9c22a73.png)

# 複数のイベント処理　return; return event;

- イベント処理1: 担当者名を'TEST1' に書き換えて、return; 
- イベント処理2: return event; 

すると、画面に反映されます。
途中がreturn; でも最後に return event; すると反映されます。。

```.js
(function() {
  'use strict';
  kintone.events.on('app.record.edit.show', function(event) {
    event.record.担当者名.value = 'TEST1';
    return;
  });
  kintone.events.on('app.record.edit.show', function(event) {
    return event;
  });
})();
```

![2021-12-08_23h43_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e0341bcd-1256-2ab5-6997-a9ba21c57b58.png)

# 複数のイベント処理　return; return;

- イベント処理1: 担当者名を'TEST1' に書き換えて、return; 
- イベント処理2: return; 

すると、画面に反映されません。

```.js
(function() {
  'use strict';
  kintone.events.on('app.record.edit.show', function(event) {
    event.record.担当者名.value = 'TEST1';
    return;
  });
  kintone.events.on('app.record.edit.show', function(event) {
    return;
  });
})();
```
![2021-12-08_23h46_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2313e699-4ad6-fa9a-0a44-1c28f9c22a73.png)


# 複数プラグインの実行順での動作

プラグインのイベント処理で、return; があると、複数プラグイン利用時にプラグインインストールで実行順序が変わり、不具合が発生します。

**イベント処理終了時は、return event; しましょう。**

![2021-12-04_20h02_07a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c8a769b7-c72a-388f-5473-04aac8ee0c8e.png)