【0からGASを学ぶ】GAS × Gemini Pro API × LINE Messaging API によるあなただけの相談Botを作成する【決定版】

# はじめに
本シリーズでは、GASの始め方や便利な使い方、ビジネス活用まで幅広く解説します。シリーズをひと通り読んでいただければ、あなたもきっとGASマスターになれるはずです。

# シリーズの対象者
* そもそもGASってなんだか**わからない**方
* GASを学びたいけど**何から始めればいいか**わからない方
* GASはわかり始めたけど、**もっと活用ができないか**と模索している方
* とにかく**Googleが好き！** という方

# 前回記事
https://qiita.com/gas-suke/items/3ce261be244f9efd54b2

# Gemini Pro API をGASからアクセスする
では早速始めていきましょう。【0からGASを学ぶ】シリーズの第15回は「GAS × Gemini Pro API × LINE Messaging API によるあなただけの相談Botを作成する」です。前回は、**GASからGemini Pro APIを呼び出す**までを行いました。今回はさらに**LINE**とつなぎ、**LINEにメッセージを送るとGeminiが回答を返してくれる**という**夢のBot**を作成していきましょう。LINE Messaging APIを使うための準備がそれなりにあるのですが、順々に説明しますのでご安心ください！最終的なイメージはこんな感じです。
![015_032.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/3d0792f6-d405-d797-a23c-52bb4c7d9006.png)

## 今回やること
1. **LINE Messaging API**を使うための準備
1. GAS上で**LINE Messaging API**に値を返却
1. **LINE Messaging API**と**GAS**をつなぐ「Webhook設定」
1. **Gemini Pro API**の返答を**LINE Messaging API**に返却

:::note info
やることを見るとわかる通り、**メインはLINE Messaging APIの使い方**です。なぜなら、Gemini Pro APIからの返答は前回時点で受け取れてますから、あとは**どうやってLINEに返すかだけ**です。
:::

## STEP.1　LINE Messaging APIを使うための準備
※以下はLINE Developersに**未登録の方を前提**に手順を示しています。そのため、すでにアカウントをお持ちの方は、それをお使いの上、**手順No.8から実施**してください。

<table>
  <tr>
    <th>№</td>
    <th>手順</td>
    <th>イメージ</td>
  </tr>
  <tr>
    <td>1</td>
    <td>
    以下のログイン用URLにアクセスして、「アカウントを作成」をクリックします。<br/><a href="https://account.line.biz/login?redirectUri=https%3A%2F%2Fdevelopers.line.biz%2Fconsole%2F" target="_blank">https://account.line.biz/login?redirectUri=https%3A%2F%2Fdevelopers.line.biz%2Fconsole%2F</a>
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/1650c491-ead7-6bcf-75a9-2839d7af06fd.png" width="300"></td>
  </tr>
  <tr>
    <td>2</td>
    <td>
    「メールアドレスで登録」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/2a36cd26-cf91-b76c-7de4-bf2b89479391.png" width="300"></td>
  </tr>
  <tr>
    <td>3</td>
    <td>
    ご自身のメールアドレスを入力のうえ「登録用のリンクを送信」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/81182348-848b-5593-baab-fab27b513c26.png" width="300"></td>
  </tr>
  <tr>
    <td>4</td>
    <td>
    No.3で入力したメールアドレス宛に登録用リンクが送られてくるため、メール内の「登録画面に進む」または「登録用リンク」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/606d65be-9953-d40f-707e-ae8974b27063.png" width="500"></td>
  </tr>
  <tr>
    <td>5</td>
    <td>
    登録画面が開くため、[名前]と[パスワード]を入力し「登録」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/3e82d6f0-fdf1-0761-9f81-b9cd32ac73af.png" width="300"></td>
  </tr>
  <tr>
    <td>6</td>
    <td>「サービスに移動」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/b2f5eca6-1add-d056-6d7b-92a706ac172b.png" width="300"></td>
  </tr>
  <tr>
    <td>7</td>
    <td>開発者情報の登録画面が開くため、[開発者名]と[メールアドレス]を入力し「アカウントを作成」をクリックします。<br/>※この辺りからめちゃくちゃ登録させられるなとげんなりしてきます。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/12990fcd-348c-ca92-8370-ba62845c5fa1.png" width="300"></td>
  </tr>
  <tr>
    <td>8</td>
    <td>無事にDeveloper登録が完了しました。次にプロバイダー登録を行うため「新規プロバイダー作成」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/f3e56b4d-e63f-1167-343e-0276d5e5cd67.png" width="500"></td>
  </tr>
  <tr>
    <td>9</td>
    <td>[プロバイダー名]を入力し「作成」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/edaf8caa-e1f8-d01a-3936-9978bb421a92.png" width="400"></td>
  </tr>
  <tr>
    <td>10</td>
    <td>プロバイダーの管理コンソールに遷移します。ここで「Messaging API」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/013b09c6-8b53-9c65-d016-3421a363d029.png" width="500"></td>
  </tr>
  <tr>
    <td>11</td>
    <td>新規チャネル作成画面に遷移するため、必要最低限の入力項目（[所在地]、[チャネル名]、[チャネル説明]、[大業種]、[小業種]）を入力し「作成」をクリックします。<br/>※なお、ここで登録した内容もあとで変更することは可能であるため考えすぎずに。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/e72c5b96-39a0-f986-3d6b-110a67cb943e.png" width="400"></td>
  </tr>
  <tr>
    <td>12</td>
    <td>内容を確認し「OK」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/24c65540-8833-e062-0363-dbd4acc950b6.png" width="400"></td>
  </tr>
  <tr>
    <td>13</td>
    <td>情報利用に関する同意事項を確認し「同意する」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/06e2f0ff-b0d8-d9a3-9dfd-43ef4b1f1019.png" width="400"></td>
  </tr>
  <tr>
    <td>14</td>
    <td>個人規約に関する同意事項を確認し「同意する」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/4c21fd67-2a7e-74e4-7849-2512093131a6.png" width="400"></td>
  </tr>
  <tr>
    <td>15</td>
    <td>作成したチャネルの管理画面に遷移するため「Messaging API 設定」をクリックします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/71aa01e0-5ef0-a506-908f-f36b0484f140.png" width="500"></td>
  </tr>
  <tr>
    <td>16</td>
    <td>[QRコード]欄にLINEの友だち追加用のQRコードがあるため、これをスマホで読み込みLINEで友だち追加しておきましょう。<br/>※これはあとからでも構いませんが、先に作成したLINEボットにつなげてみましょう。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/bb2a8546-062f-3089-755f-3f3cee7bc8b9.png" width="500"><br/><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/55a301be-3677-15c4-d074-62841d21fa10.jpeg" width="200"></td>
  </tr>
  <tr>
    <td>17</td>
    <td>[チャネルアクセストークン]欄の「発行」をクリックします。<br/>※このトークンがLINE Messaging APIにつなぐためのキーとなります。発行後はトークンをコピーしておいてください。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/d0f0a617-a9a3-b6b0-3856-51436d313101.png" width="500"><br/><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/5484a761-5304-0b9e-aa6e-8aea4e524f5e.png" width="500"></td>
  </tr>
</table>

なお、あと（**STEP.3**）でLINE Developerには戻ってきますので、ページは閉じずに残しておいてください。

:::note warn
2023年12月時点での登録手順となるため、画面遷移等が若干異なる場合がございます。予めご了承ください。
:::

## STEP.2　GAS上でLINE Messaging APIに値を返却
今回も**スタンドアロン型でGASを記述**していきます。<a href='https://qiita.com/gas-suke/items/5cf7bd4c6c3f15a25838#%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89%E3%82%A2%E3%83%AD%E3%83%B3%E5%9E%8B' target='_blank'>こちら</a>を参考にGASエディタを起動してください。では、どんどんいきますよ、ついてきてください。少々**長丁場**となりますので、予めご了承ください。

### STEP.2-1　まずは仕様を確認
LINE Messaging APIは仕様も日本語でばっちり公開されてますので、**自分がやりたいことをうまく探し当てる**ことができれば、**比較的簡単に実装が可能**です。例えば、今回の実装で必要なことは以下の２点です。
1. ユーザからメッセージが送信された場合にGASでその**情報を受け取る**
1. GASからユーザに対して**メッセージを送信する**

#### ①ユーザからメッセージが送信された場合にGASでその情報を受け取る
これには**Webhook**という仕組みを使います。

::: note info
と、新しい言葉を登場させましたが、**WebhookとAPIは目的としては同じ**です。いずれも異なるシステムやアプリケーション間で**情報のやり取りを行う仕組み**です。主たる違いは、Webhookは**特定のイベント発生時（リクエストが不要なことも）に実行**され、APIは**リクエストすることで実行**され応答を受け取ることができます。
:::

この仕組みを用いることで、LINE上でユーザがメッセージを送信すると、**LINEからWebhook先（これがGASでデプロイ時に発行されるURL）にPOST**され、GASで情報を**受け取る**ことが可能になります。

https://developers.line.biz/ja/reference/messaging-api/#webhook-event-objects

WebhookによりGASが**受け取る情報:イベントオブジェクト**の中には、以下のような情報が含まれています。

```json:イベントオブジェクトの中身抜粋
{
  "destination": "xxxxxxxxxx",
  "events": [
    {
      "type": "message",
      "message": {
        "type": "text",
        "id": "14353798921116",
        "text": "Hello, world"
      },
      "source": {
        "type": "user",
        "userId": "U80696558e1aa831..."
      },
      "replyToken": "757913772c4646b784d4b7ce46d12671",
    }
  ]
}
```
この中で、今回使用するのは、`events->messege->type`、`events->messege->text`、`events->replyToken`の3つです。

#### ②GASからユーザに対してメッセージを送信する
これにはLINEの**応答メッセージ**を使います。応答メッセージはその名の通りですが、ユーザからのメッセージに対して返信する際に使用します。

https://developers.line.biz/ja/docs/messaging-api/sending-messages/#reply-messages

```bat:curlによる呼び出し
curl -v -X POST https://api.line.me/v2/bot/message/reply \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-d '{
    "replyToken":"nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
    "messages":[
        {
            "type":"text",
            "text":"Hello, user"
        },
        {
            "type":"text",
            "text":"May I help you?"
        }
    ]
}'
```

これを見ると、以下のことがわかります。
| 項目 | 値 |
|:--|:--|
| Fetch先のURL | https://api.line.me/v2/bot/message/reply |
| method種別 | POST |
| データ種別 | application/json |
| 認証 | Bearer {channel access token}|
| データ本体 | {<br/>&nbsp;&nbsp;"replyToken":"nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",<br/>&nbsp;&nbsp;"messages":[<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"type":"text",<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"text":"Hello, user"<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;]<br/>}|

:::note info
`"replyToken":"nHuyWiB7yP5Zw52FIkcQobQuGDXCTA"`の箇所はサンプルで記載されているものであり、実際は**LINEから受信したイベントデータ内に入っているevents->.replyToken**を使います。
:::

### STEP.2-2　ではこの仕様を踏まえてGASで実装する

```javascript:LINE Messaging APIのreplayメソッド部
const REPLY_URL     = 'https://api.line.me/v2/bot/message/reply';
const LINEAPI_TOKEN = '**STEP.1のNo.17で取得したチャネルアクセストークンを記載する**';

/**
 * LINEのトークでメッセージが送信された際に起動するメソッド
 * @param {EventObject} e - イベントオブジェクト
 */
function doPost(e){
  // イベントデータはJSON形式となっているため、parseして取得
  const eventData = JSON.parse(e.postData.contents).events[0]
        , repToken = eventData.replyToken;
  replyTxt(repToken, `LINEへの返信確認`);
}

/**
 * LINEのトークにメッセージを返却するメソッド
 * @param {String} token - メッセージ返却用のtoken
 * @param {String} text - 返却テキスト
 */
function replyTxt(token, txt){
  const message = {
                    'replyToken' : token,
                    'messages' : [{
                      'type': 'text',
                      'text': txt
                    }]
                  }
        , options = {
                    'method' : 'post',
                    'headers' : {
                      'Content-Type': 'application/json; charset=UTF-8',
                      'Authorization': 'Bearer ' + LINEAPI_TOKEN,
                    },
                    'payload' : JSON.stringify(message)
                  };
  UrlFetchApp.fetch(REPLY_URL, options);
}
```
いかがでしょうか。LINEのAPI仕様をもとにGASで表現しました。
* doPostでイベントオブジェクトを受信し、応答メッセージに必要な`replyToken`を取得
* replyTokenを用いて、`https://api.line.me/v2/bot/message/reply`にFetch

これでGAS側のプログラムはできました。次に**LINE Messaging APIでWebhook登録**するために、作成したプログラムをデプロイします。

:::note info
doPostはGAS上で**POSTリクエストを受け取るための特殊な関数**であるため**メソッド名称固定**になります。
お気づきの通り、doPostに対して**doGet**ももちろんありますが、これは**GASでWebアプリケーションを作ろう編**の際に詳しくお伝えします。
:::

### STEP.2-3　GASをデプロイ
GASでdoPostを記述したとしても**デプロイしたURLが払い出されないと誰もGASに対してPOSTリクエストを送ることができません**。そのため、先ほど記載したプログラムをデプロイしましょう。

<table>
  <tr>
    <th>№</td>
    <th>手順</td>
    <th>イメージ</td>
  </tr>
  <tr>
    <td>1</td>
    <td>
    GASエディタから「デプロイ　▼」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/37aff08a-4b03-b434-2081-5829d82523ea.png" width="500"></td>
  </tr>
  <tr>
    <td>2</td>
    <td>
    「新しいデプロイ」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/96ab5e5f-781b-26ef-0543-b5942a8100fc.png" width="150"></td>
  </tr>
  <tr>
    <td>3</td>
    <td>
    デプロイ管理ダイアログが表示されるため、やや左上の歯車をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/083dc1d7-f1a1-81a1-113d-c5f374105255.png" width="300"></td>
  </tr>
  <tr>
    <td>4</td>
    <td>
    「ウェブアプリ」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/de86e389-02c1-b161-16a9-ababb5f60937.png" width="300"></td>
  </tr>
  <tr>
    <td>5</td>
    <td>
      <ul>
        <li>[新しい説明文]：適当に記載</li>
        <li>[次のユーザとして実行]：自分</li>
        <li>[アクセスできるユーザ]：全員</li>
      </ul>
      と設定し「デプロイ」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/3cc3c2de-83de-dda0-8a44-d2e68d813add.png" width="300"></td>
  </tr>
  <tr>
    <td>6</td>
    <td>「アクセスを承認」をクリックします。<br/>※このあと、GASからGmail送信やスプレッドシートにアクセスする際にも出た権限設定が表示されます。ここでは割愛しますが、ご不明な点は<a href="https://qiita.com/gas-suke/items/ee7dd986259837efb33e#google%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E7%B7%A8" target="_blank">こちら</a>を確認してください。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/0e4b5614-8653-65bb-3a77-bf9b02fad0cb.png" width="300"></td>
  </tr>
  <tr>
    <td>7</td>
    <td>デプロイが完了したら、[ウェブアプリ]欄に記載のURLをコピーします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/646e7fa2-4dcb-5a1a-7cb8-26844a7320bb.png" width="300"></td>
  </tr>
</table>

## STEP.3　LINE Messaging APIとGASをつなぐ「Webhook設定」
ここからは再びLINE Developer側の設定です。
<table>
  <tr>
    <th>№</td>
    <th>手順</td>
    <th>イメージ</td>
  </tr>
  <tr>
    <td>1</td>
    <td>
    [Webhook設定]欄の「編集」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/a7407f15-3cf7-dd0b-b44a-fc42d2d2e719.png" width="500"></td>
  </tr>
  <tr>
    <td>2</td>
    <td>
    [Webhook URL]にSTEP.2-3 No.7で取得したURLを設定し「更新」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/55df662c-d444-bc75-15f5-cb950749a6da.png" width="500"></td>
  </tr>
  <tr>
    <td>3</td>
    <td>
    GASでデプロイしたURLが機能するかどうかを検証のため「検証」をクリックします。<br/>※URLに誤りがなければ成功ダイアログが表示されます。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/a4db563e-4ae3-291b-b629-46e2657b217b.png" width="500"><br/><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/c31247d9-9464-40c3-7b55-f6fa4ce7c69e.png" width="200"></td>
  </tr>
  <tr>
    <td>4</td>
    <td>
    [Webhookの利用]欄の「ラジオボタン」をクリックして活性状態にします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/3a81dc65-5a0b-1f19-94ab-06405f79a594.png" width="500"></td>
  </tr>
  <tr>
    <td>5</td>
    <td>
    ページ下段の[応答メッセージ]欄の「編集」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/360d3bb3-109a-082c-bdb1-da3c475a4667.png" width="300"></td>
  </tr>
  <tr>
    <td>6</td>
    <td>LINE Official Account Managerで[応答メッセージ]欄および[応答時間]欄のラジオボタンをクリックして非活性状態にします。</td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/63d4f022-6ced-8c2d-43ec-3b843585b577.png" width="500"></td>
  </tr>
</table>

### お待たせしました【確認】
**STEP.2-2**から**2-3**、および**STEP.3**を行うことで、
1. ユーザからメッセージが送信された場合にGASでその**情報を受け取る**
1. GASからユーザに対して**メッセージを送信する**

が実現できるようになりました。それでは、改めて**STEP1のNo.16で友だちになったLINEアカウント**に文字を送信してください。以下のように返ってくるはずです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/3c326ea9-757d-b915-c55f-012e31ff24c8.jpeg" width="400">

この「**LINEへの返信確認**」はまさに
```javascript
function doPost(e){
  // イベントデータはJSON形式となっているため、parseして取得
  const eventData = JSON.parse(e.postData.contents).events[0]
        , repToken = eventData.replyToken;
  replyTxt(repToken, `LINEへの返信確認`);
}
```
ここで設定した値ですね。

:::note warn
もし思った通りの返信が来ない場合は、**STEP.2-2**から**2-3**、および**STEP.3**をもう一度見返して**異なる箇所がないか**を確認してください。
:::

## STEP.4　Gemini Pro APIの返答をLINE Messaging APIに返却
ここからはもうだいぶ簡単です。<a href="https://qiita.com/gas-suke/items/3ce261be244f9efd54b2" target="_blank">前回</a>の記事でお伝えした**Gemini Pro APIの呼び出しを組み合わせ**れば完成です。
要は、以下の`replyTxt`で返却している「**LINEへの返信確認**」を固定文字列ではなく、**Geminiからの返却値**にすればいいだけです。
```javascript
function doPost(e){
  // イベントデータはJSON形式となっているため、parseして取得
  const eventData = JSON.parse(e.postData.contents).events[0]
        , repToken = eventData.replyToken;
  replyTxt(repToken, `LINEへの返信確認`);
}
```
それではやってみましょう。
```javascript:Qiita015
const GEMINI_API      = '**前回記事のSTEP.1のNo.5で取得したAPI keyを記載する**'
      , REPLY_URL     = 'https://api.line.me/v2/bot/message/reply'
      , LINEAPI_TOKEN = '**STEP.1のNo.17で取得したチャネルアクセストークンを記載する**';

/**
 * LINEのトークでメッセージが送信された際に起動するメソッド
 * @param {EventObject} e - イベントオブジェクト
 */
function doPost(e){
  // イベントデータはJSON形式となっているため、parseして取得
  const eventData = JSON.parse(e.postData.contents).events[0]
        , repToken = eventData.replyToken
        , msgType = eventData.message.type;
  // テキストメッセージのときのみ
  if (msgType=='text') {
    let uText = eventData.message.text
        , gemini = getGeminiProAnswerTxt(uText);
    replyTxt(repToken, gemini);
  }
}

/**
 * LINEのトークに送信されたメッセージをGemini Pro APIに渡して回答を得るメソッド
 * @param {String} txt - 送信されたメッセージ
 */
function getGeminiProAnswerTxt(txt) {
  const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=${GEMINI_API}`
        , payload = {
            'contents': [
              {
                'parts': [{
                  'text': txt
                }]
              }
            ]
          }
        , options = {
            'method': 'post',
            'contentType': 'application/json',
            'payload': JSON.stringify(payload)
          };

  const res = UrlFetchApp.fetch(url, options)
        , resJson = JSON.parse(res.getContentText());

  if (resJson && resJson.candidates && resJson.candidates.length > 0) {
    return resJson.candidates[0].content.parts[0].text;
  } else {
    return '回答を取得できませんでした。';
  }
}

/**
 * LINEのトークにメッセージを返却するメソッド
 * @param {String} token - メッセージ返却用のtoken
 * @param {String} text - 返却テキスト
 */
function replyTxt(token, txt){
  const message = {
                    'replyToken' : token,
                    'messages' : [{
                      'type': 'text',
                      'text': txt
                    }]
                  }
        , options = {
                    'method' : 'post',
                    'headers' : {
                      'Content-Type': 'application/json; charset=UTF-8',
                      'Authorization': 'Bearer ' + LINEAPI_TOKEN,
                    },
                    'payload' : JSON.stringify(message)
                  };
  UrlFetchApp.fetch(REPLY_URL, options);
}
```

::: note info
ここでのポイントは以下の2つです。
1. LINEからのメッセージ送信が**テキストのときのみ**、その入力テキストをGeminiに送る
   ```javascript
   msgType = eventData.message.type;
   uText = eventData.message.text;
   // これもWebhookのイベントオブジェクトに記載の通りに取得しています。
   ```
2. Geminiは**入力されたテキストをパラメタに設定**したうえでFetchし、返却値をLINEへ返す

メッセージタイプがテキスト以外（**画像や位置情報**）の場合はGeminiの**入力パラメタを作成できない**ためこのようにしています。
※ただし、画像の場合は**Gemini Pro Vision**もあるため、あくまでも**今回は**という前提です。
:::

### デプロイの更新
プログラムの修正が終わったら、再デプロイしましょう。

:::note warn
デプロイ方法を誤るとデプロイされた**URLが変わってしまう**ので、必ず以下の手順に従ってください。
※URLが変わると**LINE Developer側の設定も変更**しなければなりません。
:::

<table>
  <tr>
    <th>№</td>
    <th>手順</td>
    <th>イメージ</td>
  </tr>
  <tr>
    <td>1</td>
    <td>
    「デプロイを管理」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/bf12d43e-2b4d-cadf-e4ec-ca3f81b111d1.png" width="150"></td>
  </tr>
  <tr>
    <td>2</td>
    <td>
    デプロイ管理ダイアログが表示されるため、やや右上の鉛筆マークをクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/ef8719f5-29df-dcaf-61a8-53cd35578718.png" width="300"></td>
  </tr>
  <tr>
    <td>3</td>
    <td>
    [バージョン]に新バージョンを選択し「デプロイ」をクリックします。
    </td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/d43fcbfe-2aa4-ab6c-c9e6-4e124ea4085a.png" width="300"></td>
  </tr>
</table>

### 確認
…は、ぜひお手持ちのスマホで実施してみてください。お楽しみに！

# おわりに
お疲れ様でした。
第15回は「GAS × Gemini Pro API × LINE Messaging API によるあなただけの相談Botを作成する」ということで、**LINE Messaging APIを利用するための準備**から、**GASとLINEをつなぐための手順**、さらにそこに**Gemini Proを組み合わせる**とかなり盛りだくさんにやってきました。**GASはなんでもできる！** と述べていたのがかなり実感してきたのでは！？引き続き、GASを楽しんでいきましょう！！
記事を読んで、「良いな」や「今後に期待できる！」と感じて頂けたら**いいね**や**フォロー**、**コメント**いただけると幸いです。それではまた次回をお楽しみに！

## ブログでより詳しく解説しています！
以下画像をクリックしてブログにアクセス！！
<a href="https://gas-4u.com/gas14/" target="_blank"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/18495a8d-2512-b793-a678-86add4cc6d28.png" width="600"/></a>

# 実はまだこれでおわりではない。
今回の相談Botのままでは、**会話の継続**が実現できていません。例えば、
* 東京の魅力を教えて？

とBotに聞くと、Geminiはすごい量の情報を教えてくれます。そこで、続けて
* すごいね、じゃあそれを200字程度で要約して？

とBotに聞くと、会話の継続ができていないため、東京の魅力を要約することはなく、**まったく別の回答**が返ってきます。

さぁこれをどうするか。**次回を乞うご期待！！！！**