LINEbot+GASでアンケートフォームを作成したりカレンダーの予定表を教えてくれる簡単なボットプログラムを試してみる

## はじめに
こんにちは。
少し前にGoogleの各種サービスと連携できるGAS(Google Apps Script)の存在を知り、
チャットボットと組み合わせたら何か面白そうだなと思い、ちょっと試してみました。
今回はLINEbotとつなげてみます。

## GASとは
- Googleが提供しているスクリプト言語で、JavaScriptをベースにつくられています
- Googleドライブやスプレッドシートを操作したり、Googleの各種サービスをはじめ、外部サービスとも連携して便利なWebアプリケーションを作成することができます
- Googleアカウントを持っていれば無料で利用できます
- [こちら](https://developers.google.com/apps-script/overview)に概要が記載されています

## LINEbotとは
- LINEが提供するボットサービスです
- [Messaging API](https://developers.line.biz/ja/docs/messaging-api/overview/)を使うことで、ユーザーのメッセージに自動で応答するボットを作成したりできます
- LINEアカウントを持っていれば無料で利用できます（フリープランだと、毎月1,000通まで無料でメッセージ送信できるようです）

## 作成したプログラム
ものすごく簡単なものですが、こんなものを作成してみました。
##### ①アンケートフォームの雛形作成
メッセージを送ると、
![あとで削除7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/84abe9ad-8977-0f46-9b9d-4c83b1a106e4.png)

アンケートフォームの雛形が作成される。

![あとで削除8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/8b9749db-de1c-bbe5-b245-eca6005d4cb2.png)

URL開くと、こんな感じ。

##### ②当日のカレンダーの予定を通知
メッセージを送ると、
![あとで削除9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/eb79e9d2-b904-6664-70d7-7c5e2fda6340.png)

カレンダーに登録しているその日の予定を通知する。

## 作成手順
#### ①LINEbotを作成する
1. LINEbot作成のためのチャネルを作成する。手順は[こちら](https://developers.line.biz/ja/docs/messaging-api/getting-started/#using-console)
2. LINEbotを作成する。手順は[こちら](https://developers.line.biz/ja/docs/messaging-api/building-bot/)  
※「Webhook」の箇所は、後でGASを作成する際のURLと紐づけるため、この段階では飛ばしてかまいません  
※ LINEbotを友達追加したら、続いてGASを作成していきます。


#### ②GASを作成する
#####1. ブラウザからGoogleドライブにアクセス→左上の新規ボタン→その他→Google Apps Scriptをクリック。
すると、「無題のプロジェクト」画面が立ち上がると思います。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/f5b770fb-7289-4236-1665-dff3488bc30e.png)

####2. スクリプトを書いていく。以下をコード.gsのエディタに貼り付けます。
※１、チャネルアクセストークン。２、CalendarApp.getCalendarByIdに指定する自分のメアド、の箇所を自身のものに書き換えます。

```js
// LINEbotのWebhookでコールされる
// ---①
function doPost(e) {
  var resultMsg = "";
  var events = JSON.parse(e.postData.contents).events;
  events.forEach(function(event) {
    if(event.type == "message") {
      if (event.message.text.includes("アンケート")) {
        resultMsg = createForm();
      } else if (event.message.text.includes("予定")) {
        resultMsg = getSchedule();
      } else {
        resultMsg = "応答できません。"
      }
      reply(event, resultMsg);
    }
 });
}

// アンケートフォームを作成
function createForm() {
  // ---②
  var form = FormApp.create("新規アンケートフォーム");
  form.setAllowResponseEdits(true);
  return "アンケートフォームを作成しました。\n" + form.getEditUrl();
}

// カレンダーの当日の予定を取得
function getSchedule() {
  // ---②
  var calendar = CalendarApp.getCalendarById("ご自身のメールアドレスを指定してください。");
  var events = calendar.getEventsForDay(new Date());
  var resMsg = "【今日の予定】\n";
  events.forEach(function(element) {
    resMsg = resMsg.concat("・" + element.getStartTime().getHours().toString().padStart(2, "0") + ":" + element.getStartTime().getMinutes().toString().padStart(2, "0"));
    resMsg = resMsg.concat("-" + element.getEndTime().getHours().toString().padStart(2, "0") + ":" + element.getEndTime().getMinutes().toString().padStart(2, "0") + " ")
    resMsg = resMsg.concat(element.getTitle() + "\n");
  });

  return resMsg;
}

// LINEbotのチャネルアクセストークン
var channel_access_token = "LINEbot作成時に発行したチャネルアクセストークンを指定してください。"

// LINEbotにレスポンス送信
function reply(e, msg) {
  var message = {
    "replyToken" : e.replyToken,
    "messages" : [
      {
        "type" : "text",
        "text" : msg
      }
    ]
  };
  // ---③
  var replyData = {
    "method" : "post",
    "headers" : {
      "Content-Type" : "application/json",
      "Authorization" : "Bearer " + channel_access_token
    },
    "payload" : JSON.stringify(message)
  };
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", replyData);
}
```

①：LINEbotに設定するWebhookでdoPostメソッドがコールされます。
　　このメソッド内に処理を記述していきます。
②：Googleの各種サービスを操作するためのクラスです。
　　FormAppはGoogleアンケートフォーム、CalendarAppならGoogleカレンダーといった具合に。
　　ほかにもGmailやスプレッドシート用のクラスもあります。
　　リファレンスは[こちら](https://developers.google.com/apps-script/reference)。
　　左メニューの「Google Workspace services」から確認できます。
③：レスポンスを生成します。payloadに設定したメッセージが最終的にLINEbotから返答されます。<br>

####3. GASをWebアプリケーションとして公開  
#####1. Webアプリケーションとして公開
- 画面右上の「デプロイ」ボタンをクリック→「新しいデプロイ」をクリック
![あとで消す1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/9d7ea5dc-7918-c4e7-fb56-1717207c79e2.png)
- 「種類の選択」の隣の歯車アイコンをクリック→「ウェブアプリ」を選択
![あとで消す2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/3d633d6d-01bf-218a-39fc-ffa87b100ed3.png)
- 以下設定して「デプロイ」ボタンをクリック  
説明：任意の説明文。未入力でも可。  
ウェブアプリ（次のユーザーとして実行）：そのまま。（自分のメアドが表示されている。）  
ウェブアプリ（アクセスできるユーザー）：全員
- 初回デプロイ時はアクセス許可の設定が必要なため、「アクセスを承認」をクリック→立ち上がるポップアップ画面で自分のGoogleアカウントを選択
![あとで消す4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/bc25313a-8718-02b5-97da-2cac5865029f.png)
- 警告が表示されますが気にせず、詳細→「無題のプロジェクト（安全ではないページ）に移動」をクリック→次のページで「許可」をクリック
![あとで消す5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/096721cf-699d-9513-05da-64ca37d3493d.png)
- 以下のようにデプロイ情報が表示されるので、ウェブアプリのURLをコピーしておく。（後からでも、デプロイボタン→デプロイを管理から確認可。）
![あとで消す6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/9cc0daef-4173-7225-414c-623d36f22ae9.png)

※ちなみに、デプロイしたAPPをアンデプロイする場合は、同じくデプロイボタン→デプロイを管理→設定欄の一番右のアイコン（デプロイメントをアーカイブ）→アーカイブボタンクリック、でアンデプロイできます。
![あとで削除13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/1b32362e-2d58-aab3-219b-8af703713202.png)


#### ③LINEbotのWebhookを設定
- 先ほどコピーしたGASのWebアプリケーションURLを、LINEbotのWebhook欄に設定
![あとで消す3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/2b485559-343b-9fa5-4499-8d88ab9aabdf.png)
- 「検証」ボタンをクリックして、疎通確認をします。OKと表示されれば接続できています。

#### ④LINEbotにメッセージを送ってみる
試しに、LINEbotに「アンケート」とメッセージを送ってみます。
![あとで削除10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/9050428f-c1d3-9d0b-097c-8941a3f6aad3.png)

アンケートフォームのURLが返ってきますね！

![あとで削除11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/79232674-734a-829e-e4ab-49fbc419208b.png)

URLをクリックすると、アンケートフォームの編集画面が表示されます。
あとは必要な質問項目を追加していくだけです。
ちなみに、編集権限をリクエスト〜みたいなボタンが表示されていれば、そのボタンをクリックして自分のGoogleアカウントでログインすると、同じく編集画面になるかと思います。

続いて、LINEbotに「予定」とメッセージを送ってみます。
![あとで削除12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/e038c869-b8ac-4459-5eb7-68d5e9405a27.png)

当日の予定が返答されます！

## 終わりに
LINEbotとGASの組み合わせで、自前でサーバーを用意せずとも手軽に使い始められるのが良いなと思いました。
GASをもっと使って、面倒な作業はどんどん自動化していきたいと思います。
簡単なものでしたが、今回ので何か１つでもご参考になったことがありましたら、嬉しいです。