はじめに
- なかやまきんに君さんに触発されて食生活等を見直した。
- 結果、栄養について気になり、気軽に調べられるアプリを作ることにした。
環境
- 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
}