40 代おっさん GASのRangeクラスについて学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## Rangeクラス

Rangeクラスとは
セル範囲を操作する機能を提供するクラス

＊Rangeクラスの主なメンバーの図はさすがに作るのがきびしいので、参考資料の本を見ていただくか、ネットで調べください。

ちなみにこちらで書いてありました。
<https://hirachin.com/post-4021/>

お試し

```javascript
function toshiki4() {
  const range = SpreadsheetApp.getActiveSheet().getRange('A2:C4');

  console.log(range.getA1Notation());
  console.log(range.getRow());
  console.log(range.getColumn());
  console.log(range.getNumRows());
  console.log(range.getNumColumns()); 
  console.log(range.getLastRow());
  console.log(range.getLastColumn());
}
```

### 値を収得、入力

getValueメソッド
単体セルの収得

構文

```javascript
Rangeオブジェクト.getValue()
```

setValueメソッド
セルの入力

```javascript
Rangeオブジェクト.setValue(値)
```

これだと複数のセルの収得すると複数分のアクセス回数が必要になる。
セル範囲が対象の場合は、配列として取得する。

getValuesメソッド
対象セル範囲の値を配列として収得

構文

```javascript
Rangeオブジェクト.getValues()
```

setValuesメソッド
配列を対象のセル範囲に入力

```javascript
Rangeオブジェクト.setValues(配列)
```

こちらの２つがとる配列は　行×列　になるので2次元配列になります。

＊setValuesメソッドでは対象となるセル範囲の　行数×列数　と引数として与える　要素数×要素数が一致している必要がある。

お試し
スプレッドシートにデータを入れてください

```javascript
function toshiki4() {
  const sheet = SpreadsheetApp.getActiveSheet();

  console.log(sheet.getRange('A3'));
  sheet.getRange('B6').setValue('こんにちは');

  console.log(sheet.getRange('A1:C2'));
  const values = [
    ['パパ', 41, '肉'],
    ['アッキー', 9, 'リンゴ']
  ];
  sheet.getRange(3, 1, values.length, values[0].length).setValues(values);
}
```

### 数式を入力

setFormulaメソッド

構文

```javascript
Rangeメソッド.setFormula(A1形式の数式)
```

setFormulaR1C1メソッド

構文

```javascript
Rangeメソッド.setFormulaR1C1(R1C1形式の数式)
```

setFormulasメソッド

構文

```javascript
Rangeメソッド.setFormulas(A1形式の数式の配列)
```

setFormulaR1C1メソッド

構文

```javascript
Rangeメソッド.setFormulasR1C1(R1C1形式の数式の配列)
```

A1形式は、A1、B2:C2という形に列をアルファベット、行を数字でセルの絶対アドレスを表現する形式

R1C1形式は、R[1]C[1] RC[-1]　と言うように、現在対象となっているセルからの相対的な位置を、行方向をRに続く値、列方向をCに続く値で表現する形式

お試し

```javascript
function toshiki4() {
  const sheet = SpreadsheetApp.getActiveSheet();

  sheet.getRange('B5:D5').setFormulas([[
    '=SUM(B2:B4)',
    '=SUM(C2:C4)',
    '=SUM(D2:D4)',
  ]]);
  sheet.getRange('D2:D4').setFormulaR1C1('=RC[-2]*RC[-1]');
}
```

### 書式を設定する

いきなりお試しで

```javascript
function toshiki4() {
  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.clearFormats();

  const rangeTable = sheet.getDataRange();
  rangeTable
    .setBorder(false, true, false, true, true, null)
    .setFontSize(14)
    .setFontFamily('メイリオ')
    .setNumberFormat('#,##0');

  const rangeHeader = sheet.getRange('A1:D1');
  rangeHeader
    .setBackgrounds([['yellow', 'yellow', 'yellow', 'orange']])
    .setHorizontalAlignment('center');

  const rangeTotal = sheet.getRange('A5:D5');
  rangeTotal.setFontWeight('bold');

  const rangeItemName = sheet.getRange('A2:A5');
  rangeItemName.setFontColors([['red'], ['orange'], ['purple'], ['glay']]);
}
```

こんな感じで使うみたいです。
雑ですいません。

### セル範囲の並び替え・重複の削除

sortメソッド
並び替えするメソッド
列番号を指定すれば対象セル範囲を指定した列をキーに昇順で並び替え

構文

```javascript
Rangeオブジェクト.sort(列番号)
```

複数の列をキーとしたい場合や降順で並び替えしたい場合
ソートを定めたオブジェクトを配列で指定
ascendingプロパティをtrueにすると降順、falseにすると降順

構文

```javascript
Rangeオブジェクト.sort([
  {column: 列番号, ascending: true/false}},
  {column: 列番号, ascending: true/false}},
  ...
])
```

removeDuplicatesメソッド
行の重複削除をすることができるメソッド
重複データがある場合は、一行だけ残して削除

構文

```javascript
Rangeオブジェクト.removeDuplicates([列番号の入れる])
```

お試し
スプレッドシートにデータを入れてください

```javascript
function toshiki4() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const row = sheet.getLastRow() - 1;
  const column = sheet.getLastColumn();

  const range = sheet.getRange(2, 1, row, column);
  range.sort([
    {column:1, ascending: true},
    {column:2, ascending: false}
  ]).removeDuplicates();  
}
```

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>