[Google Sheets API] Bigqueryのデータを使用して表を作成する

Google Sheets API v4（Java）を使用して、
スプレットシートにBigqueryのデータを使用して表を作成する方法
についてご紹介します。

メニュー：「データ」 ⇨　「データコネクタ」 ⇨　「Bigquery に接続」
で実行できる内容と同じです。

:::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|[テーブルをそのまま使用する](#21-テーブルをそのまま使用する)|
||2|[表にするカラムを指定する](#22-表にするカラムを指定する)|

## 1. 準備
まず、
使用しているサービスアカウントでBigqueryへアクセスできるようにしてください。
ググればその方法が書いてある記事があると思いますので説明は割愛します。

次に、
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する](https://qiita.com/doran/items/3d43f776188b2281044c#2-spreadsheets%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E5%8F%96%E5%BE%97)
の「Sheetsインスタンスの取得」の項目にある
getSpreadsheetsメソッド内のGoogleCredentialsインスタンス生成箇所で
スコープ「"https\://www.googleapis.com/auth/bigquery"」を追加してください。

```
GoogleCredentials credential = ServiceAccountCredentials.fromStream(input)
.createScoped(Arrays.asList(SheetsScopes.SPREADSHEETS,"https://www.googleapis.com/auth/bigquery"));
```
以上で準備は完了です。

### 2. 表を作成する
Bigquery内の指定テーブルをまるまる使用する方法
と、
クエリを使用して必要なカラムだけを使用する方法
があります。

#### 2.1. テーブルをそのまま使用する
Bigquery上のテーブルをそのままスプレットシートに表示させます。

**サンプル コード**
今回は、Bigqueryのpublicデータ(bigquery-public-data.america_health_rankings.ahr)
を使用します。
```
public Request addDataSource() {
    Request request = new Request();

    BigQueryDataSourceSpec bigQuery = new BigQueryDataSourceSpec();
    //課金プロジェクトのID
    bigQuery.setProjectId("*****");
    
    BigQueryTableSpec tableSpec = new BigQueryTableSpec();
    //テーブルが属するBigqueryプロジェクトID
    tableSpec.setTableProjectId("bigquery-public-data");
    //BigQuery データセットID
    tableSpec.setDatasetId("america_health_rankings");
    //BigQuery テーブルID
    tableSpec.setTableId("ahr");
    bigQuery.setTableSpec(tableSpec);
    
    DataSourceSpec spec = new DataSourceSpec();
    spec.setBigQuery(bigQuery);
    
    DataSource source = new DataSource();
    source.setSpec(spec);
    //データソースのIDを指定。指定いない場合は自動採番
    source.setDataSourceId("11111111");
  
    AddDataSourceRequest r = new AddDataSourceRequest();
    r.setDataSource(source);
    
    request.setAddDataSource(r);
    
    return request;
}
```
**実行結果**
新しいシートにBigqueryにあるテーブルの表が作成されました。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/71e4ab67-0156-01e0-6e7b-a747758d4046.png">

#### 2.2. 表にするカラムを指定する

**サンプル コード**
先程と同じテーブルに
「SELECT edition,state_name,source FROM 
`bigquery-public-data.america_health_rankings.ahr` LIMIT 5」
を投げます。
```
public Request addDataSource() {
    Request request = new Request();

    BigQueryDataSourceSpec bigQuery = new BigQueryDataSourceSpec();
    //課金プロジェクトのID
    bigQuery.setProjectId("*****");

    //クエリを設定
    BigQueryQuerySpec querySpec = new BigQueryQuerySpec();
    querySpec.setRawQuery("SELECT edition,state_name,source FROM `bigquery-public-data.america_health_rankings.ahr` LIMIT 5");//生のクエリ文字列。
    bigQuery.setQuerySpec(querySpec);
    
    DataSourceSpec spec = new DataSourceSpec();
    spec.setBigQuery(bigQuery);
    
    DataSource source = new DataSource();
    source.setSpec(spec);
    //データソースのIDを指定。指定いない場合は自動採番
    source.setDataSourceId("222222");
  
    AddDataSourceRequest r = new AddDataSourceRequest();
    r.setDataSource(source);
    
    request.setAddDataSource(r);
    
    return request;
}
```
**実行結果**
指定したクエリ（カラム：edition,state_name,source、5行まで）の
表が作成されました。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/4dca854f-0824-f263-bf32-cad789e1e797.png">

<br>
おしまい。。