5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GASでLINEbot「食品栄養検索」

Last updated at Posted at 2022-06-05

はじめに

  • なかやまきんに君さんに触発されて食生活等を見直した。
  • 結果、栄養について気になり、気軽に調べられるアプリを作ることにした。

環境

  • Mac ver.11.6.6
  • Google Apps Script
  • Google スプレッドシート
  • LINE Developers

問題点

  • 栄養データのAPI接続ができなかった。
  • 参考になる記事等があまり見つからなかった。

解説

  • 【ライン】(Line Bot API) ⇄ Google Apps Script ↩️ Spread Sheet

  • データについて
    https://www.mext.go.jp/a_menu/syokuhinseibun/mext_01110.html
    【文部科学省】「日本食品標準成分表2020年版(八訂)全体版」
    こちらからデータをスプレッドシートに落として整形いたしました。

注意点

  • LINE_ACCESS_TOKENとsheetIdはスクリプトプロパティにて設定する。
    ※情報漏洩防止のため
    【GAS】(プロジェクトの設定→「スクリプト プロパティを編集」→「プロパティ」「値」を入力)

コード

/**
* LINEから送信されたテキストを元に食品シートから検索して、結果の栄養情報を返すLINE BOT
* LINE API 送信マニュアル : https://developers.line.biz/ja/docs/messaging-api/sending-messages/#methods-of-sending-message
*/

/* Rest API(Post) */
function doPost(e) {
  // LINE APIのアクセストークンを取得。
  const lineToken = PropertiesService.getScriptProperties().getProperty("LINE_ACCESS_TOKEN")
  if (lineToken === null) throw new Error('スクリプトプロパティにLINE_ACCESS_TOKENを設定してください。')

  // LINE API POST MESSAGE URL
  const lineUrl = 'https://api.line.me/v2/bot/message/reply';

  // JSONをパースする WebHookで受信した応答用Token
  const replyToken = JSON.parse(e.postData.contents).events[0].replyToken

  if (typeof replyToken === 'undefined') {
    return;
  }

  // ユーザーのメッセージを取得
  const userMessage = JSON.parse(e.postData.contents).events[0].message.text;

  // LINEメッセージで食品シートから栄養成分を取得。取得結果を返信メッセージへ整形。
  const notifyMessages = searchSheetValue(userMessage)

  // LINEのAPIへ任意の情報でPOSTリクエスト
  UrlFetchApp.fetch(lineUrl, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + lineToken,
    },

    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': [
        {
          "type": "text",
          "text": notifyMessages
        }
      ],
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({ 'content': 'post ok' })).setMimeType(ContentService.MimeType.JSON);
}

/**
* 指定の用語でシートの中身を検索
* @param search 検索用語
* @returns 検索結果
*/

function searchSheetValue(search) {
  // 取得対象シートID(URLのeditの前)
  const sheetId = PropertiesService.getScriptProperties().getProperty("SHEET_ID")
  if (sheetId === null) throw new Error('スクリプトプロパティにSHEET_IDを設定してください。')

  // IDをキーにスプレッドシート情報を取得
  const spread = SpreadsheetApp.openById(sheetId)

  // アクティブシートのシートの中身を二次元配列で取得
  const values = spread.getDataRange().getValues()

  // 検索正規表現作成
  const regex = new RegExp(search)

  // 食材で取得
  const result = values.filter(value => regex.test(value[1]))

  // 結果出力
  const notifyMsg = `食材名 : ${result[0][1]}
エネルギー : ${result[0][2]}
タンパク質 : ${result[0][3]}
炭水化物 : ${result[0][7]}
脂質 : ${result[0][5]}
`
  return notifyMsg
}
5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?