[Google Sheets API] スライサーを追加・更新・削除する

Google Sheets API v4（Java）を使用して、
スプレットシートのシートにスライサーを追加・更新・削除する方法
についてご紹介します。

**スライサーとは**
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/88a52dd5-5034-5093-f092-c3f9cd2d3e6c.png">

スライサーとは、セルの表示方法を自由に変更できる機能です。
フィルタ機能と似ていますが、表だけではなく、ピボットテーブル、グラフ等も
フィルタリングできるのが特徴です。
フィルタリングした結果の表示は保存されず、シートを再読み込みなどすると
リセットされてしまうのでご注意ください。

スプレットシートからは、メニュー：「データ」 ⇨　「スライサーを追加」
でスライサーの追加ができます。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する](https://qiita.com/doran/items/3d43f776188b2281044c)
を参照ください。
```
例：requests.add(moveDimension(sheetId)); //実行したいリクエストのMethodを指定
```
:::

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

|No|||目次|
|---|---|---|---|
|1|||[スライサーの追加](#1-スライサーの追加)|
||1||[スライサーのサイズと配置場所](#11-スライサーのサイズと配置場所)|
||2||[スライサーの仕様](#12-スライサーの仕様)|
|||1|[タイトルのテキスト形式の設定](#121-タイトルのテキスト形式の設定)|
|||2|[スライサーのデータ範囲](#122-スライサーのデータ範囲)|
|||3|[スライサーのフィルタリング基準](#123-スライサーのフィルタリング基準)|
|2|||[スライサーの更新](#2-スライサーの更新)|
|3|||[スライサーの削除](#3-スライサーの削除)|

## 1. スライサーの追加
スライサーを追加します。

追加時は下記３つを設定します。
・スライサー(オブジェクト)のID
・スライサーのサイズと配置場所
・スライサーの仕様

スライサーIDはすでに登録済みのオブジェクトIDがあるとエラーになります。
指定しなければ自動採番されます。

**サンプル コード**
```
public Request addSlicer(Integer sheetId) {
    Request request = new Request();

    Slicer slicer = new Slicer();
    //スライサー(オブジェクト)のID。省略時は自動採番
    slicer.setSlicerId(1);
    
    //スライサーのサイズと配置場所を設定
    slicer.setPosition(getEmbeddedObjectPosition(sheetId));
    
    //スライサーの仕様を設定
    slicer.setSpec(getSlicerSpec(sheetId));
    
    AddSlicerRequest r = new AddSlicerRequest();
    r.setSlicer(slicer);

    request.setAddSlicer(r);
    return request;
}
```
### 1.1. スライサーのサイズと配置場所
EmbeddedObjectPositionクラスで指定します。

配置する位置は、指定したセル(右下)からのオフセット値(ピクセル)になります。
例えば、
4行目D列　 ：　setRowIndex(3)、setColumnIndex(3)
(x,y)=(0,0)　：　setOffsetXPixels(0)、setOffsetYPixels(0)
と指定した場合、4列目D列のセルの右下に配置されます。

スライサーはデータ範囲と同じセルに配置する必要があるため、
setSheetId()、setNewSheet()は使用できません。

**サンプル コード**
```
public EmbeddedObjectPosition getEmbeddedObjectPosition(Integer sheetId) {
    EmbeddedObjectPosition pos = new EmbeddedObjectPosition();
    
    OverlayPosition overlay = new OverlayPosition();
    //起点となるセルの指定
    GridCoordinate grid = new GridCoordinate();
    grid.setSheetId(sheetId); 			//配置するシートID
    grid.setRowIndex(10); 				//開始行(0スタート)
    grid.setColumnIndex(10); 			//開始列(0スタート)
    overlay.setAnchorCell(grid);		//オブジェクトが固定されているセル。
    
    //起点となるセルからのオフセット値
    overlay.setOffsetXPixels(0);		//開始X座標。
    overlay.setOffsetYPixels(0);		//開始Y座標。
//	overlay.setHeightPixels(50);		//高さ。省略時は371px
//	overlay.setWidthPixels(50);		    //幅。省略時は600px

    pos.setOverlayPosition(overlay);	//オブジェクトがグリッドの上にオーバーレイされる位置。
    
    return pos;
}
```
### 1.2. スライサーの仕様
SlicerSpecクラスでスライサーの仕様を設定します。

タイトルの水平方向の配置はsetHorizontalAlignment()で指定できます。
|alignment|水平方向の配置|
|---|---|
|LEFT|左寄せ|
|CENTER|中央|
|RIGHT|右寄せ|

**サンプル コード**
```
public SlicerSpec getSlicerSpec(Integer sheetId) {
    SlicerSpec spec = new SlicerSpec();
    
    //スライサーのタイトル
    spec.setTitle("test");
    
    //スライサーのタイトルのテキスト形式
    spec.setTextFormat(getTextFormat());
    
    //スライサーのタイトルの水平方向の配置(デフォルトはLEFT)
    spec.setHorizontalAlignment("CENTER");
    
    //ピボットテーブルに適用するか？
    spec.setApplyToPivotTables(true);

    //スライサーの背景色
    spec.setBackgroundColor(new Color().setBlue(1.0f));   //または setBackgroundColorStyle
    
    //フィルターが適用されるデータテーブル内の列インデックス
    spec.setColumnIndex(0);
    
    //スライサーのデータ範囲
    spec.setDataRange(getGridRange(sheetId));

    //スライサーのフィルタリング基準
    spec.setFilterCriteria(getFilterCriteria());
    
    return spec;
}
```
#### 1.2.1. タイトルのテキスト形式の設定
TextFormatクラスでテキスト形式を設定できます。
スライサーの場合、
下線(setUnderline())と取り消し線(setStrikethrough())は使えません。

**サンプル コード**
```
public TextFormat getTextFormat() {
    TextFormat format = new TextFormat();
    
    format.setBold(true);	        //ボールドか？
    format.setItalic(true);         //イタリックか？
    format.setFontSize(14);	        //フォントサイズ
　　　　　　　　format.setFontFamily("Arial");	//フォントファミリ名

    //テキストの色
    Color cc = new Color();
    cc.setRed(1.0f).setGreen(0f).setBlue(0f);
    format.setForegroundColor(cc);

    return format;
}
```
#### 1.2.2. スライサーのデータ範囲
GridRangeクラスでデータ範囲を設定します。

**サンプル コード**
```
public GridRange getGridRange(Integer sheetId) {
    GridRange range = new GridRange();
    
    range.setSheetId(sheetId);      //設定するシートID
    range.setStartRowIndex(0);      //開始行(0スタート)
    range.setEndRowIndex(4);        //終了行(1スタート)
    range.setStartColumnIndex(0);   //開始列(0スタート))
    range.setEndColumnIndex(3);     //終了列(1スタート)
    
    return range;
}
```
#### 1.2.3. スライサーのフィルタリング基準
FilterCriteriaクラスでフィルタの内容を設定します。

フィルタリングの設定については、
下記記事に詳細をまとめてますのでこちらを参照ください。
[⧉[Google Sheets API] セルに入力規則を設定する](https://qiita.com/doran/items/02c75929be3da4f7bd9f)

**サンプル コード**
```
public FilterCriteria getFilterCriteria(){
    FilterCriteria filter = new FilterCriteria();
    
    BooleanCondition con = new BooleanCondition();
    List<ConditionValue> values = new ArrayList<>();
    ConditionValue value = new ConditionValue();
    value.setUserEnteredValue("2023-03-01");  //「2023-03-01」以降の日
    values.add(value);
    con.setValues(values);                    //条件の値。
    con.setType("DATE_AFTER");                //「次より後の日付」を指定
    
    filter.setCondition(con);
}
```
## 2. スライサーの更新
設定済みのスライサーを更新します。

スライサーの更新時に下記を指定します。
・更新するスライサー(オブジェクト)のID
・更新するスライサーの仕様

更新するスライサーの仕様は、「1. スライサーの追加」と同じSlicerSpecクラスを使います。
内容はそちらをご覧ください。

**サンプル コード**
```
public Request updateSlicerSpec(Integer sheetId) {
    Request request = new Request();

    UpdateSlicerSpecRequest r = new UpdateSlicerSpecRequest();
    r.setSlicerId(1);                   //更新するスライサー(オブジェクト)のID
    r.setSpec(getSlicerSpec(sheetId));  //更新するスライサーの仕様

    request.setUpdateSlicerSpec(r);
    return request;
}
```
## 3. スライサーの削除
スライサーを削除します。

**サンプル コード**
```
public Request deleteEmbeddedObject() {
    Request request = new Request();

    DeleteEmbeddedObjectRequest r = new DeleteEmbeddedObjectRequest();
    r.setObjectId(1);			//削除するオブジェクトのID。

    request.setDeleteEmbeddedObject(r);
    return request;
}
```

<br>
おしまい。。