ポータルに表示する内容を組織によって出し分けよう!〜kintoneのポータルカスタマイズ紹介 #2〜

目次

はじめに

Kintone Portal Designer (External link) を使ったポータルカスタマイズに関する記事の第2弾です!

ポータルの背景画像をkintoneのアプリで管理しよう!〜kintoneのポータルカスタマイズ紹介 #1〜 は、すでにお読みになりましたか?
まだの方は、ぜひ読んでいただけるとうれしいです。

今回の記事では、優先する組織を判別して、ポータルの内容を出し分けるカスタマイズを紹介したいと思います。
アプリに登録されたリッチエディターの内容をポータルのお知らせ欄に表示します。

使い方

こちらの記事は Kintone Portal Designer (External link) を使う前提でお話します。
「Kintone Portal Designer」の使い方については、 Kintone Portal Designerを使ってポータルをデザインしよう を参照してください。

information

本カスタマイズを利用する場合、カスタマイズを適用するユーザーに「優先する組織」を設定してください。
「優先する組織」が設定されていない場合、ポータルへ表示する内容を管理するアプリに登録された、いずれかのポータルの内容が表示されます。

STEP1ポータルに表示する内容を管理するアプリの作成

まずは、kintoneでアプリを作りましょう。
新しくアプリを作成して、以下のフィールドを設置してください。

あとで必要になるので、以下の内容をメモしておきましょう
  • 組織選択フィールド
  • リッチエディター

次に、1つレコードを登録しておきましょう。
組織選択フィールドには何も登録せず、リッチエディターに「Hello kintone」と書いて保存しましょう。

あとで必要になるので、以下の内容をメモしておきましょう
  • アプリのアプリID
  • 作成したレコードのレコード番号

URLを見ることでアプリIDとレコード番号を確認できます。
例:https://{subdomain}.cybozu.com/k/{ アプリID }/show#record={ レコード番号 }

アプリの使い方
  • 組織選択フィールド

    組織選択フィールドには、レコードの内容を表示させたい組織を入力します。
    入力された組織が優先する組織に該当する人のみに表示されます。

  • リッチエディター

    リッチエディターには、お知らせ欄に表示させたい内容を入力します。
    リッチエディターの内容がそのままお知らせ欄に表示されます。

STEP2カスタマイズに必要なファイルのダウンロード

以下のzipファイルをダウンロードして、解凍してください。

OrganizationSwitcher.zip

STEP3カスタマイズの変更

解凍したzipファイルの中にある「OrganizationSwitcher.json」を「Kintone Portal Designer」にインポートしましょう。

インポートの方法がわからない場合は、 Kintone Portal Designerを使ってポータルをデザインしよう を参照してください。
ここからは、「Kintone Portal Designer」を使いながら、メモした内容に合わせて、JavaScriptの内容を変更します。

アプリIDを指定

以下の部分の「12345」をメモしたアプリIDに変更しましょう。

1
2
// 管理アプリの指定
const MASTER_APPID = 12345;
優先する組織が含まれるレコードがなかったときに表示するレコードの指定

以下の部分の「1」をメモしたレコード番号に変更しましょう。

1
2
// 優先される組織が含まれるレコードがなかったときに表示するレコードの指定
const DEFAULT_RECORD_NUMBER = 1;
フィールドコードの指定

先ほどメモした、リッチエディターのフィールドコードと、組織選択フィールドのフィールドコードを指定しましょう。

1
2
3
4
5
// お知らせ欄に表示されるリッチエディターのフィールドコード
const RICH_TEXT_EDITOR_CODE = 'リッチエディター';

// 表示させたい組織の入力
const ORGANIZATION_CODE = '組織選択';

STEP4表示の確認

ここまで変更できたら「Save」を押して、ポータルに戻ってみましょう。
「Hello kintone」と表示されているはずです。

STEP5優先する組織に指定されたレコードの内容が表示されるかを確認する

先ほど登録したアプリに新しく別のレコードを登録しましょう。
組織選択フィールドには、ご自身の優先する組織を入力しましょう。
リッチエディターには「My Team Portal」と入力し、レコードを保存してください。

ポータルに戻ってみましょう。「My Team Portal」と表示されているはずです。

コードの解説

ここからは、詳しくJavaScriptの内容について解説していきます。
今回使用したコードは大きく分けて「自分の優先する組織が含まれるレコードを取得」と「リッチエディターの内容をポータルに表示」の2つで構成されています。

自分の優先する組織が含まれるレコードを取得

kintone REST APIの 複数のレコードを取得する を使用しています。

APIを実行して、レコードが取得できた時は、取得したレコードのリッチエディターの内容を返します。
取得できたレコードが0件のときは、DEFAULT_RECORD_NUMBERに設定されたレコードを取得する処理を行います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
const fetchNoti = function() {
  const params = {
    'app': MASTER_APPID,
    'query': ORGANIZATION_CODE + ' in (PRIMARY_ORGANIZATION()) limit 1',
    'fields': [RICH_TEXT_EDITOR_CODE]
  };

  return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then(function(resp) {
    if (resp.records.length === 0) {
      return fetchDefaultNoti();
    }
    return resp.records[0][RICH_TEXT_EDITOR_CODE].value;
  });
};

'query': ORGANIZATION_CODE + ' in (PRIMARY_ORGANIZATION()) limit 1'の部分を確認してください。
ここでは、組織選択フィールドに優先する組織PRIMARY_ORGANIZATION()が含まれるレコードをひとつだけ取得しています。

処理を実行するユーザーに「優先する組織」が設定されていない場合、組織in(PRIMARY_ORGANIZATION())の条件は無視され、それ以外の絞り込み条件を満たすすべてのレコードが取得されます。
詳しくは クエリの書き方 の「関数」部分を参照してください。

上記の処理で「取得できたレコードが0件」だった時に実行される処理はこちらです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const fetchDefaultNoti = function() {
  const defaultParams = {
    'app': MASTER_APPID,
    'id': DEFAULT_RECORD_NUMBER
  };

  return kintone.api(kintone.api.url('/k/v1/record', true), 'GET', defaultParams).then(function(resp) {
    return resp.record[RICH_TEXT_EDITOR_CODE].value;
  });
};

DEFAULT_RECORD_NUMBERに登録されているレコードのリッチエディターの内容を返します。

リッチエディターの内容をポータルに表示

以下の部分は、1で得られたリッチエディターの内容が表示される場所を取得しています。
今回はHTMLにIDを追加し、そのIDを使って、表示する場所を取得しています。

1
2
3
4
// 表示される場所のIDを指定
const NOTI_AREA_ID = 'noti_area';

const notiElArea = document.getElementById(NOTI_AREA_ID);

リッチエディターのvalueに格納されたhtmlにはスタイルが適用されているため、そのhtmlをそのまま表示させています。

1
2
3
const renderNotiContent = function(content) {
  notiElArea.innerHTML = content;
};

実行とエラー

最後の行で、今までのコードを実行しています。

1
fetchNoti().then(renderNotiContent).catch(errorMessage);

どこかでエラーが出た時は、以下の処理が実行されます。

1
2
3
4
const errorMessage = function(error) {
  const notiDate = error.message;
  alert('ポータルでの処理でエラーが発生しました。\nポータルの管理者にお問い合わせください。\n\nエラーの内容\n' + notiDate);
};

おわりに

今後も、kintoneのポータルのカスタマイズに関する記事を発信していく予定です。
ぜひ楽しみにお待ちください。

information

このTipsは、2019年10月版kintoneで動作を確認しています。