【GAS】セルの操作(値入力編)(Spreadsheet)

##0.はじめに
この記事ではGASからSpreadsheetのセル操作における、セル内に値を入力(セット)する方法を記録する。

1.特定のセル(単体)に値を入力する。
2.特定のセル(単体)の値を削除(空白を入力)する。
3.sheet内の全てのセルを削除する。
4.特定の範囲のセルに同じ値を入力する。
5.値のある単体セルから値をコピーして、特定のセルに入力する。
6.値のある複数のセルを全てコピーして、特定の範囲のセルに入力する。


##Method
```javascript
//----単体セルに値を入力----//
rangeObject.setValue("値")
//rangeObjectに格納されているセルに値が入力される。

//----単体セルの値を削除----//
rangeObject.clear();
//単体セルの値を削除するメソッド

//----全てのセルの値を削除----//
dataobject.clear();
//dataobjectに入っている値を全て削除。

```

##1.特定のセル(単体)に値を入力する。
下記のD5セルは今空白になっている。D5に数字の1をGASから入力(セット)してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/c710a859-3706-f342-f204-a1d59fee4430.png)

```javascript
function myFunction() {
  var ss1 = SpreadsheetApp.openById("SpreadSheet-key");
  //spreadsheetをss1に格納。 

  var sh1 = ss1.getSheetByName("sheet1");
  //特定のシート(sheet1)をsh1に格納
 
  var sell1 = sh1.getRange('D5');
  //sell1にD5を格納
 
  sell1.setValue(1);
  //sell5(D5)に1をセット

  Logger.log(sell5.getValue());  

```

###結果
ログ結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/fdfaab59-1b1f-993b-9db4-e2086e3abfff.png)
シートのD5にもしっかりと１がセットされている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/dfe44aac-7117-aec1-9148-7e5e264e0359.png)

####【番外編】すでに値が入っていて異なる値をセットするとどうなるのか？
これはデータベースと同じ考え方で「更新」される。
D5に１が入っている状態で、2をGASからセットすると、D5の値は2になる。


##2.特定のセル(単体)の値を削除(空白を入力)する。
特定のセルの値を削除する方法は二つある。結果は何も同じ結果になる。

####2-1.setValuesを使って削除する。

```javascript
rangeObject.setValues('');
```

####2-2.clearを使って削除する。

```javascript
rangeObject.clear();
```

##3.特定のSheet内の全てのセルの値を削除する。
シートに以下のように値が入力されている。
以下の値を全て削除する。

これには、dataメソッドを使って、clearをすれば良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/375d4dac-e40f-ba80-e45a-101f50540160.png)

```javascript
function myFunction() {
  var ss1 = SpreadsheetApp.openById("Spreadsheet-key");
  //spreadsheetをss1に格納
  var sh1 = ss1.getSheetByName("sheet1");
  //sheet1をsh1に格納
 
  var data1 = sh1.getDataRange();
  //sh1の値をdataとしてdata1に格納
  data1.clear();
  //data1の値をクリア
```

###結果
スクリプトを実行すると、下記のように値が全て削除されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/db427123-e06d-1577-aaca-5275873b06eb.png)

##4.特定の範囲のセルに同じ値を入力する。
指定の範囲のセルを削除するには、rangeObjectの指定でセルの範囲指定を行えば良い。
例えば、以下のように値が入っていて、D1~D5の値を削除したいとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/954ed4f8-ea6d-6934-37e8-26cce6e730ee.png)

以下のように、getRange("D1:D5")と指定する。

```javascript

  var ss1 = SpreadsheetApp.openById("SpreadSheet-key");
  //spreadsheetをss1に格納。 

  var sh1 = ss1.getSheetByName("sheet1");
  //特定のシート(sheet1)をsh1に格納

  var range1 = sh1.getRange("D1:D5");
  //range1にD1~D5の値を格納。
  range1.clear();
```
###結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/52d693b2-3d16-859f-4bab-45bfb99bfdac.png)


##5.単体セルから値をコピーして、他ののセルにセットする。
これは分解するとわかりやすい。手順を以下のようにすれば良い。
1.特定のセルの値を取得してxに格納
2.入力したいセルをgetrangeで取得してyに格納。
3.setValueでyにxをセット。

以下のようにA列には数字の値が入っている。A1の１をC1にコピーすることをやってみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/9a8a6a43-9f12-9fe4-e38b-5287921349c7.png)

```javascript

  var ss1 = SpreadsheetApp.openById("SpreadSheet-key");
  //spreadsheetをss1に格納。 
  
  var sh1 = ss1.getSheetByName("sheet1");
  //特定のシート(sheet1)をsh1に格納

  var range1 = sh1.getRange("A1");
  //指定するセルを取得

  var values = range1.getValue();
  //range1の値を取得

  var range2 = sh1.getRange("C1");
  //コピー先のセルを取得

  range2.setValue(values);
  //コピー先にrange1の値をセット

```  

###結果
以下のようにA1の値がC1にセットされた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/337feaf5-50a1-699a-6df7-8f01ff7dbe95.png)


##6.特定の範囲のセルの値をコピーして他の範囲のセルに入力する。
Aの列に以下の値がセットされているとする。これをCの列にコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/9a8a6a43-9f12-9fe4-e38b-5287921349c7.png)

手法はいくつかあるが、ここではfor文を使ってみる。
for文を使って値を取得して、セットする動作を10回繰り返す。

```javascript

function myFunction() {
  
  var ss1 = SpreadsheetApp.openById("SpreadSheet-key");
  //spreadsheetをss1に格納。 
  
  var sh1 = ss1.getSheetByName("sheet1");
  //特定のシート(sheet1)をsh1に格納

  for(var i = 1;i <= 10;i++)
  {
   var range1 = sh1.getRange(i,1); 
   //A列を１からrange1に格納。
   var values = range1.getValue();
   //range1のセルの値をvaluesに格納。
   var range2 = sh1.getRange(i,3);
   //C列を1からrange2に格納。
   range2.setValue(values);
   //range2にvaluesの値をセット。
  }
```

###結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/647dcf9f-d7da-c87b-ad0a-aa8a5f17a3b6.png)

##まとめ
範囲の値を配列で扱うか、for文を用いて一つ一つ処理をしていくかは、用途によって分けると良いかと思います。
膨大なデータを扱う場合は、datarangeでSheetの値を一括で取得して、配列で扱うのが早いかなと。
実際にスクリプトが動いてくれると本当に嬉しいですね。

早くGMailやカレンダーの操作も自由自在になりたい・・・・・

以上です。