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

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

新規登録して質問してみよう
ただいま回答率
85.35%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Q&A

0回答

511閲覧

LINE BOTの応答がこない

DK7553

総合スコア0

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

0グッド

0クリップ

投稿2020/11/27 02:42

前提・実現したいこと

プログラミング超初心者です。
やりたいことはLINEで送信した文字列をスプレッドシートのデータを検索して別セルの文字列を返すというもので、コードはGASで見よう見真似で作ってみました。

最初に作ったものは正常に動いてまして、それをベースに別データの同様なものを新しく作りたいと思いまして、LINEの新しいチャネルを作成し、スプレッドシートをコピペしてからコードを編集(修正)していこうと単純にコピペした状態でテストしてみましたが返答が帰ってきません。

「Webhook設定」などのLINE側の設定や「ウェブアプリケーションとして導入」で「NEW」「Anyone,even anonymous」も間違いなく設定しました。

スプレッドシートでの検索処理は作成は正常にできているのですが、そのデータがリプライできない状況です。

できていたものをコピーして、同じ設定のプロセスを行ってもできない理由がわかりません。

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

エラーメッセージは見当たりません

該当のソースコード

var CHANNEL_ACCESS_TOKEN = "LINE側のトークン"; var line_endpoint = "https://api.line.me/v2/bot/message/reply"; //SpreadSheetの取得 var SS = SpreadsheetApp.openByUrl("SpreadsheetのURL"); //SpreadsheetのURL var sheet = SS.getSheetByName("リスト"); //Spreadsheetのシート名(タブ名) var lastrow = sheet.getLastRow(); var lastcol = sheet.getLastColumn(); var sheetdata = sheet.getSheetValues(1, 1, lastrow, lastcol); // シード削除("temp"); var delsheet = SS.getSheetByName("temp"); if (delsheet != null) { SS.deleteSheet(delsheet); } //POSTデータ取得、JSONをパースする function doPost(e) { var json = JSON.parse(e.postData.contents); //返信するためのトークン取得 var reply_token= json.events[0].replyToken; if (typeof reply_token === 'undefined') { return; } //送られたLINEメッセージを取得 var user_message = json.events[0].message.text; var array = 0 ; var flag = 0; var k = 0; var add = 0; var str = 0; //文字列分解 var searchchar = user_message.replace('の住所教えて',''); //文字列照合+合致データを配列化(書き出し) for(i=0;i<=lastrow-1;i++){ if(i == 0){ SS.insertSheet('temp'); var tempsheet = SS.getSheetByName("temp"); } if(sheetdata[i][0].match(searchchar)){  k++; // var array = sheetdata[i]; tempsheet.appendRow(array); } } if(array == 0){ var str = '該当なしです。カタカナの全半角、旧漢字の確認をして再度入力ください。' ; tempsheet.getRange(1, 1).setValue(str); } //件数追加 if(array != 0 ){ tempsheet.insertColumnBefore(1); for(j=1;j<=k;j++){ var add = j+'件目'; tempsheet.getRange(j,1).setValue(add); } } //出力 var templastrow = tempsheet.getLastRow(); var templastcol = tempsheet.getLastColumn(); var outdata = tempsheet.getSheetValues(1, 1, templastrow, templastcol); var outdata = outdata.toString(); var outdata = outdata.replace(/,/g, '\n'); console.log(outdata); //返信する内容を作成 if(array == 0){   var reply_messages; reply_messages = [outdata]; }else{   var reply_messages; reply_messages = ["該当件数は" +templastrow +"件です。\n\n" + outdata]; } // メッセージを返信 var messages = reply_messages.map(function (v) { return {'type': 'text', 'text': v}; }); UrlFetchApp.fetch(line_endpoint, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': reply_token, 'messages': messages, }), }); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); }

試したこと

・Webhook設定(ウェブアプリケーションとして導入のURLをコピペし、確認テストは「OK」でした、使用するにチェック入ってます)
・検索結果は当該スプレッドシートの「temp」という名前のシートに記述までは成功してます。

大変恐縮ですが、ご指南頂けますとありがたいです。

以上よろしくお願いします。

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

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

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

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

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

draq

2020/12/09 17:01

どこまで動作確認でききているのでしょうか?例えば、 console.log(outdata); は、想定したデータが出力されているのか? UrlFetchApp.fetch のリターンから HTTP のステータスコードは 200 が返っていることが確認できているのか? 200 以外ならエラーメッセージの内容はどうか?
DK7553

2020/12/22 05:22

ありがとうござます。 Apps Script ダッシュボードでログ(プロジェクトの実行数)を確認したところconsole.log(outdata);のログはなく、outdataをシートに書き出したら想定した文字列は出力されてました。 HTTP のステータスコードは 200 が返っていることの確認は、お恥ずかしい話ですがどこをみれば確認できるのでしょうか?
draq

2020/12/22 05:39

HTTP のステータスコードは 200 が返っていることの確認方法です。 const res = UrlFetchApp.fetch(~); console.log(res.getResponseCode()); //HTTM ステータスコード(正常なら200) console.log(res.getContentText()); // レスポンスボディ LINEサーバー側がエラーを返している場合は、レスポンスボディにエラー内容の説明が入っている場合があります。
DK7553

2020/12/23 10:19

draqさま ありがとうございます。頂いた3行のコードを入れてLINEから文字列を送信して実行してみました。 で、レスポンスボディというのはWebhookの設定したURLをたたけばよろしいのでしょうか? ちなみにそこには「スクリプト関数が見つかりません: doGet」が表示されていました。
draq

2020/12/23 10:45

LINEから文字列を送信したのなら出力されているはずです。 console.log の出力が確認できないのなら、スプレッドシートに書き込むなりしてください。
DK7553

2020/12/24 02:50

draqさま ありがとうございます。 スプレッドシートに書き込んでみました。 HTTM ステータスコードは200。 レスポンスボディは以下の文字列が出力されエラー箇所がいくつかあり何のことやらという感じです(汗) <!DOCTYPE html><html><head><link rel="shortcut icon" href="//ssl.gstatic.com/docs/script/images/favicon.ico"><title>Error</title><style type="text/css">body {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}</style></head><body style="margin:20px"><div><img alt="Google Apps Script" src="//ssl.gstatic.com/docs/script/images/logo.png"></div><div style="text-align:center;font-family:monospace;margin:50px auto 0;max-width:600px">Script function not found: doGet</div></body></html>
draq

2020/12/24 03:50

Script function not found: doGet と出ているので、どこからか GET アクセスが発生していることになりますが、これはブラウザから Webhook の URL にアクセスしてませんか?そうではなくて、LINEアプリから公式チャネルへメッセージを投げて doPost のが呼ばれた時に、UrlFetchAp.fetch() から何が返っているか確認するのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問