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

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

ただいまの
回答率

88.11%

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,416

score 6

質問内容

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を読まない。確認方法がわからない。

//LINE Developersで取得したアクセストークンを入れる
var CHANNEL_ACCESS_TOKEN = 'アクセストークン'; 
var line_endpoint = 'https://api.line.me/v2/bot/message/reply';

//取得したメッセージを格納するためのスプレッドシート情報を入力
var id = 'シートID';
var dateSheet = SpreadsheetApp.openById(id).getSheetByName('シート名1');

//スプレッドシートの最終行を取得
var lastlow = dateSheet.getLastRow();

//ポストで送られてくるので、送られてきたJSONをパース
function doPost(e) {
 var json = JSON.parse(e.postData.contents);

 //返信するためのトークン取得
 var reply_token= json.events[0].replyToken;
 if (typeof reply_token === 'undefined') {
   return;
 }

 //送られたメッセージ内容を取得
 var message = json.events[0].message.text;  

 //配列を宣言
 var arr_test = [];

 //LINEの内容を改行毎に区切って配列に格納
 var arr_test = message.split(/\r\n|\r|\n/);  

 //指定の文言を置換する
 arr_test[0] = arr_test[0].replace('タイトル:', '');
 arr_test[1] = arr_test[1].replace('日付:', '');
 arr_test[2] = arr_test[2].replace('場所:', '');
 arr_test[3] = arr_test[3].replace('開始時間:', '');
 arr_test[4] = arr_test[4].replace('終了時間:', '');

 //置換後の配列の値をスプレッドシートの最終行に指定のセルに格納
 dateSheet.getRange(lastlow+1, 1).setValue(arr_test[0]);
 dateSheet.getRange(lastlow+1, 2).setValue(arr_test[1]);
 dateSheet.getRange(lastlow+1, 3).setValue(arr_test[2]);
 dateSheet.getRange(lastlow+1, 4).setValue(arr_test[3]);
 dateSheet.getRange(lastlow+1, 5).setValue(arr_test[4]);
 dateSheet.getRange(lastlow+1, 6).setValue("登録");

 // メッセージを返信    
 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': [{
       'type': 'text',
       'text': 'スプレッドシートに登録したよ!!!',
     }],
   }),
 });
 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

追記

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • Ringome

    2020/05/02 10:19

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

    キャンセル

  • papinianus

    2020/05/02 13:43

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

    キャンセル

  • Ringome

    2020/05/02 23: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の名前)を押す > プロジェクトの詳細の横の『・・・(縦に)』を押す、実行数を押す

    キャンセル

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

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

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる