[Google Sheets API] グラフを追加・更新・削除する

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

メニュー：「挿入」 ⇨ 「グラフ」
で追加できるグラフです。

Sheets APIでは、次のグラフを扱うことができます。
・基本的なチャート
　　・棒グラフ
　　・折れ線グラフ
　　・面グラフ
　　・縦 棒グラフ
　　・散布図
　　・コンボチャート
　　・階段状の面グラフ
・バブルチャート
・ローソク足チャート
・ヒストグラムチャート
・組織図
・円グラフ
・スコアカード チャート
・ツリーマップ チャート
・ウォーターフォールチャート

:::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-グラフを追加)|
||1||[グラフのサイズと配置位置](#11-グラフのサイズと配置位置)|
||2||[グラフの仕様](#12-グラフの仕様)|
||3||[各グラフで使用するクラス](#13-各グラフで使用するクラス)|
|||1|[Colorクラス](#131-colorクラス)|
|||2|[ColorStyleクラス](#132-colorstyleクラス)|
|||3|[TextFormatクラス](#133-textformatクラス)|
|||4|[TextPositionクラス](#134-textpositionクラス)|
|||5|[GridRangeクラス](#135-gridrangeクラス)|
|||6|[ChartDataクラス](#136-chartdataクラス)|
|||7|[LineStyleクラス](#137-linestyleクラス)|
||4||[グラフクラス](#14-グラフクラス)|
|||1|[BasicChartSpecクラス(基本的なチャート)](#141-basicchartspecクラス)|
|||2|[BubbleChartSpecクラス(ブルチャート)](#142-bubblechartspecクラス)|
|||3|[CandlestickChartSpecクラス(ローソク足チャート)](#143-candlestickchartspecクラス)|
|||4|[HistogramChartSpecクラス(ヒストグラムチャート)](#144-histogramchartspecクラス)|
|||5|[OrgChartSpecクラス(組織図)](#145-orgchartspecクラス)|
|||6|[PieChartSpecクラス(円グラフ)](#146-piechartspecクラス)|
|||7|[ScorecardChartSpecクラス(スコアカード チャート)](#147-scorecardchartspecクラス)|
|||8|[TreemapChartSpecクラス(ツリーマップ チャート)](#148-treemapchartspecクラス)|
|||9|[WaterfallChartSpecクラス(ウォーターフォールチャート)](#149-waterfallchartspecクラス)|
|2|||[グラフを更新](#2-グラフを更新)|
|3|||[グラフを削除](#3-グラフを削除)|

## 1. グラフを追加
グラフを追加します。

グラフの追加時に下記3つを指定します。
・グラフのID。既に存在するIDならエラー。指定がない場合は自動採番。
・グラフのサイズ、配置位置
・グラフの仕様
下2つについて、それぞれ順に説明していきます。

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

    EmbeddedChart chart = new EmbeddedChart();
    
    //グラフのID。指定がない場合は自動採番
    chart.setChartId(1);
    
    //グラフのサイズ、配置位置
    chart.setPosition(getEmbeddedObjectPosition(sheetId));
    
    //グラフの仕様
    chart.setSpec(getChartSpec());
    
    AddChartRequest r = new AddChartRequest();
    r.setChart(chart);

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

### 1.1. グラフのサイズと配置位置
EmbeddedObjectPositionクラスで指定します。
位置の指定は、
既存のシートに配置する場合と
新しいシートに配置する場合
があります。

**既存のシートに配置する場合**
既存のシートにグラフを配置します。

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

**新しいシートに配置する**
新しいシートに配置します。
シートのタイプが「GRID」ではなく、「OBJECT」として新しいシートが生成されます。
setOverlayPositionの設定はできません。

・シートIDを指定する
　　setSheetId()にシートIDを設定します。
　　既に存在するシートIDを設定するとエラーになります。
  
・シートIDを指定しない（自動採番）
　　setNewSheet()にtrueを設定します。

**サンプル コード**
```java
public EmbeddedObjectPosition getEmbeddedObjectPosition(Integer sheetId) {
    EmbeddedObjectPosition pos = new EmbeddedObjectPosition();

    //グラフを配置するシートID
    //pos.setSheetId(sheetId);
    
    //新しいシートに配置するか？
    pos.setNewSheet(false);

    OverlayPosition overlay = new OverlayPosition();
    //起点とするセルの指定
    GridCoordinate grid = new GridCoordinate();
    grid.setSheetId(sheetId); 			//配置するシートID
    grid.setRowIndex(0); 				//開始行(0スタート)
    grid.setColumnIndex(0); 			//開始列(0スタート)
    overlay.setAnchorCell(grid);		//オブジェクトを固定するセル
    
    //起点とするセルからのオフセット値
    overlay.setOffsetXPixels(0);		//開始X座標。
    overlay.setOffsetYPixels(0);		//開始Y座標。
    overlay.setHeightPixels(371);		//グラフの高さ。省略時は371px
    overlay.setWidthPixels(600);		//グラフの幅。省略時は600px
    pos.setOverlayPosition(overlay);
    
    return pos;
}
```
### 1.2. グラフの仕様
ChartSpecクラスで設定します。
設定内容は次の通りです。引数のクラスについては後述します。
|設定内容|設定メソッド|引数|
|---|---|---|
|タイトル テキスト|setTitle|文字列|
|タイトルのテキスト形式|setTitleTextFormat|TextFormat|
|タイトルのテキストの<br>水平方向の配置位置|setTitleTextPosition|TextPosition|
|サブタイトル テキスト|setSubtitle|文字列|
|サブタイトルのテキスト形式|setSubtitleTextFormat|TextFormat|
|サブタイトルのテキストの<br>水平方向の配置位置|setSubtitleTextPosition|TextPosition|
|説明文|setAltText|文字列|
|グラフ全体の背景色|setBackgroundColor<br>または<br>setBackgroundColorStyle|Color<br><br>ColorStyle|
|デフォルトで使用するフォントの名前|setFontName|文字列|
|非表示の行、列の表示方法|setHiddenDimensionStrategy|文字列(※1)|
|最大化|setMaximized|boolean|
|グラフの仕様|(※2)||

(※1) 非表示の行、列をグラフでどのように使用するかを指定します。
|設定値|内容|
|---|---|
|SKIP_HIDDEN_ROWS_AND_COLUMNS|非表示の行と列は使用しない|
|SKIP_HIDDEN_ROWS|非表示の行だけを使用しない|
|SKIP_HIDDEN_COLUMNS|非表示の列だけを使用しない|
|SHOW_ALL|どちらも使用する|

  
(※2) 設定可能なグラフの種類とクラスです。
|チャート|チャートクラス|設定メソッド
|---|---|---|
|基本的なチャート|[BasicChartSpec](#141-basicchartspecクラス)|setBasicChart|
|バブルチャート|[BubbleChartSpec](#142-bubblechartspecクラス)|setBubbleChart|
|ローソク足チャート|[CandlestickChartSpec](#143-candlestickchartspecクラス)|setCandlestickChart|
|ヒストグラムチャート|[HistogramChartSpec](#144-histogramchartspecクラス)|setHistogramChart|
|組織図|[OrgChartSpec](#145-orgchartspecクラス)|setOrgChart|
|円グラフ|[PieChartSpec](#146-piechartspecクラス)|setPieChart|
|スコアカード チャート|[ScorecardChartSpec](#147-scorecardchartspecクラス)|setScorecardChart|
|ツリーマップ チャート|[TreemapChartSpec](#148-treemapchartspecクラス)|setTreemapChart|
|ウォーターフォールチャート|[WaterfallChartSpec](#149-waterfallchartspecクラス)|setWaterfallChart|

**サンプル コード**
```java
public ChartSpec getChartSpec() {
    ChartSpec spec = new ChartSpec();

    //タイトル テキスト
    spec.setTitle("タイトル");
    
    //タイトルのテキスト形式
    spec.setTitleTextFormat(new TextFormat());
    
    //タイトルのテキストの水平方向の配置位置
    spec.setTitleTextPosition(new TextPosition());
    
    //サブタイトル テキスト
    spec.setSubtitle("サブタイトル");
    
    //サブタイトルのテキスト形式
    spec.setSubtitleTextFormat(new TextFormat());
    
    //サブタイトルのテキストの水平方向の配置位置
    spec.setSubtitleTextPosition(new TextPosition());
    
    //説明文（アクセシビリティのために使用）
    spec.setAltText("これはテーブルですよ");
    
    //グラフ全体の背景色
    spec.setBackgroundColor(new Color());
    
    //デフォルトで使用するフォントの名前
    spec.setFontName("Arial");
    
    //非表示の行、列の表示方法
    spec.setHiddenDimensionStrategy("SHOW_ALL");
    
    //最大化
    spec.setMaximized(true);
    
    //グラフの仕様
    spec.setBasicChart(new BasicChartSpec());
    
    return spec;
}
```
### 1.3. 各グラフで使用するクラス
まずは、共通で使えるクラスを説明します。
その後に各々のグラフのクラスについて説明していきます。
#### 1.3.1. Colorクラス
色を表すクラスです。
RGBAの値を0.0〜1.0で指定します。

**サンプル コード**
```java
Color color = new Color();

color.setRed(1.0f);
color.setGreen(0f);
color.setBlue(0f);
color.setAlpha(0f);
```
#### 1.3.2. ColorStyleクラス
Colorクラスで設定できる内容か、テーマカラーを設定できます。
指定できるテーマカラーは次のtypeになります。
|type|種類|
|---|---|
|TEXT|テキスト|
|BACKGROUND|グラフの背景|
|ACCENT1|アクセント1|
|ACCENT2|アクセント2|
|ACCENT3|アクセント3|
|ACCENT4|アクセント4|
|ACCENT5|アクセント5|
|ACCENT6|アクセント6|
|LINK|ハイパーリンク|

**サンプル コード**
```java
ColorStyle colorStyle = new ColorStyle();

//どちらか一方のみ指定

//色を指定
//colorStyle.setRgbColor(new Color());

//テーマカラーを指定
colorStyle.setThemeColor("TEXT");
```
#### 1.3.3. TextFormatクラス
テキストの書式を設定します。
設定可能な内容は下記サンプルコードに全て載せています。

**サンプル コード**
```java
TextFormat format = new TextFormat();

format.setBold(true);	           //ボールドか？
format.setItalic(true);            //イタリックか？
format.setFontSize(0);	           //フォントサイズ
format.setFontFamily("Arial");	   //フォントファミリー名
format.setStrikethrough(false);    //取り消し線ありか？
format.setUnderline(false);		   //アンダーラインありか？

//テキストの色。どちらかの指定
format.setForegroundColor(new Color());
//format.setForegroundColorStyle(ColorStyle());
```
#### 1.3.4. TextPositionクラス
テキストの水平方向の位置を指定します。
指定するメソッドは1つのみsetHorizontalAlignmentです。
|align|水平方向位置|
|---|---|
|LEFT|左寄せ|
|CENTER|中央寄せ|
|RIGHT|右寄せ|

**サンプル コード**
```java
TextPosition position = new TextPosition();

position.setHorizontalAlignment("CENTER");
```
#### 1.3.5. GridRangeクラス
シートIDとシート内の範囲を設定します。

**サンプル コード**
```java
GridRange range = new GridRange();

range.setSheetId(0);          //シートID
range.setStartRowIndex(2);    //開始行(0スタート)
range.setEndRowIndex(4);      //終了行(1スタート)
range.setStartColumnIndex(1); //開始列(0スタート))
range.setEndColumnIndex(3);   //終了列(1スタート)
```
#### 1.3.6. ChartDataクラス
グラフが読み取るセルのデータ範囲を設定します。

基本は１つのGridRangeクラスを設定しますが、
複数の範囲(GridRange)を設定する場合は
ドメインおよび系列全体にわたって順序正しく連続している必要があります。

**サンプル コード**
```java
ChartData data = new ChartData();

ChartSourceRange source = new ChartSourceRange();
List<GridRange> ranges = new ArrayList<>();
ranges.add(new GridRange());
source.setSources(ranges);

data.setSourceRange(source);
```
#### 1.3.7. LineStyleクラス
線のスタイルと太さを設定します。
|type|種類|
|---|---|
|INVISIBLE|線を表示しない|
|SOLID|実践|
|DOTTED|点線|
|MEDIUM_DASHED|破線|
|MEDIUM_DASHED_DOTTED|一点鎖線|
|LONG_DASHED|長い破線|
|LONG_DASHED_DOTTED|長い一点鎖線|

**サンプル コード**
```java
LineStyle style = new LineStyle();

style.setType("SOLID");  //線の種類
style.setWidth(10);     //線の太さ (ピクセル単位)。
```
### 1.4. グラフクラス
次からはグラフクラスについて説明していきます。
#### 1.4.1. BasicChartSpecクラス
「基本的なチャート」の設定をします。

BasicChartSpecクラスでは以下のグラフが指定できます。
setChartType("")で指定します。
|chartType|グラフの種類|
|---|---|
|BAR|棒グラフ|
|LINE|折れ線グラフ|
|AREA|面グラフ|
|COLUMN|縦 棒グラフ|
|SCATTER|散布図|
|COMBO|コンボチャート|
|STEPPED_AREA|階段状の面グラフ|

setCompareMode("")で、
データorグラフ領域にマウスを移動したときのツールヒントの動作を指定できます。
|mode|動作|
|---|---|
|DATUM|フォーカスされたデータ要素のみが強調表示され、<br>ツールチップに表示されます|
|CATEGORY|同じカテゴリ (ドメイン値など) を持つすべてのデータ要素が<br>強調表示され、ツールチップに表示されます|

setLegendPosition("")で、
凡例の表示する位置を指定できます。
|position|表示位置|
|---|---|
|BOTTOM_LEGEND|グラフの下部に表示|
|LEFT_LEGEND|グラフの左側に表示|
|RIGHT_LEGEND|グラフの右側に表示|
|TOP_LEGEND|グラフの上部に表示|
|NO_LEGEND|表示しない|

setStackedType("")で、
垂直方向のチャートの積み上げタイプを指定できます。
setChartTypeが、LINE(折れ線グラフ)、SCATTER(散布図)の場合は使用できません。
|type|積み上げ方法|
|---|---|
|NOT_STACKED|積み重ねられない|
|STACKED|系列値は積み重ねられ、各値はその下の値の上から垂直方向にレンダリング|
|PERCENT_STACKED|垂直スタックはグラフの上部に達するまで引き伸ばされ、値が互いのパーセンテージとしてレイアウト|

**サンプル コード**
```java
BasicChartSpec chart = new BasicChartSpec();

//チャート上の軸
chart.setAxis(new ArrayList<BasicChartAxis>());

//チャートのタイプ
chart.setChartType("LINE");

//ツールヒントの動作
chart.setCompareMode("");

//これがグラフ化しているデータのドメイン。単一のドメインのみがサポートされます。
chart.setDomains(new ArrayList<BasicChartDomain>());

//データ内の「ヘッダー」である行または列の数。
chart.setHeaderCount(0);

//系列内の一部の値が欠落によるグラフのギャップの表示解消するか？
//折れ線グラフ、面グラフ、複合グラフのみ
chart.setInterpolateNulls(true);

//凡例の表示位置
chart.setLegendPosition("BOTTOM_LEGEND");

//デフォルトですべての線を直線でレンダリングするか？
//折れ線グラフのみ
chart.setLineSmoothing(true);

//このグラフが視覚化しているデータ
chart.setSeries(new ArrayList<BasicChartSeries>());

//垂直方向のチャートの積み上げタイプ
chart.setStackedType("NOT_STACKED");

//グラフを3Dにするか？
//棒グラフ、縦棒グラフのみ
chart.setThreeDimensional(true);
```
**・setAxis(List\<BasicChartDomain>)**
で、チャート上の軸を設定します。

BasicChartAxisクラスのsetPosition("")で、
軸の位置を設定できます。
|position|軸の位置|
|---|---|
|BOTTOM_AXIS|グラフの下部に表示される軸。<br>ほとんどのグラフでは、これが標準の主軸。<br>棒グラフの場合、これは副軸|
|LEFT_AXIS|チャートの左側に表示される軸。<br>ほとんどのグラフでは、これは副軸。<br>棒グラフの場合、これが標準の主軸|
|RIGHT_AXIS|チャートの右側に表示される軸。<br>ほとんどのグラフでは、これは副軸。<br>棒グラフの場合、これは珍しい主軸|

ChartAxisViewWindowOptionsクラスのsetViewWindowMode("")で、;
ビューウィンドウのモードを設定できます。
|mode|モードの内容|
|---|---|
|DEFAULT_VIEW_WINDOW_MODE|このグラフ タイプのシート エディターで使用されるデフォルトのビュー ウィンドウ モード|
|EXPLICIT|最小値と最大値に正確に従う。|
|PRETTY|グラフの見栄えを良くする最小値と最大値を選択する。<br>このモードでは、最小値と最大値の両方が無視される|

**サンプル コード**
```java
List<BasicChartAxis> axis = new ArrayList<>();

BasicChartAxis a = new BasicChartAxis();
//タイトルの形式。軸がドメインに関連付けられていない場合にのみ有効
a.setFormat(new TextFormat());

//この軸の位置
a.setPosition("BOTTOM_AXIS");

//この軸のタイトル
a.setTitle("");

//軸のタイトルのテキスト位置。
a.setTitleTextPosition(getTextPosition());

//この軸のビュー ウィンドウ オプション。
    ChartAxisViewWindowOptions viewWindowOptions = new ChartAxisViewWindowOptions();
    //このビュー ウィンドウに表示される最大数値
    viewWindowOptions.setViewWindowMax(0d);
    
    //このビュー ウィンドウに表示される最小の数値
    viewWindowOptions.setViewWindowMin(0d);
    
    //ビューウィンドウのモード。
    viewWindowOptions.setViewWindowMode("PRETTY");
a.setViewWindowOptions(viewWindowOptions);

axis.add(a);
```
**・setDomains(List\<BasicChartDomain>)**
で、グラフ化しているデータのドメインを設定します。

**サンプル コード**
```java
List<BasicChartDomain> domain = new ArrayList<>();

BasicChartDomain d = new BasicChartDomain();

//ドメインのデータ。
//たとえば、株価の経時的なグラフを作成する場合、これは日付を表すデータになる。
d.setDomain(new ChartData());

//ドメイン値 (横軸)の順序を逆にするか？
d.setReversed(true);

domain.add(d);
```
**・setSeries(List\<BasicChartSeries>)**
で、グラフが視覚化しているデータを設定します。

BasicChartSeriesクラスのsetType("")で
シリーズのタイプを設定できます。
chartTypeがCOMBO(コンボチャート)のときのみ有効です。
|type|グラフ|
|---|---|
|LINE|折れ線グラフ|
|AREA|面グラフ|
|COLUMN|縦 棒グラフ|

BasicChartSeriesクラスのsetTargetAxis("")で、
この系列の値の範囲を指定する短軸を設定できます。
|axis|軸の位置|
|---|---|
|BOTTOM_AXIS|グラフの下部に表示される軸。<br>ほとんどのグラフでは、これが標準の主軸。<br>棒グラフの場合、これは副軸|
|LEFT_AXIS|チャートの左側に表示される軸。<br>ほとんどのグラフでは、これは副軸。<br>棒グラフの場合、これが標準の主軸|
|RIGHT_AXIS|チャートの右側に表示される軸。<br>ほとんどのグラフでは、これは副軸。<br>棒グラフの場合、これは珍しい主軸|

**サンプル コード**
```java
List<BasicChartSeries> series = new ArrayList<>();

BasicChartSeries b = new BasicChartSeries();

//このシリーズに関連付けられた要素 (棒、線、点など) の色
b.setColor(new Color());  //または setColorStyle

//このシリーズの線のスタイル
//chartType が AREA、LINE、SCATTERの場合のみ
b.setLineStyle(new LineStyle());

//このグラフ シリーズで視覚化されているデータ
b.setSeries(new ChartData());

//この系列の値の範囲を指定する短軸
b.setTargetAxis("BOTTOM_AXIS");

//このシリーズのタイプ
//b.setType("");

series.add(b);
```
#### 1.4.2. BubbleChartSpecクラス
「バブルチャート」の設定をします。

setLegendPosition("")で
チャートの凡例を描画する場所を設定できます。
|position|表示位置|
|---|---|
|BOTTOM_LEGEND|グラフの下部に表示|
|LEFT_LEGEND|グラフの左側に表示|
|RIGHT_LEGEND|グラフの右側に表示|
|TOP_LEGEND|グラフの上部に表示|
|NO_LEGEND|表示しない|

**サンプル コード**
```java
BubbleChartSpec chart = new BubbleChartSpec();

//チャートの凡例を描画する場所
chart.setLegendPosition("BOTTOM_LEGEND");

//バブルの境界線の色。
chart.setBubbleBorderColor(new Color());  //または setBubbleBorderColorStyle

//バブルラベルを含むデータ
chart.setBubbleLabels(new ChartData());

//バブルの最大半径サイズ (ピクセル単位)
chart.setBubbleMaxRadiusSize(0);

//バブルの最小半径サイズ (ピクセル単位)
chart.setBubbleMinRadiusSize(0);

//不透明度
chart.setBubbleOpacity(0f);

//バブル内のテキストの形式。下線と取り消し線は無効
chart.setBubbleTextStyle(new TextFormat());

//バブルのX値を含むデータ
chart.setDomain(new ChartData());

//バブルのY値を含むデータ
chart.setSeries(new ChartData());

//バブルのサイズを含むデータ(オプション)
chart.setBubbleSizes(new ChartData());

//バブル グループ ID を含むデータ(オプション)
//ただし、setBubbleSizesが指定されている場合は必須
chart.setGroupIds(new ChartData());

```
#### 1.4.3. CandlestickChartSpecクラス
「ローソク足チャート」の設定をします。

**サンプル コード**
```java
CandlestickChartSpec chart = new CandlestickChartSpec();

//ローソク足チャートのデータ(1つのみ設定可能)
chart.setData(new ArrayList<CandlestickData>());

//ローソク足チャートのドメインデータ (横軸)。
//文字列データは離散ラベルとして扱われ、その他のデータは連続値として扱われる。
chart.setDomain(new CandlestickDomain());
```
**・setData(new ArrayList<CandlestickData>())**
で、ローソク足チャートのデータを設定します。
リストですが1つのみ設定が可能です。

**サンプル コード**
```java
List<CandlestickData> datas = new ArrayList<>();
CandlestickData data = new CandlestickData();

//各ローソク足の終値/最終値の範囲データ (縦軸)
//ローソク本体の上部
data.setCloseSeries(new CandlestickSeries().setData(new ChartData()));

//各ローソク足の始値/初期値の範囲データ (縦軸)。
//ローソク本体の下部
data.setOpenSeries(new CandlestickSeries().setData(new ChartData()));

//各ローソク足の高値/最大値の範囲データ (縦軸)
//ローソクの中心線の上部
data.setHighSeries(new CandlestickSeries().setData(new ChartData()));

//各ローソク足の最低値/最低値の範囲データ (縦軸)
//ローソクの中心線の下部
data.setLowSeries(new CandlestickSeries().setData(new ChartData()));

datas.add(data);
```
**・setDomain(new CandlestickDomain())**
で、ローソク足チャートのドメインデータを設定します。

**サンプル コード**
```java
CandlestickDomain domain = new CandlestickDomain();
//CandlestickDomain のデータ
domain.setData(new ChartData());

//ドメイン値 (横軸)の順序を逆にするか？
domain.setReversed(true);
```

#### 1.4.4. HistogramChartSpecクラス
「ヒストグラムチャート」の設定をします。

setLegendPosition("")で、
凡例の表示する位置を指定できます。
|position|表示位置|
|---|---|
|BOTTOM_LEGEND|グラフの下部に表示|
|LEFT_LEGEND|グラフの左側に表示|
|RIGHT_LEGEND|グラフの右側に表示|
|TOP_LEGEND|グラフの上部に表示|
|NO_LEGEND|表示しない|

**サンプル コード**
```java
HistogramChartSpec chart = new HistogramChartSpec();

//バケットサイズ
chart.setBucketSize(0d);

//チャートの凡例の位置
chart.setLegendPosition("RIGHT_LEGEND");

//外れ値パーセンタイル
chart.setOutlierPercentile(0d);

//ヒストグラム シリーズのデータ
chart.setSeries(new ArrayList<HistogramSeries>());

//各列の項目間に水平の区切り線を表示するか？
chart.setShowItemDividers(true);
```
**・setSeries(new ArrayList<HistogramSeries>())**
で、ヒストグラム シリーズのデータを設定します。

**サンプル コード**
```java
List<HistogramSeries> series = new ArrayList<>();

HistogramSeries h = new HistogramSeries();
//各バケット内のこのシリーズを表す列の色
h.setBarColor(new Color());

//ヒストグラム シリーズのデータ​​
h.setData(getChartData());

series.add(h);
```
#### 1.4.5. OrgChartSpecクラス
「組織図」の設定をします。

setNodeSize("")で、
組織図のノードサイズを設定できます。
|node size|大きさ|
|---|---|
|SMALL|小さい組織図のノード サイズ|
|MEDIUM|中程度の組織図のノード サイズ|
|LARGE|組織図のノード サイズが大きい|

**サンプル コード**
```java
OrgChartSpec chart = new OrgChartSpec();

//チャート内のすべてのノードのラベルを含むデータ
chart.setLabels(new ChartData());

//組織図のノードの色
chart.setNodeColor(new Color());  //または setNodeColorStyle

//選択した組織図ノードの色
chart.setSelectedNodeColor(new Color());//または setSelectedNodeColorStyle

//組織図のノードのサイズ
chart.setNodeSize("MEDIUM");

//対応するノードの親のラベルを含むデータ(オプション)
chart.setParentLabels(new ChartData());

/対応するノードのツールチップを含むデータ(オプション)
chart.setTooltips(new ChartData());
```
#### 1.4.6. PieChartSpecクラス
「円グラフ」の設定をします。

setLegendPosition("")で、
凡例の表示する位置を指定できます。
|position|表示位置|
|---|---|
|BOTTOM_LEGEND|グラフの下部に表示|
|LEFT_LEGEND|グラフの左側に表示|
|RIGHT_LEGEND|グラフの右側に表示|
|TOP_LEGEND|グラフの上部に表示|
|NO_LEGEND|表示しない|
|LABELED_LEGEND|各パイのスライスにはラベルが付いている|

**サンプル コード**
```java
PieChartSpec chart = new PieChartSpec();

//円グラフの領域をカバーするデータ
chart.setDomain(new ChartData());

//円グラフの唯一のシリーズを網羅したデータ
chart.setSeries(new ChartData());

//凡例の表示する位置
chart.setLegendPosition("BOTTOM_LEGEND");。

//円グラフの穴のサイズ
chart.setPieHole(10d);

//円が3次元か？
chart.setThreeDimensional(true);
```
#### 1.4.7. ScorecardChartSpecクラス
「スコアカード チャート」の設定をします。

setAggregateType("")で、
データの集計タイプを指定できます。
|type|集計タイプ|
|---|---|
|AVERAGE|平均集計関数|
|COUNT|カウント集計関数|
|MAX|最大の集計関数|
|MEDIAN|中央値集計関数|
|MIN|最小の集計関数|
|SUM|合計集計関数|

setNumberFormatSource("")で、
スコアカード グラフで使用される数値形式のソースを指定できます。
|source|数値形式のソース|
|---|---|
|FROM_DATA|データから数値の書式設定を継承|
|CUSTOM|setCustomFormatOptions()で設定された<br>カスタム書式設定を適用|

**サンプル コード**
```java
ScorecardChartSpec chart = new ScorecardChartSpec();

//データの集計タイプ(オプション)
chart.setAggregateType("COUNT");

//スコアカード キーとベースライン値をスケールする値(オプション)
chart.setScaleFactor(10d);

//スコアカードのベースライン値のデータ(オプション)
chart.setBaselineValueData(new ChartData());

//ベースライン値の書式設定オプション
//setBaselineValueDataが設定されている場合のみ有効
chart.setBaselineValueFormat(new BaselineValueFormat());

//キー値の書式設定オプション
chart.setKeyValueFormat(new KeyValueFormat());

//スコアカードのキー値のデータ
chart.setKeyValueData(new ChartData());

//スコアカード グラフで使用される数値形式のソース(オプション)
chart.setNumberFormatSource("FROM_DATA");

//スコアカード グラフの数値キー/ベースライン値のカスタム書式設定オプション
//setNumberFormatSource("CUSTOM")の場合のみ有効
chart.setCustomFormatOptions(new ChartCustomNumberFormatOptions());
```
**・setBaselineValueFormat(new BaselineValueFormat())**
で、ベースライン値の書式設定オプションを設定します。
setBaselineValueData()が設定されている場合のみ有効です。

**サンプル コード**
```java
BaselineValueFormat format = new BaselineValueFormat();

//キー値とベースライン値の比較タイプ
format.setComparisonType("");

//ベースライン値の後に追加される説明(オプション)
format.setDescription("");

//ベースライン値がキー値の負の変化を表す場合に使用される色(オプション)
format.setNegativeColor(new Color());  //または setNegativeColorStyle

//ベースライン値の水平方向のテキストの位置(オプション)
format.setPosition(new TextPosition());

//ベースライン値がキー値の正の変化を表す場合に使用される色(オプション)
format.setPositiveColor(new Color()); //または setPositiveColorStyle

//ベースライン値のテキスト書式設定オプション
format.setTextFormat(getTextFormat());
```
**・setKeyValueFormat(new KeyValueFormat())**
で、キー値の書式設定オプションを設定します。

**サンプル コード**
```java
KeyValueFormat key = new KeyValueFormat();

//キー値の水平方向のテキストの位置(オプション)
key.setPosition(getTextPosition());

//キー値のテキスト書式設定オプション。
key.setTextFormat(getTextFormat());
```
**・setCustomFormatOptions(new ChartCustomNumberFormatOptions())**
で、スコアカード グラフの数値キー/ベースライン値のカスタム書式設定オプション
を設定します。
setNumberFormatSource("CUSTOM")を設定している場合のみ有効です。

**サンプル コード**
```java
ChartCustomNumberFormatOptions option = new ChartCustomNumberFormatOptions();

//チャート属性の先頭に追加されるカスタム接頭辞(オプション)
option.setPrefix("");

//チャート属性に追加されるカスタム接尾辞(オプション)
option.setSuffix("");
```

#### 1.4.8. TreemapChartSpecクラス
「ツリーマップ チャート」の設定をします。

**サンプル コード**
```java
TreemapChartSpec chart = new TreemapChartSpec();

//各ツリーマップ データ セルの背景色を決定するデータ(オプション)
chart.setColorData(new ChartData());

//ツリーマップ チャートのデータ セルのカラー スケール
chart.setColorScale(new TreemapChartColorScale());

//ヘッダーセルの背景色
chart.setHeaderColor(new Color());  //または setHeaderColorStyle

//ツールチップを非表示にするか？
chart.setHideTooltips(true);

//ラベル付きレベルを超える追加のデータレベルの数。
chart.setHintedLevels(0);

//ツリーマップのセルのラベルを含むデータ
chart.setLabels(new ChartData());

//チャートに表示するデータ レベルの数
chart.setLevels(2);

//可能な最大データ値
chart.setMaxValue(0d);

//可能な最小のデータ値
chart.setMinValue(0d);

//ツリーマップ セルの親ラベル
chart.setParentLabels(new ChartData());

//各ツリーマップ データ セルのサイズを決定するデータ
chart.setSizeData(new ChartData());

//チャート上のすべてのラベルのテキスト形式
chart.setTextFormat(new TextFormat());
```
**・setColorScale(new TreemapChartColorScale())**
で、ツリーマップチャートのデータ セルのカラースケールを設定します。

**サンプル コード**
```java
TreemapChartColorScale scale = new TreemapChartColorScale();

//maxValue 以上の色の値を持つセルの背景色
//デフォルトは#109618
scale.setMaxValueColor(new Color());

//minValue と maxValue の間の中間の色の値を持つセルの背景色
//デフォルトは #efe6dc
scale.setMidValueColor(new Color());

//minValue 以下の色の値を持つセルの背景色
//デフォルトは #dc3912
scale.setMinValueColor(new Color());

//色データが関連付けられていないセルの背景色
//デフォルトは #000000
scale.setNoDataColor(new Color());
```
#### 1.4.9. WaterfallChartSpecクラス
「ウォーターフォールチャート」の設定をします。

setStackedType("")で、
積み上げ方法を指定できます。
|type|積み上げ方法|
|---|---|
|STACKED|同じドメイン (横軸) の値に対応する値が縦に積み上げ|
|SEQUENTIAL|シリーズは横軸に沿って広がる|

**サンプル コード**
```java
WaterfallChartSpec chart = new WaterfallChartSpec();

//積み上げ方法
chart.setStackedType("SEQUENTIAL");

//列間の接続線を表示するか？
chart.setHideConnectorLines(true);

//最初の値を合計とするか？
chart.setFirstValueIsTotal(true);

//コネクタ線のスタイル
chart.setConnectorLineStyle(new LineStyle());

//ウォーターフォール チャートのドメイン データ (横軸)
chart.setDomain(new WaterfallChartDomain());

//ウォーターフォール チャートが視覚化しているデータ。
chart.setSeries(new WaterfallChartSeries());
```
**・setDomain(new WaterfallChartDomain())**
で、ウォーターフォール チャートのドメイン データ (横軸)を設定します。

**サンプル コード**
```java
WaterfallChartDomain domain = new WaterfallChartDomain();

//グラフデータ
domain.setData(new ChartData());

//縦ラベルの順序を逆にする
domain.setReversed(true);
```
**・setSeries(new WaterfallChartSeries())**
で、ウォーターフォール チャートが視覚化しているデータを設定します。

**サンプル コード**
```java
List<WaterfallChartSeries> series = new ArrayList<>();

WaterfallChartSeries fall = new WaterfallChartSeries();

//このシリーズに登場するカスタム小計列
fall.setCustomSubtotals(new ArrayList<WaterfallChartCustomSubtotal>());

//このシリーズで視覚化されるデータ
fall.setData(new ChartData());

//シリーズの最後から小計列を非表示にするか？
fall.setHideTrailingSubtotal(true);

//負の値を含むこの系列のすべての列のスタイル
fall.setNegativeColumnsStyle(new WaterfallChartColumnStyle());

//このシリーズのすべての列の正の値のスタイル
fall.setPositiveColumnsStyle(new WaterfallChartColumnStyle());

//このシリーズのすべての小計列のスタイル
fall.setSubtotalColumnsStyle(new WaterfallChartColumnStyle());

series.add(fall);
```
**・setCustomSubtotals(new ArrayList<WaterfallChartCustomSubtotal>())**
で、シリーズに登場するカスタム小計列を設定します。

**サンプル コード**
```java
List<WaterfallChartCustomSubtotal> total = new ArrayList<>();

WaterfallChartCustomSubtotal t = new WaterfallChartCustomSubtotal();

//シリーズ内のデータ インデックス(0スタート)
t.setSubtotalIndex(0);

//setSubtotalIndexが小計か？
t.setDataIsSubtotal(true);

//小計列のラベル
t.setLabel("");

total.add(t);
```
**・setNegativeColumnsStyle(new WaterfallChartColumnStyle())**
で、負の値を含むこの系列のすべての列のスタイルを設定、
**・setPositiveColumnsStyle(new WaterfallChartColumnStyle())**
で、このシリーズのすべての列の正の値のスタイルを設定、
**・setSubtotalColumnsStyle(new WaterfallChartColumnStyle())**
で、このシリーズのすべての小計列のスタイルを設定します。

**サンプル コード**
```java
WaterfallChartColumnStyle nStyle = new WaterfallChartColumnStyle();

//列の色
nStyle.setColor(new Color());    //または getColorStyle

//列の凡例のラベル
nStyle.setLabel("");
```

## 2. グラフを更新
グラフを更新します。

グラフの更新時に下記を指定します。
・更新するグラフのID
・更新するグラフの仕様

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

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

    UpdateChartSpecRequest r = new UpdateChartSpecRequest();
    r.setChartId(1);			//更新するチャートのID
    r.setSpec(getChartSpec());	//更新するチャートの仕様

    request.setUpdateChartSpec(r);
    return request;
}
```
## 3. グラフを削除
グラフを削除します。

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

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

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

<br>
おしまい。。