【スプレッドシート】初めてのカスタム関数 with Google Apps Script

2021年[NI+C Advent Calendar 2021](https://qiita.com/advent-calendar/2021/niandc_teamgcp)の18日目です。

# 目次
- はじめに
- Google Apps Scriptとは
- Google Apps Scriptの使い方
- よく使うメソッド（書き方）
- スクリプトを読み解く
- 終わりに


# はじめに
Googleスプレッドシートを上手く活用するためのカスタム関数の作り方についての記事になります。
カスタム関数はGoogle Apps Scriptを使って作成していきます。
カスタム関数を作る上で必要となるGoogle Apps Scriptの書き方についてまとめました。

# Google Apps Script（GAS）とは
javascriptをベースとしたGoogleによって開発されたプログラミング言語です。
実行環境の設定等の面倒な事前準備が必要がなく、すぐに始められるため、初めてプログラミングをする人でも触りやすいと思います。
カスタム関数を作成する以外にも様々な活用方法がありますが、それらに関しては他記事参照。（Webアプリ、チャットボットetc）

# Google Apps Scriptの使い方
1.Googleスプレッドシートを開き、ツールバーの拡張機能からApps Scriptを押下します。
![スクリーンショット 2021-12-18 12.33.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/58cfccdf-1c15-cfd8-0549-245f023cf25b.png)
![スクリーンショット 2021-12-18 12.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/f4e63a07-7020-4903-50aa-a7b2a208dd21.png)


2.関数の{}内に処理スクリプトを追加し、Ctrl + Sで保存します。
![スクリーンショット 2021-12-18 12.47.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/c425180f-fdaf-c480-eb7f-b385d78393c2.png)


3.作成した関数を実行します。
関数の実行方法は３種類あります。
- エディタ画面から実行
- ボタン（図形）を配置して実行
- ツールバーから実行

#### エディタ画面から実行
エディタ画面上部で実行する関数を選択し実行ボタンを押下します。
![スクリーンショット 2021-12-18 12.49.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/b996a669-b4bb-5c0f-4b32-fad139cf2aa8.png)

#### ボタンを配置して実行
スプレッドシートで図形を配置し、そこに実行する関数を割り当てて実行します。
![スクリーンショット 2021-12-18 12.44.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/6766834c-3338-895b-bef2-125f2f50033b.png)
![スクリーンショット 2021-12-18 12.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/5f35ca79-da4b-f649-ecd6-56c316fa019b.png)

#### ツールバーから実行
スクリプト内にツールバーに関数を表示する処理を追加し、メニューからスプレッドシートの実行します。（詳しくは他記事参照）
![スクリーンショット 2021-12-18 12.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/6cda47f2-765e-152c-e8b1-8175d1dcbeea.png)


# よく使うメソッド
スプレッドシートを活用する上で基本となるメソッド（取得・操作方法）を記載します。
### データ取得
- スプレッドシートの情報を取得：SpreadsheetApp.getActive()
    - まずはこれ。スプレッドシートの情報を取得します。
- シートの情報を取得：.getSheetByName()
    - シートを指定してスプレッドシート情報からシート単体の情報に絞り込みます。
- セル範囲の情報を取得：.getRange()
    - セル単体や範囲を指定して情報をさらに絞り込みます。
- 値の情報を取得：.getValue()／.getValues()
    - getRangeで指定した範囲のセルの値を取得しリストで返します。
### データ挿入
- 値を挿入：.getValue()／.getValues()
    - 指定したセルに値を挿入します。

### 合わせて覚えたい
- 値をリスト化：.flat()
    - .getValuesで取得した値リストを一次元に整えます。
    - 後述のfor文で使う際に便利です。

ここで例を一つ
スプレッドシートのシート名「test」、セルA1に書いてある内容をセルB1に書き写す場合
![スクリーンショット 2021-12-18 13.06.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/c0653f3f-70bb-9dc9-af29-b03d2f6de601.png)

こんな感じです。これがカスタム関数を作る上での基本となります。

ここにプログラムチックな２つの要素を追加して活用していきます。
それが「if文」と「for文」です。
### if文
条件分岐させる場合に使う書き方で、「もし条件1ならパターンAの処理をしたい、条件2ならパターンB、それ以外ならパターンCの処理」といったように設定します。
書き方はこんな感じ
![スクリーンショット 2021-12-18 13.28.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/38e1cbbb-d4fc-8aee-ea32-7db93eda3cb3.png)



上から順番に条件確認が行われ、最初に条件が合ったものの処理が行われます。
ifだけでも使用可能です。else if、elseは必要なければ設定する必要はありません。
長くなってしまうので、詳しくは「javascript if文 書き方」で検索すると条件式の書き方がわかると思います。

### for文
繰り返し処理を行う場合に使う書き方で、「ここからここまでAの処理をしたい」といったように設定します。
()にスタートの値、繰り返し条件、繰り返し毎の値の増減を設定します。
例えば0番目から始まって10番目まで繰り返し処理を行う場合はこのようになります。
![スクリーンショット 2021-12-18 13.35.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/d673c52e-277a-1a62-306b-824ffea702c0.png)


長くなってしまうので、詳しくは「javascript for文 書き方」で（略

# スクリプトを読み解く
ここで一つ例としてシート名「result」にあるテスト結果からAクラスの人の点数平均を算出し、シート名「average」に挿入するを記載します。それを読み解いてみましょう。

#### シート「result」
![スクリーンショット 2021-12-18 12.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/371269f2-59dd-448c-0cb3-b01fa21ed994.png)

#### スクリプト
![スクリーンショット 2021-12-18 14.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/90028dda-1f79-72ce-7b00-a008ef8e5157.png)


## 解説
まずはスプレッドシートお作法部分
スプレッドシートの情報を取得し、どのシートを使うか設定します。
![スクリーンショット 2021-12-18 14.18.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/1bbb5982-fa84-1c0d-72ce-dcbd37c22969.png)

次にテスト結果が書いてあるセル範囲を設定し、値を取得します。
![スクリーンショット 2021-12-18 14.20.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/8612e90f-3a88-f38a-9337-97e83fde3830.png)

for文とif文を組み合わせて、リストを0番目から順番に参照して、「クラスがA」の場合は得点を加算します。それ以外は無視します。
![スクリーンショット 2021-12-18 14.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/95ce912e-3b9c-473f-a5ba-b588b6523919.png)

for文の繰り返し処理が終わったら加算した得点から平均点を算出し、averageシートに算出した平均点を挿入します。
![スクリーンショット 2021-12-18 14.25.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/f469a3c8-6f6d-2ab8-3625-bf77f4849215.png)

![スクリーンショット 2021-12-18 14.50.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211156/e0c7f053-f680-4c62-0a31-80054e124993.png)


# 終わりに
今回はスプレッドシートのカスタム関数を作成する上で必要となる基本的な部分をまとめてみました。
Google Apps Scriptは開発環境の準備も必要ありませんし、プログラミング初心者の方でも触れやすいかと思います。
今回は単純な関数を作成してみましたが、もしご興味を持っていただけたら、より詳細な内容や注意点をまとめた記事を投稿されていますので、そちらを参考にご自身の業務に合った関数を作ってみてください。