【GAS】スプレッドシートでGASを使用する

# はじめに
GASを使う機会があり、その際に調べたことを共有したいと思います。
サンプルとして下記の整列前のデータを、No順に整列させて整列後に入力します。
GASを使用したスプレッドシートからの値の入出力について、学べる内容となってますので、
初心者の方は参考になると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/1465ede9-229a-d264-9965-efcfde8f1ded.png)


# 目次
<!-- タイトルとアンカー名を編集 -->
* [①スプレッドシートにGASを追加する](#Chapter1)
* [②GASでコードを書く](#Chapter2)
* [③コードを実行する](#Chapter3)
* [④トリガを設定する](#Chapter4)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# ①スプレッドシートにGASを追加する
スプレッドシートの拡張機能からApps Scriptを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/71c30548-bdf7-09cf-aacb-0ab0e3fe97a8.png)

すると下記のように自動で作成されるので、ここにコードを書いていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/403f7c26-61da-1e1a-9268-17273192b31f.png)

<a id="#Chapter2"></a>
# ②GASでコードを書く
GASの文法はJavaScriptと同じです。
ただ、Googleのアプリを操作するためには、用意された特有のメソッドを使用する必要があります。
あと最初に頭に入れておいたほうがいいのは、 **アプリを操作するためのメソッドの呼び出し回数は少ないほうがいい** 、ということです。
スプレッドシートで説明すると、セルの内容を取得するメソッドがありますが、
セルの内容を一つ一つ取得するより、必要な範囲を一括で取得するほうがいいということです。
理由はその方が動作が高速になるからです。
コードの全文は以下になります。
説明はコメントにしておきます。

```js
function myFunction() {
  // 整列前のデータの範囲はB4:C8
  // GASでは、行と列は、1始まり(A1は、行1,列1でアクセス)
  // 整列前のデータのはじめのセルの行
  const START_INPUT_ROW = 4;
  // 整列前のデータのはじめのセルの列
  const START_INPUT_COLUMN = 2;

  // 整列後のデータの範囲はE4:F8
  // 整列後のデータのはじめのセルの行
  const START_OUTPUT_ROW = 4;
  // 整列後のデータのはじめのセルの列
  const START_OUTPUT_COLUMN = 5;

  // 整列前後で共通のデータ数
  // データの行数
  const ROW_COUNT = 5;
  // データの列数
  const COLUMN_COUNT = 2;

  // スクリプトと紐づいているスプレッドシートを取得
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // スプレッドシートからシートを取得
  const sheet = spreadsheet.getSheetByName("シート1");
  
  // getRange(行, 列, 行数,　列数)で、範囲を取得
  // 他にも、getRange('B4:C8')とかでも取得可能
  const inputRange = sheet.getRange(START_INPUT_ROW, START_INPUT_COLUMN, ROW_COUNT, COLUMN_COUNT);

  // 範囲の値を取得
  let inputValues = inputRange.getValues();

  // 取得した値は、「行 x 列」の二次元配列です。
  // Noの内容でソートします。
  inputValues.sort((a, b) => a[0] - b[0]);

  // ソートしたデータをセルに出力します
  // 出力範囲を取得
  const outputRange = sheet.getRange(START_OUTPUT_ROW, START_OUTPUT_COLUMN, ROW_COUNT, COLUMN_COUNT);

  // 出力範囲に値を出力
  outputRange.setValues(inputValues);
}
```


<a id="#Chapter3"></a>
# ③コードを実行する
とりあえず一回コードを実行してみましょう。
下記の実行またはデバッグを押します。
デバッグで実行した場合、任意の場所に「debugger;」を入れるとそこでブレークするようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/07d1c1fe-97f7-8a1d-bba5-5a3eea7c1888.png)

1.初めて実行するとこの画面になると思いますので、権限を確認を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/b6b6ee2a-833d-cf5a-e464-03fc0c0a0cf8.png)

2.スクショを忘れましたが、Googleアカウントを選択してください。

3.詳細を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/e128bc1f-2165-938a-7d97-e57d642bcf00.png)

4.赤枠を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/e8aa80ea-4e22-7e8c-6586-ae866fbaa75b.png)

5.スクショを忘れましたが、4の次のページで、許可を押下してください

すると、実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/fdeca024-847c-0847-3794-bc3b1163ebec.png)

<a id="#Chapter4"></a>
# ④トリガを設定する
使用ケース的には、何かのタイミングで自動的にGASを実行したいという場面がほとんどかと思います。
そういった場合、下記のトリガから設定ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/68a237b2-c56d-45fd-da51-cfd7c10c5e12.png)

トリガーを追加で、スクリプトの実行タイミングを制御できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/d8696aa8-92be-948e-7529-fab4704e3856.png)

トリガーの種類については以下のリンクがわかりやすかったです。
https://auto-worker.com/blog/?p=4490#