質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

2434閲覧

GASで別の関数に変数を引き継ぎ、それを使ってメッセージを応答したい

umaretate_sika

総合スコア1

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2021/08/03 10:03

編集2021/08/03 11:28

前提・実現したいこと

プログラミング初心者です。
先日、ヤフーの運行情報を使用したLINEBOTを作りました。
その際、平日の6:00-7:00の間にメッセージを自動送信できるようにトリガーを設定しました。
今回はその機能に加えて、特定の単語を入力すると遅延情報が返信されるようにしたいです。
下記のコードは自作のものにWEBで見つけたものを加えています。

発生している問題・エラーメッセージ

var reply = null; if(userMessage === '遅延情報'){ reply = replyData; }else{ reply ='返信できません'; }

にて、他の単語には「返信できません」と表示されるものの、reply = replyData;が実行されない。
"replyData"だとそのままreplyDataと出力される。

該当のソースコード

//アクセストークン var ACCESS_TOKEN = ****; function main() { //Yahoo路線情報のURLを設定 var yahoo_url = "https://transit.yahoo.co.jp/traininfo/area/4/"; //情報取得 var contents = UrlFetchApp.fetch(yahoo_url).getContentText(); //更新時刻が読み取れるように設定 var myRegexp = /<span class="subText">([\s\S]*?)</i;  //null以外ならtimeに、nullなら""にする var time = (myRegexp.exec(contents)!= null)?myRegexp.exec(contents):["",""];  //路線が読み取れるように設定 var myRegexp = /<div class="elmTblLstLine trouble">([\s\S]*?)#mdStatusTroubleLine/i;  //ざっくり抽出 var regexp = myRegexp.exec(contents); //成功した場合 if(regexp != null){ var result = []; var regexp2 = [];   //路線情報が読み取れるよう設定 var myRegexp2 = /">([\s\S]*?)</g;   //regexp2に路線情報を入れる while((regexp2 = myRegexp2.exec(regexp[1])) != null){     //遅延情報がある場合、情報取得後データを配列に追加 if(regexp2[1] != "[!]"){      result.push(regexp2[1]); } } }  //配列にデータがある場合、件数カウント、表示用に切り替え if(result != null){ var counts = result.length/ 2; var postdate = ""; for(i = 0;i<counts ;i++){ postdate += result[i*2] + ":" + result[i*2+1] + "\n"; } }else{ //無かった場合 var postdate = "現在、事故・遅延に関する情報はありません"; }   //送信するメッセージの設定 var message = { "to": "Uc36ca6a021cb29db02fb32a5fabc048a", "messages": [ { "type": "text", "text": "Yahoo路線情報" + "\n" + postdate + "\n" + time[1] + "\n" + "https://transit.yahoo.co.jp/traininfo/area/4/" } ] }; // 送信のための諸準備 const replyData = { "method": "post", "headers": { "Content-Type": "application/json", "Authorization": "Bearer " + ACCESS_TOKEN }, "payload":JSON.stringify(message) }; UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push",replyData);  doPost(replyData); } //単語に反応して返す function doPost(e,replyData){ var replyToken = JSON.parse(e.postData.contents).events[0].replyToken; var userMessage = JSON.parse(e.postData.contents).events[0].message.text; var url2 = 'https://api.line.me/v2/bot/message/reply'; var headers = { 'Content-Type': 'application/json; charset=UTF-8' , 'Authorization': 'Bearer ' +ACCESS_TOKEN }; var reply = null; if(userMessage === '遅延情報'){ reply = replyData; }else{ reply ='返信できません'; } var payload = JSON.stringify({ //メッセージ送信内容 'replyToken': replyToken , 'messages': [{ 'type': 'text' , 'text': reply }] } ) var options = { 'headers' : headers , 'method' : 'post' , 'payload' : payload }; // メッセージを応答 UrlFetchApp.fetch(url2 ,options) }

試したこと

・replyDataを"replyData"にする⇒replyDataと出力される。
https://vba-gas.info/gas-function-function
を基に作成、修正(doPost(replyData); を追加)⇒変化なし

補足情報(FW/ツールのバージョンなど)

GAS(java script)を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

スプレッドシートを利用して、新たな関数でスプレッドシートに記載できるようにし、その関数を呼び出すことで解決。数分のラグがあり、今後訂正予定。
以下、変更部分。

function koushin(){ //Yahoo路線情報のURLを設定 var yahoo_url = "https://transit.yahoo.co.jp/traininfo/area/4/"; //情報取得 var contents = UrlFetchApp.fetch(yahoo_url).getContentText(); //更新時刻が読み取れるように設定 var myRegexp = /<span class="subText">([\s\S]*?)</i;  //null以外ならtimeに、nullなら""にする var time = (myRegexp.exec(contents)!= null)?myRegexp.exec(contents):["",""];  //路線が読み取れるように設定 var myRegexp = /<div class="elmTblLstLine trouble">([\s\S]*?)#mdStatusTroubleLine/i;  //ざっくり抽出 var regexp = myRegexp.exec(contents); //成功した場合 if(regexp != null){ var result = []; var regexp2 = [];   //路線情報が読み取れるよう設定 var myRegexp2 = /">([\s\S]*?)</g;   //regexp2に路線情報を入れる while((regexp2 = myRegexp2.exec(regexp[1])) != null){     //遅延情報がある場合、情報取得後データを配列に追加 if(regexp2[1] != "[!]"){      result.push(regexp2[1]); } } }  //配列にデータがある場合、件数カウント、表示用に切り替え if(result != null){ var counts = result.length/ 2; var postdate = ""; for(i = 0;i<counts ;i++){ postdate += result[i*2] + ":" + result[i*2+1] + "\n"; } }else{ //無かった場合 var postdate = "現在、事故・遅延に関する情報はありません"; } //スプレッドシートのデータを取得 SpreadsheetApp.getActiveSheet().getRange('A2').setValue(postdate); SpreadsheetApp.getActiveSheet().getRange('A3').setValue(time[1]); } //単語に反応して返す function doPost(e){ koushin(); var replyToken = JSON.parse(e.postData.contents).events[0].replyToken; var userMessage = JSON.parse(e.postData.contents).events[0].message.text; var url2 = 'https://api.line.me/v2/bot/message/reply'; var headers = { 'Content-Type': 'application/json; charset=UTF-8' , 'Authorization': 'Bearer ' + ACCESS_TOKEN }; const values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); //書き出し、本文、締めを連結 let body = ''; body += values[0][0] + "\n"; body += values[1][0] + "\n"; body += values[2][0] + "\n"; body += values[3][0] ; var reply = null; if(userMessage === '遅延情報'){ reply = body; } var payload = JSON.stringify({ //メッセージ送信内容 'replyToken': replyToken , 'messages': [{ 'type': 'text' , 'text': reply }] } ) var options = { 'headers' : headers , 'method' : 'post' , 'payload' : payload }; // メッセージを応答 UrlFetchApp.fetch(url2 ,options) }

投稿2021/08/03 13:02

編集2021/08/04 01:32
umaretate_sika

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問