[Google Sheets API] グループ化を追加・更新・削除する

Google Sheets API v4（Java）を使用して、
スプレットシートのシート単位の保護と、セル範囲の保護の追加・更新・削除
についてご紹介します。

#### グループ化とは
指定したセルの範囲（行または列）をまとめて折りたたんで表示にしたり、
再表示したりする機能です。
単純な列、行の非表示機能とは異なり、複数の行、列をグループ化したり、
グループ化を入れ子(階層)にしたりできます。

<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/e06bb3e7-6705-ba74-c1d0-9902189c00f7.png">

グループ化を入れ子（階層）にした場合、
列なら上から１階層、２階層、３階層。。。
行なら左から１階層、２階層、３階層。。。
というように、より広い範囲が上位の階層となります。

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

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

|No||目次|
|---|---|---|
|1||[グループ化を追加](#1-グループ化を追加)|
|2||[グループ化を更新](#2-グループ化を更新)|
|3||[グループ化を削除](#3-グループ化を削除)|
||1|[階層で削除](#31-階層で削除)|
||2|[範囲を指定して削除](#32-範囲を指定して削除)|

## 1. グループ化を追加
行または列の範囲を指定してグループ化を追加します。

既に同じ行または列のグループ化がされている場合、
同じ位置にグループ化が追加されます。

**サンプル コード**
B〜C列をグループ化します。
```java
public Request addDimensionGroup(Integer sheetId) {
    Request request = new Request();

    DimensionRange range = new DimensionRange();
    range.setSheetId(sheetId);      //グループ化を追加するシートID
    range.setDimension("COLUMNS");  //行：ROWS、列：COLUMNS
    range.setStartIndex(1);         //行または列の開始位置
    range.setEndIndex(3);           //行または列の終了位置
    
    AddDimensionGroupRequest r = new AddDimensionGroupRequest();
    r.setRange(range);
    
    request.setAddDimensionGroup(r);
    return request;
}
```
**実行結果**
この状態で実行すると、
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/1580225c-72b7-5263-7a2d-2e8134771296.png">

指定した列の範囲にグループ化が追加されました。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/e18bf567-7066-a64a-c938-8cc3a832aab0.png">

## 2. グループ化を更新
設定済みのグループ化を閉じたり、開いたりできます。

指定するグループ化は、階層と範囲が一致したもののみになるようです。
階層と範囲が異なる場合はエラーになります。

更新対象のフィールド(setFields)は「collapsed」を指定します。

**サンプル コード**
列の第2階層目にあるB〜C列のグループ化を閉じます。
```java
public Request updateDimensionGroup(Integer sheetId) {
    Request request = new Request();

    DimensionRange range = new DimensionRange();
    range.setSheetId(sheetId);      //グループ化を更新するシートID
    range.setDimension("COLUMNS");  //行：ROWS、列：COLUMNS
    range.setStartIndex(1);         //行または列の開始位置
    range.setEndIndex(3);           //行または列の終了位置
    
    DimensionGroup group = new DimensionGroup();
    group.setCollapsed(true);       //true:グループ化を閉じる、false：グループ化を開く
    group.setDepth(2);              //階層を設定
    group.setRange(range);          //適用するグループ化を指定
    
    UpdateDimensionGroupRequest r = new UpdateDimensionGroupRequest();
    r.setDimensionGroup(group);
    r.setFields("collapsed");       //更新対象のフィールド
    
    request.setUpdateDimensionGroup(r);
    return request;
}
```
**実行結果**
この状態で実行すると、
　<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/e18bf567-7066-a64a-c938-8cc3a832aab0.png">

第２階層にあるB〜C列のグループ化が閉じました。
　<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/a7265f7b-a4ca-8a14-3b71-3acd54b65f71.png">

## 3. グループ化を削除
行または列で設定されているグループ化を削除します。

削除には
・階層単位で削除する方法
・範囲を指定して削除する方法
があります。

### 3.1. 階層で削除
削除する範囲を指定せず、行または列の指定のみで実行すると第１階層から削除されます。

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

    DimensionRange range = new DimensionRange();
    range.setSheetId(sheetId);    //削除するグループ化があるシートID
    range.setDimension("ROWS");   //行：ROWS、列：COLUMNS
    
    DeleteDimensionGroupRequest r = new DeleteDimensionGroupRequest();
    r.setRange(range);
    
    request.setDeleteDimensionGroup(r);
    return request;
}
```
**実行結果**
行のグループ化が第３階層まである場合、
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/edab27b0-358e-372b-402e-673b706fa982.png">

行の第１階層のグループ化が削除されました。
サンプルコードを繰り返して実行すると同じように第１階層から削除されていきます。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2e99b038-2613-5efa-a71c-74069fb8c9e1.png">

### 3.2. 範囲を指定して削除
グループ化の範囲を指定して削除されます。

範囲が完全に一致するグループ化がある場合はそのグループ化を
無い場合でその範囲を含むグループ化がある場合はその範囲だけ削除されます。

**サンプル コード**
B〜C列のグループ化を削除します。
```java
public Request deleteDimensionGroup(Integer sheetId) {
    Request request = new Request();

    DimensionRange range = new DimensionRange();
    range.setSheetId(sheetId);       //削除するグループ化があるシートID
    range.setDimension("COLUMNS");   //行：ROWS、列：COLUMNS
    range.setStartIndex(1);          //行または列の開始位置
    range.setEndIndex(3);            //行または列の終了位置
    
    DeleteDimensionGroupRequest r = new DeleteDimensionGroupRequest();
    r.setRange(range);
    
    request.setDeleteDimensionGroup(r);
    return request;
}
```
**実行結果**
この状態で実行すると、
　<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/e18bf567-7066-a64a-c938-8cc3a832aab0.png">

指定した範囲のグループ化のみが削除されました。
　<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/1580225c-72b7-5263-7a2d-2e8134771296.png">

**次は、グループ化の範囲内を指定した場合の例です。**
この範囲の列にグループ化が設定されていて、その範囲の間を指定した場合、
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/243d4df9-9e18-5222-39c2-90d319b18556.png">

指定した間のグループ化のみが削除され、2つに分割されます。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/5972cf7b-97ac-72bc-9b93-b3c7e52dabd1.png">

おしまい。。