AndroidからSheets API v4で新しいworksheetにデータを保存する方法

# 前提条件
SheetsAPIのサンプルが動いている前提です。
AndroidでSheetsAPIを利用する方法は[こちらの記事](http://qiita.com/InoueDaiki/items/77e5798a4933a2531c13)を参照してください。

# とりあえずソースコード

```java:MainActivity.java
@Override
protected List<String> doInBackground(Void... params) {
    try {
        putDataToNewSheetFromApi(); // ここで今回作成した関数を呼び出す
        return getDataFromApi();
    } catch (Exception e) {
        mLastError = e;
        cancel(true);
        return null;
    }
}

...

void putDataToNewSheetFromApi() throws IOException {
    String spreadsheetId = "保存したいスプレッドシートのID";
    // 保存したいシートの名前(ここではシート名が重複しないようにタイムスタンプを使用)
    String sheetName = String.valueOf(System.currentTimeMillis());
    BatchUpdateSpreadsheetRequest content = new BatchUpdateSpreadsheetRequest();
    List<Request> requests = new ArrayList<>();
    Request e = new Request();
    AddSheetRequest addSheet = new AddSheetRequest();
    SheetProperties properties = new SheetProperties();
    properties.setTitle(sheetName);
    addSheet.setProperties(properties);
    e.setAddSheet(addSheet);
    requests.add(e);
    content.setRequests(requests);
    BatchUpdateSpreadsheetResponse response = this.mService.spreadsheets().batchUpdate(
            spreadsheetId,
            content
    ).execute();
    String range = sheetName + "!A1:D1";
    ValueRange valueRange = new ValueRange();
    List row = new ArrayList<>();
    List col = new ArrayList();
    col.add("this");
    col.add("is");
    col.add("api");
    col.add("test");
    row.add(col);
    valueRange.setValues(row);
    valueRange.setRange(range);
    this.mService.spreadsheets().values()
            .update(spreadsheetId, range, valueRange)
            .setValueInputOption("USER_ENTERED")
            .execute();
}
```

# 解説
このソースコードは大きく分けて２つの部分に別れます。
前半は新しいシートを作成する部分、
後半は作成したシートにデータを保存する部分です。
一つの関数にまとめておく必要はないため、すでにデータを保存する関数がある場合は新しくシートを作るだけの関数を作成しても良いと思われます。
(ただし新しく生成したシート名をきちんと管理する必要がありますが…)

## 新しくシートを作成する
まずはシートを作成する部分についての解説をします。
SheetsAPIのworksheetsに対するBatchUpdateという機能を用いてシートを作成します。
リファレンスは[こちら](https://developers.google.com/sheets/reference/rest/v4/spreadsheets/batchUpdate)。

### インスタンスの生成

```java
    BatchUpdateSpreadsheetRequest content = new BatchUpdateSpreadsheetRequest();
    List<Request> requests = new ArrayList<>();
    Request e = new Request();
    AddSheetRequest addSheet = new AddSheetRequest();
    SheetProperties properties = new SheetProperties();
```

この部分で必要になるインスタンスはすべて生成しています。
すこし多めですが一つずつ説明します。

1. BatchUpdateSpreadsheetRequest
    - BatchUpdateを呼び出す際に渡す命令の集合
1. List<Request>
    - 命令を保持するリスト
1. Request
    - 個々の命令
1. AddSheetRequest
    - シートを追加する命令
1. SheetProperties
    - シートの設定(今回はシート名を指定するために使用するが必須ではない)

### インスタンスを組み合わせる
そしてこれらのインスタンスを次の部分で利用しています。

```java
    properties.setTitle(sheetName);
    addSheet.setProperties(properties);
    e.setAddSheet(addSheet);
    requests.add(e);
    content.setRequests(requests);
```

1. properties.setTitle(sheetName);
    - シート名を指定する
1. addSheet.setProperties(properties);
    - シートの設定を追加するシートの設定として登録
1. e.setAddSheet(addSheet);
    - シートの追加命令を命令として保存
1. requests.add(e);
    - 命令の一覧に追加
1. content.setRequests(requests);
    - 命令のリストを登録

### 関数の実行
最後にBatchUpdateを呼び出します。

```java
    BatchUpdateSpreadsheetResponse response = this.mService.spreadsheets().batchUpdate(
            spreadsheetId,
            content
    ).execute();
```

responseには新しく生成されたシートのIDが保持されています。
詳しくは[こちら](https://developers.google.com/sheets/reference/rest/v4/spreadsheets/response)。

## データを書き込む
この部分は以前書いた記事と内容が重複しますがついでなのでここで少し詳しく説明します。
リファレンスは[こちら](https://developers.google.com/sheets/reference/rest/v4/spreadsheets.values/update)。

```java
    String range = sheetName + "!A1:D1";
```

新しく作成したシート名を使ってデータを更新する領域を宣言しています。

```java
    ValueRange valueRange = new ValueRange();
    List row = new ArrayList<>();
    List col = new ArrayList();
    col.add("this");
    col.add("is");
    col.add("api");
    col.add("test");
    row.add(col);
    valueRange.setValues(row);
```

シートに追加するためのデータを作成します
追加するデータはListのListになっていなければいけません。
いまは横方向のリストデータを縦方向のリストに追加していますが、これは設定で変えることもできたりします。

```java
    valueRange.setRange(range);
    this.mService.spreadsheets().values()
            .update(spreadsheetId, range, valueRange)
            .setValueInputOption("USER_ENTERED")
            .execute();
```

最後に実際にデータを登録して実行しています。
`setValueInputOption`は必須項目です。

最後まで読んでいただきありがとうございます！