前提
GAS、Messaging API共に初心者です。ぜひお力添えいただければ幸いです。
LINEのMessaging APIとGASを連携させた、家計簿のようなシステムを作っています。(個人利用レベル)
実現したいこと
- LINEで購入額やカテゴリーを送信する
- 送信データがスプレッドシートへ反映される
- 残り使用できる金額等をスプレッドシートの関数で計算の上、応答用botで自動返信する
つまずいているポイント
①LINEで送ったメッセージのタイムスタンプをスプシへ反映
→ソースコード上の48〜50行目で実現させたいができず。
②LINEで送ったメッセージのデータを集計し、その結果をLINEで応答
→ソースコード上の54〜56行目で実現させたいができず。
③コーディング初心者のため、コードの正確性が分からない
発生している問題・エラーメッセージ
TypeError: Cannot read property 'postData' of undefined at doPost(lineBotApp:9:35)
ReferenceError: userMessage is not defined (匿名) @ lineBotAppTest.gs:16
該当のソースコード
// LINE developersのメッセージ送受信設定に記載のアクセストークン(Messaging API設定の一番下のアクセストークン) const LINE_TOKEN = '該当のトークン'; const LINE_URL = 'https://api.line.me/v2/bot/message/reply'; //postリクエストを受取ったときに発火する関数 function doPostTest(e) { // 応答用Tokenを取得 const replyToken = JSON.parse(e.postData.contents).events[0].replyToken; // メッセージを取得 const userMessage = JSON.parse(e.postData.contents).events[0].message.text; } //メッセージを改行ごとに分割 const all_msg = userMessage.split("\n"); const msg_num = all_msg.length; // *************************** // スプレットシートからデータを抽出 // *************************** // 1. 今開いている(紐付いている)スプレッドシートを定義 const sheet = SpreadsheetApp.getActiveSpreadsheet(); // 2. ここでは、デフォルトの「シート1」の名前が書かれているシートを呼び出し const listSheet = sheet.getSheetByName("シート1"); // 3. 最終列の列番号を取得 const numColumn = listSheet.getLastColumn(); // 4. 最終行の行番号を取得 const numRow = listSheet.getLastRow()-1; // 5. 範囲を指定(上、左、右、下) const topRange = listSheet.getRange(1, 1, 1, numColumn); // 一番上のオレンジ色の部分の範囲を指定 const dataRange = listSheet.getRange(2, 1, numRow, numColumn); // データの部分の範囲を指定 // 6. 値を取得 const topData = topRange.getValues(); // 一番上のオレンジ色の部分の範囲の値を取得 const data = dataRange.getValues(); // データの部分の範囲の値を取得 const dataNum = data.length +2; // 新しくデータを入れたいセルの列の番号を取得 // 7. 日付データを取得 const Day = new Date(); const Year = Day.getFullYear(); const Month = Day.getMonth()+1; // *************************** // スプレッドシートにデータを入力 // *************************** // 最終列の番号まで順番にスプレッドシートの左からデータを新しく入力し、さらに5〜7行目に日付データを入力 for (let i = 0; i < msg_num; i++) { sheet.getRange(dataNum, i+1).setValue(all_msg[i]); sheet.getRange(numRow+1,5).setValue(Day); sheet.getRange(numRow+1,6).setValue(Year); sheet.getRange(numRow+1,7).setValue(Month); } // 自動返信を送信する var autoReplySheet = sheet.getSheetByName("ReplyText"); var wordList = autoReplySheet.getRange(1,2).getValues(); messages.push(wordList); //lineで返答する UrlFetchApp.fetch(LINE_URL, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': `Bearer ${LINE_TOKEN}`, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': replyToken, 'messages': messages, }), }); ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
スプシ画像
補足情報
応答用Botでは、以下のようなメッセージを自動送信させたいです。
="【今月の残高】 ・食費 :"&sum!J4&"円 ("&TEXT(sum!K4,"0%")&") ・外食費:"&sum!J5&"円 ("&TEXT(sum!K5,"0%")&") ・雑費 :"&sum!J6&"円 ("&TEXT(sum!K6,"0%")&") ・娯楽 :"&sum!J7&"円 ("&TEXT(sum!K7,"0%")&")"

回答1件
あなたの回答
tips
プレビュー