フィールドのアクセス権がない場合のJavaScriptの書き方

フィールドのアクセス権を「全社員に適用」(表示不可・編集不可)と「管理者だけに適用」(表示可・編集可)に分けてアプリを作成しました。

「管理者だけに適用」(表示可・編集可)したいフィールドにJavaScript制御を加えると、
「全社員に適用」(表示不可・編集不可)したいフィールドにJavaScriptが効かなくなります。

今は、「管理者だけに適用」したいJavaScriptコードを下の方において対応していますが、コンソールで見るとエラーが出ているので気になってきました。
「管理者だけに適用」したいフィールドに「if」を使えば回避できそうな気はしているのですが…わかりませんでした。

エラーがでない方法をご教示くださいますと幸いです。

■図

 

■コード

(function() {
    “use strict”;
    kintone.events.on(‘app.record.detail.show’, (event) => {

    var el1 = kintone.app.record.getFieldElement(‘管理者だけ表示_項目1’);
    if (event.record[‘管理者だけ表示_項目1’][‘value’] === “あああ”) 
    {
      el1.style.color = ‘#00FF00’;
      el1.style.fontWeight = ‘bold’;
      el1.style.backgroundColor = ‘#000000’;
      el1.style.fontSize = ‘large’;
      el1.style.textAlign = “center”;
    };

    var el2 = kintone.app.record.getFieldElement(‘管理者だけ表示_項目2’);
    if (event.record[‘管理者だけ表示_項目2’][‘value’] === “ううう”) {
      el2.style.color = ‘#00FF00’;
      el2.style.fontWeight = ‘bold’;
      el2.style.backgroundColor = ‘#000000’;
      el2.style.fontSize = ‘large’;
      el2.style.textAlign = “center”;
    };

    var el3 = kintone.app.record.getFieldElement(‘全員表示_項目2’);
    if (event.record[‘全員表示_項目2’][‘value’] === “えええ”) {
      el3.style.color = ‘#00FF00’;
      el3.style.fontWeight = ‘bold’;
      el3.style.backgroundColor = ‘yellow’;
      el3.style.fontSize = ‘large’;
      el3.style.textAlign = “center”;

    };
  return event;
  });
  })();

以上、よろしくお願いします。

オプショナルチェーンを使うか

  if (event.record['管理者だけ表示_項目1']?.value === "あああ") {

フィールドの存在を確認した後にifを使えば問題ないかと思います。

if (event.record['管理者だけ表示_項目1']) {
  if (event.record['管理者だけ表示_項目1'].value === "あああ") {

 

フィールドに限らずオブジェクトは1階層ずつアクセスしていき、参照できないオブジェクトから更に下の階層へアクセスしようとした時にエラーになります。本来なら

event: {
record: {
'管理者だけ表示': {
type: 'SINGLE_LINE_TEXT',
value: 'フィールドの値'
},
'他のフィールド': {
type: ...,
value: ...
}
}
}

となっていて「event.record.管理者だけ表示.value」でvalueまで辿ることができるのに対し、表示権限がないと

event: {
record: {
'他のフィールド': {
type: ...,
value: ...
}
}
}

とレコードオブジェクトからなくなっていて、レコードの下にある「管理者だけ表示」にアクセスしようとした段階でundefined(未定義)となり、その下のvalueにアクセスできないためエラーになっている状態です。

そのため「event.record[‘管理者だけ表示’]」がundefinedにならないか先にif文を追加したり、オプショナルチェーン(その次にアクセスできない場合即座にundefinedを返す)が必要になります。

1 Like

mls-hashimotoさま

 

できました。ありがとうございました!

解説も大変参考になりました!!

 

これでエラーのないJavaScriptが組めそうです!!!

すみません、やっぱりダメでした…

コピペボタンを設定(ネットのコピペ)したのですが、このときのオプショナルチェーンの入れ方が分かりません…

    navigator.clipboard.writeText(text1.record.temp_1.value);

↓ ↓ ↓

    if (navigator.clipboard.writeText(text1.[record.temp_1]?.value);

    と変えてみたのですが、違いますよね…

 

// コピペボタンを設置
    (function() {
    "use strict";

    var events = ['app.record.create.show','app.record.edit.show','app.record.detail.show'];
    kintone.events.on(events, function(event) {

    // コピーボタン1
    var myCopyFieldButton1 = document.createElement('button');
    myCopyFieldButton1.id = 'my_copy_field_1'; //スペースフィールド
    myCopyFieldButton1.innerText = 'Copy'; //ボタン名
    myCopyFieldButton1.onclick = function () { //クリックした際の動き
    var text1 = kintone.app.record.get();
    navigator.clipboard.writeText(text1.record.temp_1.value);
    };
    kintone.app.record.getSpaceElement('my_copy_field_1').appendChild(myCopyFieldButton1);

return event;
});
})();

※フィールド名は「temp_1」です

 

Ichiro Saito さま

そもそもこのtemp_1というフィールドは、ユーザー毎に閲覧権限を設定しているフィールドですか?その場合は以前に記載した内容と同じ(record.temp_1?.value)ですが…

とはいえオプショナルチェーンはundefinedを返すもので、フィールドがない場合はundefinedがコピーされます。またフィールドがあっても値がない場合は同様にundefinedがクリップボードにコピーされるので、避ける場合は

if (text1.record.temp_1?.value) { // ←フィールドがない場合は?の時点でfalsyとなりelse文を実行、ある場合は次のvalueでtruthyか判定
 navigator.clipboard.writeText(text1.record.temp_1.value);
alert('コピーしました')
} else {
alert('コピーできませんでした')
}

と、値やフィールドがある場合のみコピーを実行する処理にした方が良いでしょう。

mls-hashimotoさま

できました!

一皮むけた感じです!!

重ねてありがとうございます!!!

 

基礎・応用力がないので…ちょっとでも違うと対応できないのが悩みです ><

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