レコード編集時にログインユーザーの所属するグループ(ロール)によってフィールドの編集可否を設定したい

実現したいこと

編集画面を開いた時に、ログインユーザーの所属グループを取得し、グループaaaに所属するユーザー以外はフィールドbbb、cccを編集できないようにしたいです。
(プロセス管理で特定のステータスの時のみ上記動作をしたいため、kintone標準のアクセス権設定を使用しない方向で考えています)

発生したエラーメッセージ

const objGroups = await kintone.api(‘/v1/user/groups’, ‘GET’, {“code”: strCode});
を実行すると
「You cannot call kintone.app.record.get() in handler or during processing a handler.」
というエラーが発生します。
(objGroupsの中には正しくグループ情報が入ってくるのですが、エラーが発生するため処理が途中で止まってしまいます。。)

質問

・編集画面表示イベント内ではグループ情報取得APIが使えないのでしょうか?
・このエラーはどうすれば回避できますでしょうか?

コード

kintone.events.on(['app.record.edit.show','app.record.index.edit.show'], async function(event) {

    const strCode = kintone.getLoginUser().code;
    const objGroups = await kintone.api('/v1/user/groups', 'GET', {"code": strCode});
    const bolAuthority = objGroups.some(function(item){return ['aaa'].includes(item['code'])});

    if (bolAuthority==false) {
      set_field_disabled(event.record, ['bbb','ccc'], true); // フィールドbbb,cccを編集不可に
    };

    return event;
});

よろしくお願い致します。

1 Like

@fujiwara さん

こんにちは、気になったので回答させて頂きました。
「You cannot call kintone.app.record.get() in handler or during processing a handler.」
のエラーですが、違う箇所のエラーではないでしょうか?
そのまんまですが、 kintone.events.on() のイベントハンドラー内では、

kintone.app.record.get();

は使用できないという意味ですね。
書かれているコードには、書かれてないので違う箇所かと思われます。

また、もう一つ気になったのですが編集不可の方法として,

    if (bolAuthority==false) {
        event.record.bbb.disabled = true;
        event.record.ccc.disabled = true;
    };

このようにevent変数のパラメータを上書きしてreturn することで編集不可にすることにできます。

以下、参考リンク:

1 Like

@Yuki_Minamitani さん

ご返信ありがとうございます!

仰る通り、
kintone.app.record.get();
はどこでも呼んでないので、不思議に思っていました。

ちなみに
const objGroups = await kintone.api(‘/v1/user/groups’, ‘GET’, {“code”: strCode});
のawaitを外して
const objGroups = kintone.api(‘/v1/user/groups’, ‘GET’, {“code”: strCode});
にするとエラーは表示されなくなります。(Promiseオブジェクトは返りませんが…)
意味が分かりません(T-T)

ブラウザの開発ツールでデバッグすると上記API取得処理でエラーが発生するのでそこが怪しいのかと思っていたのですが…別の場所で競合が起こっていないか確かめてみます!

実は、こちら環境で

const bolAuthority = false;

ここだけこのようにして、上記の編集不可の部分を変更してテストしてみたら何も問題なく動いたんですよね…
ちなみにデバッグツールのネットワークタブの取得されたjsonってどうなってますか…?

1 Like

わざわざテストまでして頂いてるなんて、本当にありがとうございます<(_ _)>

ネットワークタブでjsonを確認したところ、groupsが正常に返ってきていました。
あとその同じタイミングでレコード取得処理も走っているのがわかりました。
当方ではカスタマインも使っているのですが、そちらで
kintone.app.record.get();
が呼ばれているのか、何か問題が起こっている可能性が高い気がしてきました…

上記グループ取得APIと同じタイミングで動いている、カスタマインのレコード取得&スペースにレコード一覧を配置する処理を無効にしたところ、上記エラーが起こらなくなりました。

またその後再度有効にしたところ、上記エラーが起こらなくなっていました。

よくわかっていませんが、カスタマインとjavascriptカスタマイズの保存のタイミング?などによる競合か何かだったようです。。競合コワいですね。。。

助言いただいたおかげで何とか進めそうです。本当にありがとうございました!

少しだけ進展がありました。

①javascriptカスタマイズファイルをアップロード
②カスタマインファイルをアップロード

の順だとエラーにならないのですが、

①カスタマインファイルをアップロード
②javascriptカスタマイズファイルをアップロード

の順にするとエラーになるようです。。。

正解かどうかわかりませんが、以下のようにタイマー処理を挟む(スレッドを切り離す?)ことでエラーが起こらないようになりましたので、備忘録代わりに残しておきます。。

kintone.events.on(['app.record.edit.show','app.record.index.edit.show'], async function(event) {

	setTimeout(async function(event){
		const current = kintone.app.record.get();
		const strCode = kintone.getLoginUser().code;
		const objGroups = await kintone.api('/v1/user/groups', 'GET', {"code": strCode});
		const bolAuthority = objGroups.some(function(item){return ['aaa'].includes(item['code'])});
		if (bolAuthority==false) {
			current.record.bbb.disabled = true;
			current.record.ccc.disabled = true;
		};
		kintone.app.record.set(current);
	},1000);
});
2 Likes

返信遅くなり申し訳ないです…
いえ、 @fujiwara さんのスキルで解決されただけのお話で私は何も…
でも、無事解決できたようでよかったです!

当方カスタマインを使用していないので理解として曖昧ですが、
なるほど、カスタマインで作成されたファイルと競合されていたのですね :sweat_drops:
以前どこかでJavaScriptファイルの並び順で読み込まれる順番が変わるとどこかに書かれていたのを思い出しましたね。
恐らくカスタマインで作成されたファイルでも、setTimeout()のような非同期処理が動いていてそれがたまたまgroups.jsonを取得するREST APIを同期処理でレスポンス待ちの間にそちらが動いちゃってエラーなのかなと勝手ながら想像してます :sweat_drops:
もし可能であればこういったプログラムの競合が起こる可能性があるので、カスタマインで作成されている処理に今回のコードを追記する形か自身でカスタマインで制御しているコードを構築された方がトラブルが少なくなるのではないかと考えます(カスタマイン意味なくなっちゃいますが…それともwebpackとかで編集不可になってる…?) :sweat_drops:

1 Like

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