LINE Bot でGoogleフォームを使って簡易的なユーザー登録をさせ、プッシュメッセージを送る

# はじめに
LINE Botを作っていて、LINE ID やGroup Idを利用してpush message を送りたいときに、簡単なユーザー登録をさせるtipsです

YouTuberの仲条さんの動画で紹介されました！（ちょっと記事でつまづくことがあるので、この動画見ながらだと安心です！！！）
https://www.youtube.com/watch?v=YURez52I2Mc

# 使う技術
GAS
LINE Bot
Googleフォーム

# 前提
[5分でつくるLINEBot](https://qiita.com/cog1t0/items/0d121ee6d48a8c1634fc) を元に、「オウム返しBot」の作成は完了させておいてください
今回は、複数人が登録しているグループに追加されたBotが、グループIDを取得するまでを行います

# Googleフォームの準備

## Googleフォームの「事前入力したURLを取得」の説明
登録名とグループIDを入れる用の設問を用意します
グループIDは自動で入力させるのでユーザーが触らないように！という文言を書いておきます。（書き換えないかどうかは、ユーザーの善意頼りですが、プロトタイプなので良しとしましょう！）
![スクリーンショット 2022-10-31 0.56.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/94a404b2-1096-038f-cb95-36098c559503.png)

ページ右上のメニューを展開し「事前入力したURLを取得」を選択します
![スクリーンショット 2022-10-31 0.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/a5fdbfbe-bf2a-4da6-a678-4398071ba310.png)

IDの設問に適当な文字を入力し、「リンクを取得」を押します
![スクリーンショット 2022-10-31 0.56.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/f0a85fb7-fc7f-737c-db72-51d3fb695682.png)


末尾に「test」とあるURLがコピーできたらメモ帳か何かに保存しておきましょう
```
https://docs.google.com/forms/d/e/1FAIpQLSfkTMZCaibmWcki1KS6Lv-3sQsDGlsUv1li9fnVGMsOnE87Dw/viewform?usp=pp_url&entry.36173468=test
```

試しに、この「test」の文言を「111222333444」に変更しURLにアクセスをすると
```
https://docs.google.com/forms/d/e/1FAIpQLSfkTMZCaibmWcki1KS6Lv-3sQsDGlsUv1li9fnVGMsOnE87Dw/viewform?usp=pp_url&entry.36173468=111222333444
```

![スクリーンショット 2022-10-31 1.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/aaf59b53-2f40-9637-441f-d14661f03092.png)

これを利用してユーザー登録を行います！

:::note
上記URLはサンプルなので、自分のフォームを作ってから先に進んでください
:::

## Googleフォームの回答を既存のスプレッドシートに出力する

[5分でつくるLINEBot](https://qiita.com/cog1t0/items/0d121ee6d48a8c1634fc)をやっている前提ですので、まだの人はこちらの作業を終えてから戻ってきてください。

Googleフォームでの作業です。
「回答」からスプレッドシートのマークを選択します
![スクリーンショット 2022-10-31 1.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/fe342713-05a9-0941-cc5d-e666744455c5.png)

![スクリーンショット 2022-10-31 1.20.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/c2f6e8cd-5857-9689-fa5b-ab4d740bcef5.png)

[5分でつくるLINEBot](https://qiita.com/cog1t0/items/0d121ee6d48a8c1634fc)でコピーしたスプレッドシートを選択すると、このようにシートが追加されます
![スクリーンショット 2022-10-31 1.20.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/f6b332be-fbb9-7995-fe39-c8b3e74114fd.png)

これでフォームの準備は完了です。

# GAS の修正
5分でつくるLINEBotのGASのコードを修正していきます

:::note
Botがグループへ参加出来るようにするには、LINE Developersから「グループトーク・複数人トークへの参加を許可する」の設定を有効にしてください
:::
![スクリーンショット 2022-10-31 2.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/38904d64-c42a-9e0d-77e0-737bba60d500.png)



doPost関数を以下のように変更します。
```js
//ポストで送られてくるので、ポストデータ取得
function doPost(e) {
  // 動作確認用のログ出力
  log_to_sheet("A", "doPost")

  //JSONをパースする
  json = JSON.parse(e.postData.contents);

  //返信するためのトークン取得
  reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }

  let messages
  if (json.events[0].source['groupId'] && json.events[0].message.text === "ユーザー登録") {
    // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    let url = "さっきコピーしたURLでtestを抜いたものをここにコピー(文末は、viewform?usp=pp_url&entry.36173468= みたいな感じになるかと思います)"
　　　　　　// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    url = url + json.events[0].source['groupId']
    messages = [{'type': 'text', 'text': "ユーザー登録はこちらから " + url }]

  } else {
    // オウム返し
    messages = test_message()
  }


  // テスト動作ができたら、your_messageの中身を追加して、自分のオリジナルのLINEBotにしてみましょう
  // messages = your_message()

  // メッセージの中身を確認したい時には以下のコメントアウトを外して、sheet「log」に書き込まれる内容を確認しましょう
  // log_to_sheet("A", messages)

  // メッセージを返信
  send_reply_message(messages)

  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
```
## コードの解説

ユーザーからのメッセージにグループIDが存在する場合、以下のコードで取得ができます。
```js
json.events[0].source['groupId']
```

ユーザーからのメッセージにグループIDが存在して、メッセージが「ユーザー登録」の時だけユーザー登録用のURLを送信するようにします
```js
if (json.events[0].source['groupId'] && json.events[0].message.text === "ユーザー登録") {

} else {

}
```

先ほどコピーをしたURLの「test」部分をユーザーから取得したグループIDで置き換えます
```js
let url = 'https://docs.google.com/forms/d/e/1FAIpQLSfkTMZCaibmWcki1KS6Lv-3sQsDGlsUv1li9fnVGMsOnE87Dw/viewform?usp=pp_url&entry.36173468=' + json.events[0].source['groupId']
```

そうするとこのようにユーザー登録用のURLを返却してくれます
![S__4620333.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/3c3f1e30-7f01-8322-1b6a-26efb1cbb5a4.jpeg)

フォームを送信すると、スプレッドシートにデータが入っていることを確認できます
![スクリーンショット 2022-10-31 1.43.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/9d583b53-c98e-f70b-e6d0-e17021702c12.png)

# プッシュメッセージ送信機能を実装

プッシュメッセージは無料の範囲だと月間1000メッセージしか送れないので注意しましょう

スプレッドシートのsheet1にこのようにプッシュメッセージで送りたい相手、送りたいメッセージを記載しておきます。
![スクリーンショット 2022-10-31 2.38.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/70208f0f-7090-d76e-43c1-05e4ccd6c6b9.png)

（VLOOKUP関数を使って、対象家族の値でシート「フォームの回答1」を検索し、group_idをsheet1に取得しています）

プッシュメッセージを送信したら、ステータスに「送信完了」というメッセージを入れ、次から送信対象にしないようにします。



```js
function test(){
  // sheet1 を指定
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1');
  // 全データを取得
  const all_data = sheet.getDataRange().getValues();

  let messages = []
  let group_id
  
  for(let i = 1; i < all_data.length; i++) {
    if(all_data[i][0] != "送信完了" && all_data[i][2]){ // ステータスが送信完了でなく、group_idが存在する場合
      group_id = all_data[i][2]
      messages.push({'type': 'text', 'text': all_data[i][3]})
      pushMessage(group_id, messages)
      sheet.getRange(i+1, 1).setValue("送信完了")
    }
  }
}

function pushMessage(group_id, messages) {
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'to': group_id,
      'messages': messages,
    }),
  });
}
```

これでGASで関数testを選択し、実行ボタンを押すと、プッシュメッセージが送信されるようになりました。
![スクリーンショット 2022-10-31 2.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/41ec486c-706c-4982-a9c7-d35f0573b942.png)

実際には、この送信する関数を、GASの機能で定期的に実行するといったことが必要になってくると思いますが、ひとまずGoogleフォームでの簡単なユーザー登録とプッシュメッセージの送信ができるようになりました。