[Google Sheets API] セルに入力規則を設定する

Google Sheets API v4（Java）を使用して、
スプレットシートのセルに入力規則を設定する場合、設定可能な内容
についてご紹介します。

**セルの入力規則とは**
セルに入力するデータを制限したり、設定したルールとは違う入力をしたときに
警告を表示したりできる機能です。

セルの入力規制はDataValidationRuleクラスで指定できますが、
ここでは指定可能な内容のみを記事にしています。

:::note info
実際に使用したい場合は下記の記事と合わせてご覧ください。
[⧉[Google Sheets API] セルの内容(値、メモ、リッチテキスト、表示形式(書式)、ピボットテーブル、入力規則)を設定する](https://qiita.com/doran/items/d4e048fc41b4132a4b44)
:::

:::note info
その他のGoogle Sheets APIは、下記の記事を参照ください。
[⧉[Google Sheets API] JavaでスプレットシートのメニューとAPIを関連づけてみた](https://qiita.com/doran/items/2f6f8932b994fbd1a170)
:::


|No|目次|
|---|---|
|1|[選択したセルのヘルプオプションを表示](#1-選択したセルのヘルプオプションを表示)|
|2|[データが無効の場合の挙動](#2-データが無効の場合の挙動)|
|3|[表示スタイル（プルダウンのみ）](#3-表示スタイルプルダウンのみ)|
|4|[適用条件](#4-適用条件)|

**サンプル コード**
入力規則の例を示します。
各々の設定できる内容については以降の記事を参照ください。
```
public DataValidationRule getDataValidationRule(){
    DataValidationRule rule = new DataValidationRule();
    
    BooleanCondition condition = new BooleanCondition();
    condition.setType("ONE_OF_LIST");   //適用条件
    List<ConditionValue> values = new ArrayList<>();
    ConditionValue value = new ConditionValue();
    values.add(value);
    condition.setValues(values);
    
    rule.setCondition(condition);	    //適用条件
    rule.setInputMessage("これは違うよ");	//選択したセルのヘルプオプションを表示
    rule.setShowCustomUi(false);        //表示スタイル
    rule.setStrict(true);               //データが無効の場合の挙動

    return rule;
}
```

#### 1. 選択したセルのヘルプオプションを表示
入力規則に反する内容を入力した場合に表示されるダイアログのメッセージを
設定できます。

・メッセージを設定しない(デフォルト)の場合
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/62d0651e-1c50-a164-dbc3-eba178e632bf.png">

・メッセージを設定した場合
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2677de7b-8ee4-2ca7-5a1f-94664671c528.png">
```
DataValidationRule rule = new DataValidationRule();
rule.setInputMessage("これは違うよ");
```
#### 2. データが無効の場合の挙動
データが適用条件に当てはまらない場合の挙動を設定できます。

・入力を拒否(setStric(true))
　　セルに入力されたデータは破棄されます。
  
・警告を表示(setStrict(false))
　　セルに入力されたデータはそのまま残り、警告が表示されます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/492f81c3-466a-5ea4-b44b-ed445f56d5e1.png">
```
DataValidationRule rule = new DataValidationRule();
rule.setStrict(true);     //true:入力拒否、false:警告表示
```

#### 3. 表示スタイル（プルダウンのみ）
セルの表示方法を指定できます。
適用条件が「プルダウン」と「プルダウン(範囲内)」のみ設定が可能です。

・チップ
setShowCustomUi(true)、setStrict(false)
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/d95f9eb5-853b-865d-4871-11507fc7aa4c.png">

・矢印
setShowCustomUi(true)、setStrict(true)
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/0030eb74-9737-46fa-a45b-2237eae729bc.png">

・書式なしテキスト
setShowCustomUi(false)、setStrict(true)
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/11598c76-a6f0-b336-0310-3bfbeebeeed9.png">
```
DataValidationRule rule = new DataValidationRule();
//チップ
rule.setShowCustomUi(true);rule.setStrict(false);
//矢印
//rule.setShowCustomUi(true);rule.setStrict(true);
//書式なしテキスト
//rule.setShowCustomUi(false);rule.setStrict(true);
```
#### 4. 適用条件
セルに入力した際にチェックする入力規則を設定できます。

例１.プルダウンで「選択項目1」、「選択項目2」が選択する場合
```
DataValidationRule rule = new DataValidationRule();

BooleanCondition condition = new BooleanCondition();
condition.setType("ONE_OF_LIST");          //「プルダウン」を指定
List<ConditionValue> values = new ArrayList<>();
ConditionValue value1 = new ConditionValue();
value1.setUserEnteredValue("選択項目1");    //選択項目を追加
values.add(value1);
ConditionValue value2 = new ConditionValue();
value2.setUserEnteredValue("選択項目2");    //選択項目を追加
values.add(value2);
condition.setValues(values);

rule.setCondition(condition);	          //適用条件の設定
```
例2.「本日以前の日付」のみ入力可能な場合
```
DataValidationRule rule = new DataValidationRule();

BooleanCondition condition = new BooleanCondition();
condition.setType("DATE_ON_OR_BEFORE");  //「指定した日以前の日付」を指定
List<ConditionValue> values = new ArrayList<>();
ConditionValue value = new ConditionValue();
value.setRelativeDate("TODAY");          //「本日」を指定
values.add(value);
condition.setValues(values);

rule.setCondition(condition);	        //適用条件の設定
```

適用条件を下記一覧にまとめました。

タイトルのtype/RelativeDateは、
タイトルのサブがない場合、BooleanConditionのsetTypeで指定する文字列で、
タイトルのサブがある場合、ConditionValueのsetRelativeDateで指定する文字列です。

タイトルのvalueは、
ConditionValueのsetUserEnteredValueで設定しなければならない数です。
表の数と異なる場合はエラーになります。

|条件|サブ|type/RelativeDate|value|
|---|---|---|---|
|プルダウン||ONE_OF_LIST|1〜|
|プルダウン(範囲内)||ONE_OF_RANGE|1|
|次を含むテキスト||TEXT_CONTAINS|1|
|次を含まないテキスト||TEXT_NOT_CONTAINS|1|
|完全一致するテキスト||TEXT_EQ|1|
|有効なメールアドレスであるテキスト||TEXT_IS_EMAIL|0|
|有効なURLであるテキスト||TEXT_IS_URL|0|
|有効な日付||DATE_IS_VALID|0|
|日付||DATE_EQ||
||本日|TODAY|0|
||明日|TOMORROW|0|
||昨日|YESTERDAY|0|
||過去1週間以内|PAST_WEEK|0|
||過去1ヶ月以内|PAST_MONTH|0|
||過去1年以内|PAST_YEAR|0|
||正確な日付||1|
|次より前の日付||DATE_BEFORE||
||本日|TODAY|0|
||明日|TOMORROW|0|
||昨日|YESTERDAY|0|
||過去1週間以内|PAST_WEEK|0|
||過去1ヶ月以内|PAST_MONTH|0|
||過去1年以内|PAST_YEAR|0|
||正確な日付||1|
|指定した日以前の日付||DATE_ON_OR_BEFORE||
||本日|TODAY|0|
||明日|TOMORROW|0|
||昨日|YESTERDAY|0|
||過去1週間以内|PAST_WEEK|0|
||過去1ヶ月以内|PAST_MONTH|0|
||過去1年以内|PAST_YEAR|0|
||正確な日付||1|
|次より後の日付||DATE_AFTER||
||本日|TODAY|0|
||明日|TOMORROW|0|
||昨日|YESTERDAY|0|
||正確な日付||1|
|指定した日以降の日付||DATE_ON_OR_AFTER||
||本日|TODAY|0|
||明日|TOMORROW|0|
||昨日|YESTERDAY|0|
||正確な日付||1|
|指定した期間内の日付||DATE_BETWEEN|2|
|指定した期間外の日付||DATE_NOT_BETWEEN|2|
|次より大きい||NUMBER_GREATER|1|
|以上||NUMBER_GREATER_THAN_EQ|1|
|次より小さい||NUMBER_LESS|1|
|以下||NUMBER_LESS_THAN_EQ|1|
|次と等しい||NUMBER_EQ|1|
|次と等しくない||NUMBER_NOT_EQ|1|
|次の間にある||NUMBER_BETWEEN|2|
|次の間にない||NUMBER_NOT_BETWEEN|2|
|チェックボックス||BOOLEAN|0 or 2|
|カスタム数式||CUSTOM_FORMULA|1|


おしまい。。