[Google Sheets API] セルをコピペ(コピー&ペースト)、カピぺ(カット&ペースト)する

Google Sheets API v4（Java）を使用して、
スプレットシートのセルをcopy and pasteまたはcut and pasteする方法
についてご紹介します。

:::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|[セルのコピペ(copy and paste)](#1-セルのコピペcopy-and-paste)|
|2|[セルのカピぺ(cut and paste)](#2-セルのカピぺcut-and-paste)|

## 1. セルのコピペ(copy and paste)
指定したセルの範囲をコピー＆ペーストします。
コピーするシート、ペーストするシートは異なるシートでも可能です。
また、特殊貼り付けや、貼り付け（ペースト）の際に行、列を転置して貼り付けることもできます。

setPasteOrientationで貼り付け方法を指定できます。
|type|内容|
|---|---|
|normal|通常の貼り付け|
|transpose|転地して貼り付け|

setPasteTypeで特殊貼り付けを指定できます。
|type|内容|
|---|---|
|PASTE_NORMAL|通常の貼り付け|
|PASTE_VALUES|値のみを貼り付け|
|PASTE_FORMAT|書式のみ貼り付け|
|PASTE_FORMULA|数式のみ貼り付け|
|PASTE_CONDITIONAL_FORMATTING|条件付き書式のみを貼り付け|
|PASTE_DATA_VALIDATION|データ入力規制のみ貼り付け|
|PASTE_NO_BORDERS|枠線を除くすべてを貼り付け|

コピー、ペーストする範囲の指定は終了行、列を省略することもできます。
　・終了行（setEndRowIndex）を省略した場合、
　　　setStartRowIndexから最後の行まで（空白セルまで）
　・終了列（setEndColumnIndex）を省略した場合、
　　　setStartColumnIndexから最後の列まで（空白セルまで）

コピー範囲　＜　ペースト範囲　の場合
　貼り付けの際、コピーの範囲が繰り返しで貼り付けられます。
　（スプレットシートを手操作した場合と同じ動きになります）
 
コピー範囲　＞　ペースト範囲　の場合
　貼り付けの際、コピー範囲の方が有効になり、ペーストの範囲指定(開始位置以外)は無視されます。

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

    GridRange src = new GridRange();	//コピーする範囲
    src.setSheetId(sheetId); 			//シートID
    src.setStartRowIndex(1); 			//開始行(0スタート)
    src.setEndRowIndex(5); 				//終了行(1スタート)
    src.setStartColumnIndex(1); 		//開始列(0スタート)
    src.setEndColumnIndex(5); 			//終了列(1スタート)
    
    GridRange dest = new GridRange();	//ペーストする範囲
    dest.setSheetId(sheetId); 			//シートID
    dest.setStartRowIndex(5); 			//開始行(0スタート)
    dest.setEndRowIndex(9); 			//終了行(1スタート)
    dest.setStartColumnIndex(5);	 	//開始列(0スタート)
    dest.setEndColumnIndex(9); 			//終了列(1スタート)

    CopyPasteRequest r = new CopyPasteRequest();
    r.setSource(src); 					//コピー範囲の情報設定
    r.setDestination(dest); 			//ペースト範囲の情報設定
    r.setPasteOrientation("normal");	//貼り付けの仕方。normal：通常, transpose：転地して貼り付け	
    //r.setPasteType("PASTE_VALUES");	//特殊貼り付け

    request.setCopyPaste(r);
    return request;
}
```
**実行結果**
指定した範囲のセルがコピーされました。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/ead9af7a-9318-ad2f-ebf2-3cb525141560.png">
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/f6ebfb34-f683-acb5-9891-19d3ac69e840.png">

## 2. セルのカピぺ(cut and paste)
指定したセルの範囲をカット＆ペーストします。
カットするシート、ペーストするシートは異なるシートでも可能です。
また、特殊貼り付けやもできます。コピペと異なり転地貼り付けはできません。

setPasteTypeで特殊貼り付けを指定できます。
|type|内容|
|---|---|
|PASTE_NORMAL|通常の貼り付け|
|PASTE_VALUES|値のみを貼り付け|
|PASTE_FORMAT|書式のみ貼り付け|
|PASTE_FORMULA|数式のみ貼り付け|
|PASTE_CONDITIONAL_FORMATTING|条件付き書式のみを貼り付け|
|PASTE_DATA_VALIDATION|データ入力規制のみ貼り付け|
|PASTE_NO_BORDERS|枠線を除くすべてを貼り付け|

カットする範囲の指定は終了行、列を省略することもできます。
　・終了行（setEndRowIndex）を省略した場合、
　　　setStartRowIndexから最後の行まで（空白セルまで）
　・終了列（setEndColumnIndex）を省略した場合、
　　　setStartColumnIndexから最後の列まで（空白セルまで）

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

    GridRange src = new GridRange();	//カットする範囲
    src.setSheetId(sheetId); 			//シートID
    src.setStartRowIndex(1); 			//開始行(0スタート)
    src.setEndRowIndex(5); 				//終了行(1スタート)
    src.setStartColumnIndex(1); 		//開始列(0スタート)
    src.setEndColumnIndex(5); 			//終了列(1スタート)

    GridCoordinate dest = new GridCoordinate();	//ペーストする範囲
    dest.setSheetId(sheetId); 			//シートID
    dest.setColumnIndex(6); 			//座標の列インデックス。(0スタート)
    dest.setRowIndex(6); 				//座標の行インデックス。(0スタート)
    
    CutPasteRequest r = new CutPasteRequest();
    r.setSource(src); 					//カット範囲の情報設定
    r.setDestination(dest); 			//ペースト範囲の情報設定
    //r.setPasteType("PASTE_FORMAT");	//特殊貼り付け
    
    request.setCutPaste(r);

    return request;
}
```
**実行結果**
指定した範囲のセルが切り取られ、指定箇所に貼り付けされました。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/ead9af7a-9318-ad2f-ebf2-3cb525141560.png">
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/13db6e4d-79c4-021f-b223-77eba1062931.png">

おしまい。。