LINEBotを作るのにGASが便利な５つの理由

[LINE Developers Community](https://linedevelopercommunity.connpass.com/)のイベントに参加し、GASでLINEBotを作ったところ、
環境面でつまづくことが少なかったことから記事としてまとめてみました。

## 成果物

LINEBotドクターイエロー運行案内
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150628/025092e2-2918-5353-24a7-8ec8c14bd570.png)

ドクターイエローとは新幹線の高速運転を支える様々な設備の状況を走りながら測定する車両で、「新幹線のお医者さん」と言われています。
また、めったに見れないことから見ると幸せになれると言われています。
このBotではドクターイエローの運行予定日には運行予定を案内したり、運行予定日のカレンダーを見ることができます。
鉄道好きな人やパパママさんには是非使っていただきたいです。

## アジェンダ

1. GASを進める理由
    1. [リリース方法がシンプル](#リリース方法がシンプル)
    1. [認証方法を３つ選べる](#認証方法を３つ選べる)
    1. [指定したサイクルで自動実行できる](#指定したサイクルで自動実行できる)
    1. [機密情報をプロパティで管理できる](#機密情報をプロパティで管理できる)
    1. [JavaScript／TypeScriptで実装できる](#JavaScript／TypeScriptで実装できる)
1. [まとめ](#まとめ)

## GASを進める理由

GoogleAppsScript（GAS）はLINEBotの開発をするのにとても便利なプラットフォームなんです。
LINEBotを作る上で環境面においてトラブルなく利用できているので重宝しています。
理由は下記の通り。

1. デプロイがシンプル
2. 認証方法を３つ選べる
3. 指定したサイクルで自動実行できる
4. 機密情報をプロパティで管理できる
5. JavaScript／TypeScriptで実装できる

---

### リリース方法がシンプル

GASの画面からポチポチするだけで、即時にリリースできます。
手順は３つ、これだけ。

1. デプロイ→デプロイを管理
2. 編集
3. 下記の内容でデプロイ
    1. バージョン＝新しいバージョン
    2. 説明＝リリース内容（任意）
    3. 次のユーザーとして実行＝自分。（初回指定）
    4. アクセスできるユーザー＝LINEBotのwebhook用なら全員（初回指定）

### 認証方法を３つ選べる

認証の仕組みは本当に難しいので、なるべく触れたくない。
GAS側で選択できるのは大変ありがたい。
アクセス範囲を絞ることはセキュリティ対策として有効。

|選択肢|スコープ|内容|
|---|---|---|
|自分のみ|private|いわずもがな|
|ドメイン（会社名）の全員|protected|同じ会社内の人ならアクセスできる。<br/>会社用など特定のGoogleアカウントのみ表示される。|
|Googleアカウントを持つ全員|internal|Googleアカウントを持つ人がログインすれば使用できる。|
|全員|public|いわずもがな|

### 指定したサイクルで自動実行できる

webアプリだけでなくバッチ処理としても利用できます。
ドクターイエロ－の運行案内では毎日実行する設定にして、
スプレットシート内の運行予定日と一致したらBotからメッセージを送信するようにしています。

1. トリガー→トリガーの追加
2. 実行する関数を選択
3. 実行するデプロイを選択→デプロイで指定したバージョンのこと。HEAD＝最新
4. イベントのソースを選択→時間主導型
5. 時間ベースのトリガーのタイプを選択
6. 選択値によって実行するサイクルを指定する

エラー通知は選択式ですが、＋で通知タイミングが追加できます。

### 機密情報をプロパティで管理できる

なんかのキーやトークンなど、アプリ固有の機密情報をどこにどう格納してどこから取得するか、
安全かつシンプルに検討する必要があります。
GASにはプロジェクトのプロパティがあり、ここでKey/Valueペアの値を管理することができます。
プロジェクトのプロパティを表示するにはクラシックエディタへの切り替えが必要です。

1. GASでエディタを開く
1. クラシックエディタを使用する
1. ファイルメニュー＞プロジェクトのプロパティ
1. `スクリプトのプロパティタブ`を選択

プロジェクトのプロパティに登録した値は`PropertiesService.getScriptProperties().getProperty(プロパティ名)`で取得できます。
コードを書く必要はありますが、↓のコードで使い回しが可能です。

```js
function GetSystemProperty(key) {
    const value = PropertiesService.getScriptProperties().getProperty(key);
    if (value === null) {
        console.error(`key[${key}]がプロパティに存在しません。`);
    }
    return value;
}
```

### JavaScript／TypeScriptで実装できる

この章はコードを書きたいエンジニア向けになります。
GASを実装するにはGASのエディタで直接コーディングすることになります。
GASのソースの拡張子は`.gas`ですが、中身はJavaScriptです。
だったらJavaScriptでできるやん！を叶えてくれるライブラリがgoogleから提供されています。
下記のライブラリを入れたら、VSCodeで開発できるし、Githubでも管理できるようになりますね。

> clasp

GASへのデプロイやプロジェクトのクローンなどをコマンドで操作できるライブラリです。
`clasp push`でjsファイルからgasファイルに変換されてGASにデプロイしてくれます。
使用するにはGASプロジェクトにて`Google Apps Script API`を有効にする必要があります。
有効にするにはApps Scriptコンソールの設定から変更できます。

https://github.com/google/clasp

> google-apps-script

スプレッドシート等のライブラリを含んだ、GASを開発するためのライブラリです。

https://www.npmjs.com/package/google-apps-script

---

# まとめ

LINEBotの開発においてGASを進める理由は下記の通りです。

1. [リリース方法がシンプル](#リリース方法がシンプル)
1. [認証方法を３つ選べる](#認証方法を３つ選べる)
1. [指定したサイクルで自動実行できる](#指定したサイクルで自動実行できる)
1. [機密情報をプロパティで管理できる](#機密情報をプロパティで管理できる)
1. [JavaScript／TypeScriptで実装できる](#JavaScript／TypeScriptで実装できる)

引用

* [Youtube(LINE Developers Community)](https://www.youtube.com/channel/UCZkYYwmvSA6y7WWLxM5x9IA)
* [3/7(月)開催！【作って】「LINE×ノーコード」LT大会【発表！】](https://linedevelopercommunity.connpass.com/event/239771/)
* [5分で理解する　Google Apps Script](https://qiita.com/Brutus/items/efbd5fda4c9316fc9e3b)
* [Google Apps ScriptをTypeScriptで書いてみた](https://dev.classmethod.jp/articles/ts2gas/)
* [clasp公式](https://github.com/google/clasp)
* [npm(google-apps-script)](https://www.npmjs.com/package/google-apps-script)