JSでルックアップで存在しないレコードを指定してもそのまま処理を続けたい。

【前提】

・ 外部APIからルックアップができないので、kintone上で編集した時に値をコピーしてJSでルックアップするロジックを作成しました。

・それ以外に、手動で変更したくないフィールドがあったので、JSにてdisabled = trueにするロジックを組み込みました。

 

【正常動作】

・ルックアップする値が存在する場合は、正常にルックアップされ、手動で変更したくないフィールドは、disabledとなりました。

 

【問題の動作】

・ルックアップする値が存在しなかった場合、正常にルックアップできなかった旨のエラーが出て、手動で変更したくないフィールドはdisabledとなりませんでした。

 

【試したこと】

・ルックアップをさせる指示をdisabledよりも後に記載した→NG(おそらく、return event;を記載しないとうまく動かないことから関数内でどれを先に書いたとしてもうまくいかない)

 

【実現したいこと】

・ルックアップ先に値が存在せずエラーとなった場合も、正常動作と同じようにフィールドをdisabledにしたい。

 

うまくいく方法などがございましたら、ヒントをいただけると助かります。

内容が想像できているか不安ですが、フィールド変更イベントに伴って、kintone.api() をコールし、それに応じて、disabledを設定しようという感じでしょうか。

 

kintone.api() を含む非同期処理後のレコードの値を操作するのに、kintone.app.record.get()/set() を利用しますが、disabled についてもこれらの関数で対応できますので、こちらで対応されると良いのではないかと思います。

 

認識合ってますでしょうか(合ってなさそうであれば、コードと共に課題を再掲頂ければ)。

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

コードで書いた方が伝わるかと思いまして、コードを載せます。

// レコードを編集するとき
kintone.events.on(‘app.record.edit.show’, function(event){

var record = event.record;

record[‘触らせたくないフィールド’][‘disabled’] = true;

var moji = record[‘文字フィールド’][‘value’];

if(moji != “”){

record['ルックアップ']['value'] = moji;

record['ルックアップ']['lookup'] = true;

record['文字フィールド']['value'] = "";

}

return event;

}


文字フィールドは、新規作成時に値が入れられていることを想定しています。

本題は、文字フィールドの値で、

  • その値はルックアップで取得できる・・・パターン1
  • その値はルックアップ先で消されたり間違った値のため取得できない・・・パターン2

とします。

パターン1は何事もなく、「触らせたくないフィールド」はdisabledになりますが

パターン2はルックアップがエラーになるので「触らせたくないフィールド」がdisabledになりません。

何かいい解決策などが、kintone.app.record.get/setなどでできますでしょうか?

手元で試してみると、ルックアップで取得できない「データがありません」のメッセージが出ても、disabledは効く様子ですね。

 

実は記載コードの他にカスタマイズの内容があれば、見た目上このケースで思った動作になってないという可能性は考えた方が良いかもしれません。非同期処理との兼ね合いがどこかにはたらいている可能性もありそうですが、プラグインを含めて同じイベントで非同期処理が入ってたりしないでしょうか。

 

試してみると良さそうに思われるのは、disabled処理を行う部分だけイベントを切り出して、あえて分離するというのがあります。disabledにする処理から記述する方が良いかと思います。

kintone.events.on(‘app.record.edit.show’, function(event){

var record = event.record;

record[‘触らせたくないフィールド’][‘disabled’] = true;

return event;

}

 

kintone.events.on(‘app.record.edit.show’, function(event){

var record = event.record;

var moji = record[‘文字フィールド’][‘value’];

if(moji != “”){

record['ルックアップ']['value'] = moji;

record['ルックアップ']['lookup'] = true;

record['文字フィールド']['value'] = "";

}

return event;

}

 

あとは、あまりよろしくないですが、無理やりセットするためにsetTimeout()でget/setをくくってしまうというのも試してみると良さそうです。

kintone.events.on(‘app.record.edit.show’, function(event){

var record = event.record;

var moji = record[‘文字フィールド’][‘value’];

if(moji != “”){

record['ルックアップ']['value'] = moji;

record['ルックアップ']['lookup'] = true;

record['文字フィールド']['value'] = "";

}

       setTimeout(function(){

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

           obj.record[‘触らせたくないフィールド’][‘disabled’] = true;

           kintone.app.record.set(obj);

       }, 0);

return event;

}

 

原因を探るのにもう一つ押さえておきたいのは、ルックアップによる値取得処理自体が非同期で動作しているという点ですが、ここまでの情報では、今回はあまり関連ないかと思います。

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

結論から言うと、 setTimeoutで解決 しました。

コードを単純にするために、「文字列」のサブテーブルになっていないフィールドで書いたのですが、実はdisabledにならなかったのは、サブテーブルだけの内容でした。通常のフィールドはdisabledになっていました。

イベントを分けるという方法は試しましたが、通常のフィールドはOKですが、サブテーブルはdisabledになりませんでした。

----下記 NGだったコード----

// レコードを編集するとき
kintone.events.on(‘app.record.edit.show’, function(event){

var record = event.record;

record[‘触らせたくないフィールド’][‘disabled’] = true; // ルックアップがNGでもOK

for(var i = 0 ; i < record[‘触らせたくないフィールドが含まれるテーブル’][[‘value’].length; i++ ){

record['触らせたくないフィールドが含まれるテーブル'][['value'][i]['value']['サブ触らせたくないフィールド']['disabled'] = true; // ルックアップがNGだとdisabledにならない。

  }

var moji = record[‘文字フィールド’][‘value’];

if(moji != “”){

record['ルックアップ']['value'] = moji;

record['ルックアップ']['lookup'] = true;

record['文字フィールド']['value'] = "";

}

return event;

}

実際のコードは、setTimeoutにして引数からdisabledだけまとめた別の関数を呼んで、別の関数の中でget/setを行うようにしました。助かりました!