rex0220 計算式プラグインの使い方をGPTsに学習させてみる（その１１）チェックボックスの処理を学習

[rex0220 計算式プラグインの使い方をGPTsに学習させてみる（その１０）機能別に計算式を学習](https://qiita.com/rex0220/items/1b0161401d65e1e6c3d8)の続きです。

チェックボックスの処理を学習させてみます。

# 概要

チェックボックスの使用方法と配列処理を学習させて、応答内容の改善を図る。
チェックボックスは、複数の選択肢を値として持つので、配列処理が必要になるので配列を返す関数の使用例を学習させる。

# チェックボックスの使用方法の学習
チェックボックスと複数選択項目は、複数の選択肢を値として持つので使用例も同様に設定する。
コメントに解説文を記述

```
・チェックボックス、複数選択の選択肢のカウント
ARRAY_COUNT(チェックボックス)
ARRAY_COUNT(複数選択)

・チェックボックス、複数選択項目が選択されているか判定
チェックボックス、複数選択項目をそのまま判定すると、選択肢をカンマ区切りの文字列として取得します。
そのため、文字列があるかどうかと同じ判定が出見ます。
IF(チェックボックス,1,0)    // 1:選択されている, 0: 選択なし
IF(複数選択,1,0)    // 1:選択されている, 0: 選択なし

・チェックボックス、複数選択項目に特定の選択のみがされているか判定は、 == の文字列比較で出来ます。
チェックボックス　== "A,B"    // "A" と "B" のみが選択されている場合、true。　それ以外は false
複数選択　== "A,B"    // "A" と "B" のみが選択されている場合、true。　それ以外は false

・チェックボックス、複数選択項目に特定の選択がされているか判定
IN(チェックボックス,"A","B")    // "A" または "B" が選択されている
IN(複数選択,"A","B")   // "A" または "B" が選択されている

・チェックボックス、複数選択項目に特定の複数選択がされているか判定
INTERSECT 関数で配列の積集合（両方の配列に存在する値を配列で返す）を使って、複数選択の判定ができます。
LET(x,ARRAY("A","B"),   // 判定用配列
  y,INTERSECT(チェックボックス,x),  // チェックボックスとの積集合
  ARRAY_COUNT(x) == ARRAY_COUNT(y) // 判定用配列の要素数とチェック
)

LET(x,ARRAY("A","B"),   // 判定用配列
  y,INTERSECT(複数選択,x),  // 複数選択との積集合
  ARRAY_COUNT(x) == ARRAY_COUNT(y) // 判定用配列の要素数とチェック
)
```

# 配列処理の学習
配列を返す関数とその使用例をまとめて学習させる。

```
配列計算について

・配列を返す関数
ARRAY(1,2,3) -> [1,2,3]
ARRAY("A","B","C") -> ["A","B","C"]
ARRAY("A",ARRAY("B","C")) -> ["A","B","C"]  // 配列をマージ
DISTINCT(1,2,3,1) -> [1,2,3]    // 値の重複値を排除し、配列化
DISTINCT("A","B","C","A") -> ["A","B","C"]　// 値の重複値を排除し、配列化
DISTINCT("A","B",ARRAY("C","A")) -> ["A","B","C"]　// 値の重複値を排除し、配列化

INTERSECT(ARRAY("ABC","DEF","XYZ"),ARRAY("XYZ","ABC")) -> ["ABC","XYZ"] // 配列の積集合
MATCH("ABCDEXXXAXC","A.C","g") -> ["ABC","AXC"] // 文字列の検索(正規表現)で、文字列（g オプション指定時は配列）を返す
RANDBETWEEN(1,10,10) -> [6,9,6,3,5,3,3,10,9,5]  // 指定された範囲で整数の乱数を生成
REVERSE(ARRAY("ABC","XYZ")) -> ["XYZ","ABC"] // 配列の反転
SHUFFLE(ARRAY("A","B","C","D","E")) // 配列をランダムに並び変え
SLICE(ARRAY("A","B","C"),0,2) -> ["A","B"]  // 配列の切り出し
SLICE(ARRAY("A","B","C"),-2) -> ["B","C"]   // 配列の切り出し
SPILT("ABC,XYZ",",") -> ["ABC","XYZ"]   // 区切り文字","で配列に変換
SPLIT("ABC","") -> ["A","B","C"]    // 1文字毎に配列に変換（区切り文字""で配列に変換）
TARRAY(文字列T) -> ["A","B","C"] // テーブル内項目を配列にする ※文字列Tの各行が"A","B","C"
TARRAYIF(IN(ドロップダウンT,"A","B"), 文字列T)  // ドロップダウンTが"A"または"B"の条件で文字列Tを配列にする
TDS(文字列T) -> ["A","B","C"] // テーブル内項目を値の重複値を排除して配列にする ※文字列Tの各行が"A","B","C"
TDSIF(IN(ドロップダウンT,"A","B"), 文字列T)  // ドロップダウンTが"A"または"B"の条件で文字列Tを値の重複値を排除して配列にする


ARRAY_DEL(ARRAY("A","B"),"A") -> ["B"] // 配列要素を削除

ARRAY_FOR(3,"A") -> ["A","A","A"]   // 指定した要素数の配列に変換※最大数 1000
ARRAY_FOR(3,idx,"A"&idx) -> ["A1","A2","A3"] // 指定した要素数の配列に計算式で文字列にして変換

ARRAY_FIL(ARRAY(1,2,3),xx,xx>1) -> [2,3]    // 配列の要素を式でフィルタリング
ARRAY_FIL(ARRAY("A","B","C"),xx,xx!="A") -> ["B","C"] // 配列の要素を"A"以外でフィルタリング
ARRAY_FIL(ARRAY(1,2,3),xx,idx,idx>1) -> [3] // 配列の要素を インデックス>1 でフィルタリング

ARRAY_MAP(ARRAY(1,2,3),xx,xx*3) -> [3,6,9]  // 配列要素を３倍にして返す
ARRAY_MAP(ARRAY(1,2,3),xx,"A"&xx) -> ["A1","A2","A3"]   // 配列要素に"A"を付加して返す
ARRAY_MAP(ARRAY("A","B","C"),xx,"A"&xx) -> ["AA","AB","AC"] // 配列要素に"A"を付加して返す
ARRAY_MAP(ARRAY(1,2,3),xx,idx,xx+idx) -> [1,3,5]    // 配列要素にインデックス値を加算して返す

ARRAY_SORT(ARRAY("A","X","B")) -> ["A","B","X"] // 配列要素をソート
ARRAY_SORT(ARRAY("A","X","B"),0) -> ["X","B","A"] // 配列要素を逆順にソート

・テーブル項目に重複する値があるかチェック
TDUPCK(文字列T) // テーブル重複値チェックし、重複がある場合、true 。空文字を除外するオプションが無い場合、空文字を除外しない。重複を見つけたら処理が終了するため、効率がいい。
TDUPCK(文字列T) -> false //※(文字列Tが"A","B","C")  // テーブル重複値チェックする。空文字を除外しない。
TDUPCK(文字列T) -> true //※(文字列Tが"A","B","A")   // テーブル重複値チェックする。空文字を除外しない。
TDUPCK(文字列T) -> true //※(文字列Tが"A","","") // テーブル重複値チェックする。空文字を除外しない。
TDUPCK(文字列T,0) -> true //※(文字列Tが"A","","") // テーブル重複値チェックする。空文字を除外しないオプションにより空文字を除外しない。
TDUPCK(文字列T,1) -> false //※(文字列Tが"A","","")  // テーブル重複値チェックする。空文字を除外するオプションを指定している。

・テーブルの指定行にある項目を取得
SUBTABLE(数値T,0)   // テーブル先頭行の数値項目T の値を取得
SUBTABLE(数値T,1)   // テーブル2行目の数値項目T の値を取得
SUBTABLE(数値T,ROWNO(テーブル))   // ROWNO(テーブル)で示されるテーブル処理中の行の数値項目T の値を取得
```

# チェックボックスの選択肢の判定
「チェックボックスの選択肢がAまたはBがある場合に、”X".　それ以外の場合は"Y" に設定する計算式は？」
少し冗長な計算式を応答。
学習させた使用例では、IN 関数で「AまたはB」をチェックできるのだが、反映されていない。

![2023-11-18_20h35_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ce92160c-dc03-7db6-c40e-d2f8ef3257e3.png)

# 計算式の改善
「OR を使わずに IN 関数でチェックできるのでは？」
IN 関数でまとめられた。

![2023-11-18_20h38_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/664aa62a-e6ff-e29f-af20-e337e6080d89.png)

# 「チェックボックスの選択肢の要素に "ABC" の文字列を付与する計算式は？」
- 1回目は、配列の例
![2023-11-19_17h02_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e0763c20-91f1-262d-18d0-647c4d8d1c10.png)

- 2回目は、チェックボックスの例になった
![2023-11-19_17h04_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d828c568-c72d-6e3e-cc6b-eaa84568fbe5.png)