[Google Sheets API] 連続したデータを設定する（オートフィル）

Google Sheets API v4（Java）を使用して、
スプレットシートの既存のデータを元に連続したデータを設定する方法
についてご紹介します。
オートフィルと呼ばれている機能です。

SheetsAPIでは、オートフィル機能を適用する方法は２パターンあります。
それぞれの状況に応じて使い分けるといいかと思います。

:::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-元となる範囲を指定するオートフィル)|
|2|[元となる範囲を指定しないオートフィル](#2-元となる範囲を指定しないオートフィル)|

## 1. 元となる範囲を指定するオートフィル
元となる範囲を指定して指定した行数or列数分をオートフィルで値を設定します。
設定する範囲内のセルに値がある場合は上書きされます。

**サンプル コード**
範囲の指定には「setSourceAndDestination(SourceAndDestination)」を使用します。
```
public Request autoFill(Integer sheetId) {
    Request request = new Request();

    GridRange grid = new GridRange(); //元となる範囲の指定
    grid.setSheetId(sheetId);         //シートID
    grid.setStartRowIndex(0);         //開始行(0スタート)
    grid.setEndRowIndex(1);           //終了行(1スタート)
    grid.setStartColumnIndex(0);      //開始列(0スタート)
    grid.setEndColumnIndex(3);        //終了列(1スタート)

    SourceAndDestination source = new SourceAndDestination(); //オートフィルを適用する範囲
    source.setSource(grid);          //自動入力のソースとして使用するデータの場所。
    source.setFillLength(20);        //データを入力する行、列の数。
    source.setDimension("ROWS");     //縦方向(ROWS)か、横方向(COLUMNS)

    AutoFillRequest r = new AutoFillRequest();
    r.setSourceAndDestination(source); //元となる範囲と適用範囲の設定
    r.setUseAlternateSeries(true);     //連続した値にしないか？

    request.setAutoFill(a);
    return request;
}
```
**実行結果**
このシートを元にオートフィル元の範囲を下記のそれぞれのパターンで実行しました。
1.　1行目のみ、A〜C列指定
2.　1〜2行目、A〜C列指定
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/bd996dc9-92d7-cc20-98e5-8237ceff359d.png">

1.　1行目のみ、A〜C列指定（setEndRowIndex(1)）
・setUseAlternateSeries(false)にした場合
　　日付はインクリメントされ、日付以外はそのまま貼り付けられます。
　　2行目にあった値は上書きされています。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/b1a25517-ff77-1e0d-7515-e4f1705dbf6b.png">

・setUseAlternateSeries(true)にした場合
　　数値はインクリメントされ、数値以外はそのまま貼り付けられます。
　　2行目にあった値は上書きされています。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2e19ed57-ad96-73c3-39a7-f5ff82327f42.png">

2.　1〜2行目、A〜C列指定（setEndRowIndex(2)）
・setUseAlternateSeries(false)にした場合
　　数値、日付は1、2行目の差分を3行目移行に反映して貼り付けられます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/70636a2b-fc61-42d5-916b-719054cf31ce.png">

・setUseAlternateSeries(true)にした場合
　　１、2行目の値を繰り返し貼り付けられます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2cb26dd2-3138-2c13-5a58-7a1309fdeb96.png">


## 2. 元となる範囲を指定しないオートフィル
元となる範囲を指定しないでオートフィルを設定します。
指定したセル範囲内の値が設定されているセルが自動で元となる範囲となります。
そのため、値を変更してオートフィルを最適用したい等、データを更新したい場合は使用できません。

また、オートフィルの方向（縦か横か）の指定もすることができません。
指定した範囲内のセルで空白がある方向にオートフィルされます。
（例えば、範囲指定がD列まででB列まで値がある場合は横方向になります）

**サンプル コード**
範囲の指定には「setRange(GridRange)」を使用します。
```
public Request autoFill(Integer sheetId) {
    Request request = new Request();

    GridRange range = new GridRange(); //オートフィル対象の範囲
    range.setSheetId(sheetId);         //設定するシートID
    range.setStartRowIndex(0);         //開始行(0スタート)
    range.setEndRowIndex(10);          //終了行(1スタート)
    range.setStartColumnIndex(0);      //開始列(0スタート)
    range.setEndColumnIndex(3);        //終了列(1スタート)

    AutoFillRequest r = new AutoFillRequest();
    r.setRange(range);                 //オートフィル対象となる範囲の設定
    r.setUseAlternateSeries(false);    //連続した値にしないか？

    request.setAutoFill(r);
    return request;
}
```
**実行結果**
同じく1行or2行とsetUseAlternateSeriesのtrue,falseの両方で試してみます。

1.　1行目のみの場合
　元にするシートです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/badb2686-dda0-894c-5837-b82811589feb.png">

・setUseAlternateSeries(false)にした場合
　　日付のみインクリメントされ、日付以外はそのまま繰り返し貼り付けられます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/0a62d962-e918-1ddf-44d3-fdd536350bb0.png">

・setUseAlternateSeries(true)にした場合
　　数値のみインクリメントされ、数値以外はそのまま繰り返し貼り付けられます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2ab6c007-c8f0-52f0-bd65-5b8f758332ed.png">

2.　2行目まである場合
　　元にするシートです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/bd996dc9-92d7-cc20-98e5-8237ceff359d.png">

・setUseAlternateSeries(false)にした場合
　　数値と日付は1行目と2行目の差分がインクリメントされ、文字列は繰り返し貼り付けられます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/bcf09b2c-d05f-f55b-2916-89f3d1439459.png">

・setUseAlternateSeries(true)にした場合
　　1行目と2行目を繰り返し貼り付けられます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/c4320fb5-5e7c-0fc2-3e83-e1d5f2a3f786.png">

おしまい。。