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

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

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

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

Google スプレッドシート

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

Google Apps Script

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

Q&A

0回答

1539閲覧

doPostでエラー。LINEbotからGoogle Spreadsheetに書き込み。

Ringome

総合スコア6

LINE Messaging API

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

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2020/04/30 05:09

編集2020/04/30 11:00

##質問内容
LINE Messaiging APIとGASを使ってGoogle Spreadsheetに書き込めれるようにしています。
しかし、GAS側にエラーが走りメッセージの返信やSpreadsheetに書き込むことができません。

このサイトの6までやっています。
https://note.com/ky120930/n/n4e6c3fc68dd9

状況 :
・GASの公開範囲は全員、匿名

 ・LINEbotとGASとの設定は間違いない。
リンクされていると思う。

エラー :
・TypeError: Cannot read property 'postData' of undefined
(翻訳 :TypeError: Cannot read property 'postData' of undefined)

 実行数 :
・ウェブアプリ、不明。

試したこと :
・LINE Messaiging APIのチャンネルを変えてみる

 ・Spreadsheetの権限を変えて試してみる(前の回答)
>>GASでどのくらいSpreadsheetに権限を与えるかについては承認している。
他のSpreadsheetを変えてみたりしているから違うと思う。

 ・ログを出して確認してみる(前の回答)
>>『このエディタ セッションで実行された関数はありません。』と出る。
App SclriptのStackdriver ログを見てみる。
上記の実行数の通り、ウェブアプリ、不明、と出る。

 ・arr_testが希望する形式で取得しているか確認してみる。
>>JavaScriptを読まない。確認方法がわからない。

GAS

1//LINE Developersで取得したアクセストークンを入れる 2var CHANNEL_ACCESS_TOKEN = 'アクセストークン'; 3var line_endpoint = 'https://api.line.me/v2/bot/message/reply'; 4 5//取得したメッセージを格納するためのスプレッドシート情報を入力 6var id = 'シートID'; 7var dateSheet = SpreadsheetApp.openById(id).getSheetByName('シート名1'); 8 9//スプレッドシートの最終行を取得 10var lastlow = dateSheet.getLastRow(); 11 12//ポストで送られてくるので、送られてきたJSONをパース 13function doPost(e) { 14 var json = JSON.parse(e.postData.contents); 15 16 //返信するためのトークン取得 17 var reply_token= json.events[0].replyToken; 18 if (typeof reply_token === 'undefined') { 19 return; 20 } 21 22 //送られたメッセージ内容を取得 23 var message = json.events[0].message.text; 24 25 //配列を宣言 26 var arr_test = []; 27 28 //LINEの内容を改行毎に区切って配列に格納 29 var arr_test = message.split(/\r\n|\r|\n/); 30 31 //指定の文言を置換する 32 arr_test[0] = arr_test[0].replace('タイトル:', ''); 33 arr_test[1] = arr_test[1].replace('日付:', ''); 34 arr_test[2] = arr_test[2].replace('場所:', ''); 35 arr_test[3] = arr_test[3].replace('開始時間:', ''); 36 arr_test[4] = arr_test[4].replace('終了時間:', ''); 37 38 //置換後の配列の値をスプレッドシートの最終行に指定のセルに格納 39 dateSheet.getRange(lastlow+1, 1).setValue(arr_test[0]); 40 dateSheet.getRange(lastlow+1, 2).setValue(arr_test[1]); 41 dateSheet.getRange(lastlow+1, 3).setValue(arr_test[2]); 42 dateSheet.getRange(lastlow+1, 4).setValue(arr_test[3]); 43 dateSheet.getRange(lastlow+1, 5).setValue(arr_test[4]); 44 dateSheet.getRange(lastlow+1, 6).setValue("登録"); 45 46 // メッセージを返信 47 UrlFetchApp.fetch(line_endpoint, { 48 'headers': { 49 'Content-Type': 'application/json; charset=UTF-8', 50 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 51 }, 52 'method': 'post', 53 'payload': JSON.stringify({ 54 'replyToken': reply_token, 55 'messages': [{ 56 'type': 'text', 57 'text': 'スプレッドシートに登録したよ!!!', 58 }], 59 }), 60 }); 61 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 62}

##追記

・doPostで引数(e)が正常に受け取れていないだけでは?
console.log("e = " + JSON.stringigy(e));
とかして確認しましょう。
>>確認しました。
『e = undefined』と出ました。

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

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

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

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

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

draq

2020/04/30 09:52

TypeError: Cannot read property 'postData' of undefined と出ているなら、doPostで引数(e)が正常にうけとれていないだけでは? console.log("e = " + JSON.stringigy(e)); とかして確認しましょう。
Ringome

2020/04/30 11:01

こんばんは。 e = undefinedとログに表示されました。 質問に追記しました。
draq

2020/04/30 11:11

ちゃんとWebアプリケーションとして公開してますか? doPostはWebhookを登録したLINEの公式チャネルから呼ばれてますか?
Ringome

2020/04/30 11:21

・ちゃんとWebアプリケーションとして公開してますか? >>されています。 ・doPostはWebhookを登録したLINEの公式チャネルから呼ばれてますか? >>呼ばれる、というのはCurrent web app URLがWebhookURLにきちんと登録されているか、 ということですか?
draq

2020/04/30 11:33

そうです。 ちゃんとLINEサーバー側からWebhookのURLにPOSTされていれば、eがundefinedにはならないはずです。
draq

2020/04/30 11:36 編集

ちなみに function doPost(e) { console.log("e = " + JSON.stringify(e)); } だけのコードで、適当なHTTPSにアクセスできるツールからURLにデータはなしでPOSTすると e = {"parameter":{},"contextPath":"","contentLength":0,"queryString":"","parameters":{}} というログが出力されました。
Ringome

2020/04/30 11:46 編集

・urrent web app URLがWebhookURLにきちんと登録されているか? >>きちんとされています。 細かい環境を残して(WebhookURLを登録したままなど) コードを全てリセットして、GASで上記のコードを実行したら 『e = undefined』という風にログに表示されます。 draqさんがおっしゃる結果は出ないです。
draq

2020/04/30 11:52

GASからコード実行するんじゃなくて、URLへHTTPS(POST)アクセスするんですよ?
Ringome

2020/04/30 12:14

無知ですみません。 30分くらい調べたのですが、 『適当なHTTPSにアクセスできるツールからURLにデータはなしでPOSTすると』あたりからよくわからないです。 この通りにすれば良いのでしょうか? やってみたのですが、このあとどうすればいいか等がわからないです。 https://qiita.com/n0bisuke/items/a31a99232e50461eb00f
draq

2020/04/30 12:32

提示されたサイトは方向が逆です。GASサーバーから外部のURLへアクセスしています。 クライアント(今回はLINEサーバー)から何らかのイベント(友だち追加、メッセージの投稿、等々)の発生時にWebhookに登録したURL(今回はGAS)を呼び出すというのがWebhookの仕組みです。 そのため、動作確認としては最初にWebhookを登録した公式LINEチャネルを友だち追加したLINEアカウントから適当にメッセージを投稿するなどしてWebhookを呼び出させる必要があります。 eがundefinedになるのは、doPostをGASのエディタ画面から直接呼んでいるからでしょう。
Ringome

2020/04/30 13:15

LINEを登録して、こちらからメッセージを送るということですよね。 やってます。念の為、LINEの別のアカウント(チャンネル)を作って最初からやってみましたがダメです。 挫けそうです。
draq

2020/04/30 13:26 編集

LINEを登録して、こちらからメッセージを送って、 function doPost(e) { console.log("e = " + JSON.stringify(e)); } だけのコードにして、 e = undefined になるってことでしょうか。 あと、最新がデプロイされているか確認するためにも、ログ出力はメッセージを変えてみたほうがいいです。("e = "を"e2 ="にしてみるとか) その上で、 e2 = undefined になるようなら、もうお手上げです。 プロジェクト自体を作り直してみるぐらいしか思いつきません。
Ringome

2020/05/02 01:19

e = undefinedになりますね。 結構調べてみて試してはみているのですが中々改善がしない。 時間を置いてからやってみようと思います。
papinianus

2020/05/02 04:43

> LINEを登録して、こちらからメッセージを送るということですよね。 ここからログをみるまでの手順を押したボタンレベルで詳細に説明していただけますか。
Ringome

2020/05/02 14:42

こんばんは。 以下の通りです。何卒よろしくお願いします。 LINE Developrersのコンソール > ホーム > 2[Google Apps Script](プロバイダー) > 2[Google Apps Script(チャンネル選択) > Messaging API > QRコードを自分の使っているLINE(普段使い。LINE@ではない)で登録 >  Androidで自分のLINE起動、トーク、2[Google Apps Script(LINE@)を押す、 『タイトル:テスト 日付:2019/11/29 場所:日本 開始時間:21:00 終了時間:22:00』と送信(既読、返信なし) > スプレッドシートにアクセス(Chromeで検索) > スプレッドシートのシートを右クリック > 記録されないことを確認 > そのスプレッドシートのGAS、表示、ログ > 『このエディタ セッションで実行された関数はありません。』と書いてある > 閉じる > 上にある時計のマークを押す > 『2[Google Apps Script]LINEからスプレッドシート経由でGoogleカレンダーに登録する』(スプレッドシートのGASの名前)を押す > プロジェクトの詳細の横の『・・・(縦に)』を押す、実行数を押す
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問