スマートフォンでレコードに値をセットする

お世話になります。渡邊です。

「kintone.events.on のインベントハンドラ内で kintone.app.record.set および kintone.mobile.app.record.set を実行することはできません。」という事になってますが、PCでは下記のコードの実行が可能です。

kintone.events.on('app.record.edit.show', function (event) {
 …
 contactUpdateFieldButton.onclick = function () {
  var record = kintone.app.record.get();
  …
  kintone.app.record.set(record);
 }
 kintone.mobile.app.getHeaderSpaceElement().appendChild(contactUpdateFieldButton);
});

 

スマホでは下記の表現では「Uncaught TypeError: Cannot read property ‘getYear’ of null」エラーが表示されてしまいます。「kintone.mobile.app.record.set(record);」の引数recordを外すと、「Uncaught Error: Usage: kintone.mobile.app.record.set(record)」というエラーが出ていて、edit.jsの「You cannot call kintone.mobile.app.record.set() in handler or during processing a handler.」から発生しているようです。

kintone.events.on('mobile.app.record.edit.show', function (event) {

 contactUpdateFieldButton.onclick = function () {

  var record = kintone.mobile.app.record.get();

  kintone.mobile.app.record.set(record);

 }

 kintone.mobile.app.getHeaderSpaceElement().appendChild(contactUpdateFieldButton);

});

また下記のフィールドの値を書き換えるコードは「PC用のみで利用できます。」とあり、スマートフォンでは使えません。

varrecord = event.record;

スマートフォンでレコードに値をセットするためには、どうすれば良いのでしょうか?

 

渡邊さん

最初のコードでkintone.app.record.setが実行できる理由としては、kintone.events.onのイベントハンドラーの実行中に実行することが不可能なだけであり、上記最初のコードで行っているのは実行ではなく、kintone.app.record.setを処理に含む関数の定義なので問題ありません。

おそらくですが、エラーの内容を読む限り、getYearメソッドを呼び出しているあたりで何らかのコードの間違いがあるためなのではないかと思います。(getYearを参照しているオブジェクトがnullになってしまっている)

何も問題がなければ、ボタンのクリックイベントでのレコードの変更はできるかと思います。

ボタンを使わない場合は、setTimeoutメソッドなどによって強引にイベントハンドラーの外でレコードを操作するような方法しかなさそうです

参考になりますでしょうか?

瀧ヶ平さま

ご回答ありがとうございます!

 

>kintone.events.onのイベントハンドラーの実行中に実行することが不可能なだけ

とのご回答ありがとうございます。実際はクリック時に実行されるので問題ないのですね。

 

問題がなければレコードの変更可能とのことで、下記までソースを削ぎ落とし、他のjsも削除したのですが、「kintone.mobile.app.record.set」の箇所で、同様の「Uncaught TypeError: Cannot read property ‘getYear’ of null」エラーが発生してしまいます。現状、レコードの変更も行っていない状態にはなっているのですが。

(function () {  
  "use strict";  
    
    // モバイル用  
    kintone.events.on('mobile.app.record.edit.show', function (event) {  
       
        // 任意のスペースフィールドにボタンを設置  
        var contactUpdateFieldButton = document.createElement('button');  
        contactUpdateFieldButton.id = 'contact\_update\_button';  
        contactUpdateFieldButton.innerHTML = '更新!';          
       
        contactUpdateFieldButton.onclick = function () {  
  
            window.alert('データ挿入');  
  
            // フィールドのリセット  
            var record = kintone.mobile.app.record.get();  
            console.log(record.record);  
            var array = [];// 空配列  
            kintone.mobile.app.record.set(record);  
        }  
          
        // モバイル用  
        kintone.mobile.app.getHeaderSpaceElement().appendChild(contactUpdateFieldButton);  
    });  
})();  

win7でChromeの検証(スマホのエミュレーション)を利用しているのが問題なのでしょうか。スタックトレースは下記のようなものです。お忙しいところすみませんが、よろしくお願いいたします。

edit.js:843 Uncaught TypeError: Cannot read property 'getYear' of nulle.N @ edit.js:843e.Gi
@ edit.js:833fE @ edit.js:452dE
@ edit.js:451(anonymous function)
@ edit.js:451G @ edit.js:38eE
@ edit.js:451(anonymous function)
@ edit.js:760contactUpdateFieldButton.onclick
@ add_rireki.js:27

 

 

瀧ヶ平さま

問題解消してませんが、

他のアプリにjsを付加し、実行させたところ、エラーは発生しませんでした。

フォーム上の項目によるのかと思いますので、

もう少し調べて見ようと思います。

ありがとうございます。

 

瀧ヶ平さま

結局日時フィールドが空の状態で「kintone.mobile.app.record.set」を行うと、エラーが発生するようでしたので、

事前に避けるようにしようと思います。

このたびは、アドバイスありがとうございました。

渡邊さん

解決したようで良かったです。