Googleサービスをより楽に使う方法〜SpreadSheetの基本編①〜

#はじめに
SpreadSheetを利用するときは、複数人で利用するシーンが僕の業務ではかなり多い。

そこでGASを使ってSpreadSheetとGmailを連携させて情報を格納したり色々と便利になる。
やれることはかなり多いので、システムを組むときに便利な関数とその使い方についてまとめておく。


#SpreadSheetを扱える状態にする
スプレッドシートをGASで利用するには最初にSpreadSheetオブジェクトを用意する必要がある
SpreadSheetは以下のように構成されている

- SpreadSheet
- Sheet
- Cell

の三つである。
これらのオブジェクトに対して階層ごとにアクセスすることで、最終的に値の取り扱いが可能になる

##SpreadSheetにアクセスする

最初にSpreadSheetを利用できるようにするためには以下のように特定のSpreadSheetを呼び出してあげる必要はある

```Javascript:spreadsheetapp
function myFunction(){
  //開いているスプレッドシートを呼び出すorGoogleAppScriptにつなげているSpreadSheetを呼び出す
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //キーでSpreadSheetを呼び出す場合
  var spreadsheet = SpreadsheetApp.openById('[key]');
  //URLでSpreadSheetを呼び出す場合
  var spreadsheet = SpreadsheetApp.openByUrl('[url]');
}
```

この状態で初めて特定のSpreadSheet（ワークブック）にアクセスすることができる
呼び出したSpreadSheetは変数にSpreadSheetオブジェクトとして入れておく


##Sheetにアクセスする

次は格納したSpreadSheetオブジェクトのなかで特定のSheetにアクセスする

```Javascript:spreadsheetapp
function myFunction(){
  //SpreadSheetオブジェクトを生成
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  //現在開いているSheetを取得
  var sheet = spreadsheet.getActivesheet();
  //Sheet名でSheetを特定する
  var sheet = Spreadsheet.getSheetByName('[name]');
  //Sheetの番号でSheetを特定する
  var sheet = Spreadsheet.getSheet()[i];
}
```
Sheetオブジェクトの生成は上記の通り。
Spreadsheetオブジェクトに対して設定することでSheetオブジェクトを用意できる。
三番目の方法に関してはSheetオブジェクトをSpreadsheetオブジェクトから一元配列で取り出して順番で指定している。
しかしながら普段あまり利用することがないので、
柔軟性の高い `.getSheetByName('[name]')` を使うといい


##Cellにアクセスする

特定のシートに対してアクセスすることができたなら、
次のステップは言わずもがなCellに対してのアクセスになる
こちらも今まで同様Cellを取得するもしくはCellの範囲を取得する事になる。

```Javascript:spreadsheetapp
function myFunction(){
  //SpreadSheetオブジェクトを生成
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //現在開いているSheetを取得
  var sheet = spreadsheet.getActivesheet();
  
  //Cell名を指定して一つの特定セルを取得する
  var range = sheet.getRange('A1')
  //Cell名を指定して範囲として特定セルを取得する
  var range = sheet.getRange('A1:C3')
  //Cellの番号を指定して一つの特定セルを取得する
  var range = sheet.getRange(1,1)//A1を取得
  //Cellの番号を指定して範囲として特定セルを取得する
  var range = sheet.getRange(1,1,4,3)//A1:C4を取得
}
```

これで対象のセルへのアクセスができるようになったので、その中のValueを取得してプログラムを動かすといい
getRange()で解説しておかなければならない部分があるとすれば、
Cellの番号を指定して範囲として特定セルを取得する時の構文だと思う。

| 引数番号 | 引数内容 | オプション |
|:-:|:-:|:-:|
| 1 | 対象範囲のスタートCell行（左上） |   |
| 2 | 対象範囲のスタートCell列（左上） |   |
| 3 | 対象セルを含めた対象範囲の行数 | ○ |
| 4 | 対象セルを含めた対象範囲の行数 | ○ |


基本はCell名を直接指定して範囲呼び出しを行って問題ないが、
最終列がわからなかったり、行数が可変だったりする場合にこの構文を利用すると
数値計算で範囲指定できるので楽になる



#Valueを取得して扱える状態にする

ここまででSpreadSheet＞Sheet＞Cell（Range）と段階ごとにアクセスを行ってきた
最後はCellのなかに含まれているValueを取得して出力するところまで解説したいと思う


```Javascript:spreadsheetapp
function myFunction(){
  //SpreadSheetオブジェクトを生成
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //現在開いているSheetを取得
  var sheet = spreadsheet.getActivesheet();
  //Cellの番号を指定して範囲として特定セルを取得する
  var range = sheet.getRange(1,1,4,3)//A1:C4を取得

  //Cellの最初のValueを取得
  var value = range.getValue();
  //Cell範囲のValueを取得
  var value = range.getValues();
}
```

これで変数valueには対象範囲（今回だとA1:C4）のvalueが入ることとなる
`getValue()`は範囲の最初のCell（左上）のVlaueを文字列として直接返してくれる
`getValues()`は範囲全体のVlaueを二元配列として返してくれる。
双方良し悪しがあるもののなかなか特定のセルのみで操作を行うことは少ないので、
僕は基本全て`getValues()`で対応するようにしている。


この値をLogとして出力したい場合は

```Javascript:spreadsheetapp
function myFunction(){
  //SpreadSheetオブジェクトを生成
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //現在開いているSheetを取得
  var sheet = spreadsheet.getActivesheet();
  //Cellの番号を指定して範囲として特定セルを取得する
  var range = sheet.getRange(1,1,4,3)//A1:C4を取得

  //Cellの最初のValueを取得(戻り値が文字列なのでそのまま出力)
  var value = range.getValue();
  Logger.log(value)
  //Cell範囲のValueを取得(戻り値が二元配列なのでfor文を回して出力)
  var value = range.getValues();
  for (var i = 0; i<value.length;　i++){
    for(var j = 0; j<value[i].length;　j++){
      Logger.log(value[i][j])
    }
  }
}
```


上記が各valueの出力方法である。
GASではデバックする際に基本はLogger．logで対応する事になるので覚えておくと便利だ。


#おわり

ここまでで基本的なスプレッドシートの値の取り扱いについては一旦まとめ終わったので、一区切りとしたいと思う。
予想以上に長くなってしまったので、題名の期待を裏切らないためにシリーズ化します笑

次は取り出した値を別のシートに貼り付ける方法とGoogleAppsScriptのトリガーについて説明します。