LINEから書籍リストを作りたい　②Googleフォーム・スプレッドシート連携まで

お疲れさまです、みやもとです。

今日は昨日の続きです。

# 書籍リストを作ろう
昨日は書籍情報の読み取りまで確認したので、いよいよリストにしていきます。

## Googleフォームの準備
まずは新規フォームを作成します。
私はこんな感じで作りました。

| 項目名 | 入力タイプ | 必須 |
|:-:|:-:|:-:|
| タイトル | 記述式(短文) | 〇 |
| 著者 | 記述式(短文) | 〇 |
| ジャンル | プルダウン |   |
| 状況 | プルダウン |   |

上2つはせっかく読み取った項目なので必須としています。
「ジャンル」は一応の分類で、「小説」「技術書」「エッセイ」「マンガ」「キャリア」「その他」ぐらいに分けました。
読書の嗜好によって変えれば良いと思います。
「状況」は大掃除に使いたいので読まない本の整理のために作りました。
「よく読む」「たまに読む」「あまり読まない」「処分した」になっているのは、「前読んだことある気がする…」という本を見つけた際にリストで確認して、すでに買ったことがある上で捨てた本だったら諦めをつけるためです。

項目ができたら「回答」タブで「スプレッドシートで表示」を選択。
新規に回答用のスプレッドシートを作ればこれが書籍リストになります。

## Google Apps Scriptの修正
フォームができたのでコードを修正しましょう。
今日は先にスクリプトプロパティを追加します。

| プロパティ名 | 設定値 |
|:-:|:-:|
| FORM_ID | 作成したフォームのID |

フォームIDは回答者用URLでいえば「docs.google.com/forms/d/e/〇〇/viewform～」の「○○」部分です。

では次にコード。
今日は昨日からの差分だけ書いていきます。
まず定数部分。
```diff_javascript:コード.gs
const prop = PropertiesService.getScriptProperties().getProperties();

const LINEAPI_TOKEN = prop.LINEAPI_TOKEN;
const DIFY_API_KEY = prop.DIFY_API_KEY;
+ const FORM_ID = prop.FORM_ID
```

次にdoPost内。ここはかなり長いので省略します。

```diff_javascript:コード.gs
    if (event.message && msgType === 'image') {
      let messageId = event.message.id;
      Logger.log('画像メッセージ受信: messageId=%s', messageId);
      let imageBlob = getImageFromLINE(messageId);
      Logger.log('画像取得成功。サイズ: %d bytes', imageBlob.getBytes().length);

      let base64Image = Utilities.base64Encode(imageBlob.getBytes());
      Logger.log('画像をbase64エンコード完了: length=%d', base64Image.length);

      let { title, author } = analyzeBookCover(base64Image);
      Logger.log('解析結果: title=%s, author=%s', title, author);
+
+     let formUrl = generateFormUrl(title, author);
+     Logger.log('フォームURL生成: %s', formUrl);
      
-     replyMessage(replyToken, `書籍情報:\nタイトル: ${title}\n著者: ${author}`);
+     replyMessage(replyToken, `書籍情報:\nタイトル: ${title}\n著者: ${author}\nこちらのフォームをご記入ください:\n${formUrl}`);
      Logger.log('返信完了');
```
フォームURL生成のメソッド呼び出しを追加して、返信メッセージにフォームURLをつけました。
では最後にフォームURLのメソッドを。

```diff_javascript:コード.gs
/**
 * GoogleフォームURL生成
 * @param {String} title - 本のタイトル
 * @param {String} author - 著者
 */
// GoogleフォームURL生成
function generateFormUrl(title, author) {
  Logger.log('generateFormUrl start');
  const baseUrl = 'https://docs.google.com/forms/d/e/' + FORM_ID + '/viewform?usp=pp_url';
  const url = `${baseUrl}&entry.<<項目ID>>=${encodeURIComponent(title)}&entry.<<項目ID>>=${encodeURIComponent(author)}`;
  Logger.log('generateFormUrl end: url=%s', url);
  return url;
}
```
<<項目ID>>となっているところはそれぞれ作成したフォームによって異なるので変更が必要です。
調べ方はこちらを参考にしました。

https://note.com/eguweb/n/n21893b89a7dc

# 動作確認
デプロイしたらこれも試してみましょう。

昨日の記事で使った本の画像をそのまま送ります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477580/a796ba39-4c91-a99d-62e7-561b91bde933.png" width="70%">

ちゃんとフォームリンクが返ってきました。
開くとタイトルと著者が設定されています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477580/5a8763cf-a5b9-7e74-6217-2ca5ca64591e.png" width="70%">

ジャンルと状況を指定して送信。
スプレッドシートへの転記も確認できました！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477580/f40ad1a2-56fb-d25d-a46d-df5d23c908e8.png" width="70%">

あとは大掃除頑張るだけですね。
回収業者さんのお休み突入前に終わるようにしたいところです。