プリザンターで選択肢一覧を取得する方法

## はじめに
プリザンターでよく使われる分類項目の選択肢一覧。リンク項目を使用せずにベタ打ちで運用しているサイトも多いかと思います。このときにちょっと困ったことになるのが、選択肢自体をパッと取得する方法がないことです。
実はいろいろと対応方があるので、紹介します。

## Wiki化してリンク項目とする
実はプリザンターのリンク項目は、Wikiにも使えます。使い方はとても簡単で、

1. 新しくWikiを作り内容に選択肢一覧をコピー
1. そのWikiを項目に対するリンクにする

これだけです。WikiのサイトIDの取得方法にちょっと癖があるので、詳細はマニュアルの「[Wiki機能：選択肢一覧のマスタデータとして使用する](https://pleasanter.org/ja/manual/wiki-master)」を参照してください。
この方法のメリットはなんといっても選択肢一覧が他のサイトでも共通化して使い回せることです。
外部システムなどからデータを取得する際もAPIの`get`や`items/get`、更新も`items/update`が使えるため、利便性が高いです。

## SiteSettingsから取得する
どうしても新しくリンク項目を作りたくない場合などは、SiteSettingsからデータを取得する方法があります。
プリザンターのサイトの構成データは`[Sites]`テーブルに格納されています。この中の`[SiteSettings]`カラムに各種設定がJSON化して格納されています。
サンプルとして、分類項目Aに次のような設定を入れているサイトのSiteSettingsを抜き出してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/8e1d6a7f-c428-7a39-0f62-42c9749abf03.png)

```json
{
	"Version": 1.017,
	"ReferenceType": "Results",
	"GridColumns": [
		"ResultId",
		"TitleBody",
		"Comments",
		"Status",
		"Manager",
		"Owner",
		"AttachmentsA",
		"ClassA",
		"NumA",
		"Updator",
		"UpdatedTime"
	],
	"EditorColumnHash": {
		"General": [
			"ResultId",
			"Ver",
			"Title",
			"Body",
			"Status",
			"Manager",
			"Owner",
			"Comments",
			"AttachmentsA",
			"NumA",
			"ClassA",
			"CheckA"
		]
	},
	"HistoryColumns": [
		"Ver",
		"Title",
		"Comments",
		"Status",
		"Owner",
		"Updator",
		"UpdatedTime",
		"AttachmentsA"
	],
	"Columns": [
		{
			"ColumnName": "NumA",
			"Format": "#,##.0;\"\";\"▲\"#,##.0"
		},
		{
			"ColumnName": "ClassA",
			"LabelText": "選択肢項目",
			"ChoicesText": "a\nb\nc\nd\ne",
			"SearchType": "PartialMatch"
		}
	],
	"Formulas": [
		{
			"CalculationMethod": "Extended",
			"Target": "NumA",
			"FormulaScript": "$IF(チェックA,1,0)",
			"FormulaMapping": "{\"CheckA\":\"チェックA\"}",
			"Id": 1
		}
	],
	"NoDisplayIfReadOnly": false
}
```
ここで注目するところは`Columns`プロパティの中身です。
```plantuml
@startjson
#highlight "Columns" / "1" / "ChoicesText"
{
	"Version": 1.017,
	"ReferenceType": "Results",
	"GridColumns": [
		"ResultId",
		"TitleBody",
		"Comments",
		"Status",
		"Manager",
		"Owner",
		"AttachmentsA",
		"ClassA",
		"NumA",
		"Updator",
		"UpdatedTime"
	],
	"EditorColumnHash": {
		"General": [
			"ResultId",
			"Ver",
			"Title",
			"Body",
			"Status",
			"Manager",
			"Owner",
			"Comments",
			"AttachmentsA",
			"NumA",
			"ClassA",
			"CheckA"
		]
	},
	"HistoryColumns": [
		"Ver",
		"Title",
		"Comments",
		"Status",
		"Owner",
		"Updator",
		"UpdatedTime",
		"AttachmentsA"
	],
	"Columns": [
		{
			"ColumnName": "NumA",
			"Format": "#,##.0;\"\";\"▲\"#,##.0"
		},
		{
			"ColumnName": "ClassA",
			"LabelText": "選択肢項目",
			"ChoicesText": "a\nb\nc\nd\ne",
			"SearchType": "PartialMatch"
		}
	],
	"Formulas": [
		{
			"CalculationMethod": "Extended",
			"Target": "NumA",
			"FormulaScript": "$IF(チェックA,1,0)",
			"FormulaMapping": "{\"CheckA\":\"チェックA\"}",
			"Id": 1
		}
	],
	"NoDisplayIfReadOnly": false
}
@endjson
```
`ColumnName:ClassA`となっているクラスの`ChoicesText`プロパティを見ると設定された選択肢一覧が格納されています。
これを適当なクエリを書いて抜き出してくればOKです。MSSQLで書くとこんな感じになります。
```sql
SELECT
    JSON_VALUE([SiteSettings], '$.Columns[1].ChoicesText')
FROM
    [Sites]
WHERE
    [SiteId] = 3482327
```
インデックスの部分はサイトの項目変更で変わる可能性があるので、随時追従させていくか、`OPENJSON`を使ってダイナミックに動くようにする必要があります。C#などのプログラムでクラスにバインディングして扱うことも勿論可能です。その場合は、[SiteSettings.cs](https://github.com/Implem/Implem.Pleasanter/blob/main/Implem.Pleasanter/Libraries/Settings/SiteSettings.cs)を参考にクラスを作成してください。

## まとめ
選択肢一覧に設定したデータを取得する方法を紹介しました。
オススメはWiki化する方法ですが、SiteSettingsからデータを取得する方法もあります。使われている環境にあわせて使い分けてみてください。