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

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

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

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

4645閲覧

GASで作成したLINE botのエラー:400が解決できない

退会済みユーザー

退会済みユーザー

総合スコア0

LINE Messaging API

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/12/02 11:41

前提・実現したいこと

https://www.nakakamado.com/2020/06/gas-line-bot.htmlを参考に、GASで、予定通知LINE botを作成しています。
LINE側の設定として、Webhookオン、Webhook URL入力済み・検証成功となっています。また、グループ・複数人チャットへの参加、応答メッセージ、あいさつメッセージも有効になっています。
以下のコードにチャンネルアクセストークン、スプレッドシートID(2種類)、GoogleフォームのURLを入れ、GAS側で、「ウェブアプリケーションとして導入」→「Project Version: New」→「Who has access to the app: Anyone, even anonymous」で公開しました。なお、「Chrome V8を搭載した新しいApps Scriptランタイム」は無効になっています。Googleアカウントの認証も済んでおり、Googleフォームにリンクしているスプレッドシートには、日付が今日の予定が1つ入っています。

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

上記の手順を踏んだ後、関数「push」を実行したところ、以下のエラーメッセージが表示されます。
翻訳にかけてみたのですが、意味があまり理解できませんでした。

https://api.line.me のリクエストに失敗しました(エラー: 400)。サーバー応答の一部: {"message":"The request body has 1 error(s)","details":[{"message":"May not be empty","property":"replyToken"}]}(応答の全文を見るには muteHttpExceptions オプションを使用してください)(行 71、ファイル「コード」)

該当のソースコード

JavaScript

1var ACCESS_TOKEN = "チャンネルアクセストークン"; 2var PUSH = "https://api.line.me/v2/bot/message/multicast"; 3var REPLY = "https://api.line.me/v2/bot/message/reply"; 4 5function doPost(e) { 6 var events = JSON.parse(e.postData.contents).events; 7 events.forEach(function(event) { 8 if(event.type == "message") { 9 reply(event); 10 } else if(event.type == "follow") { 11 follow(event); 12 } else if(event.type == "unfollow") { 13 unFollow(event); 14 } 15 }); 16} 17 18function push() { 19 var spreadsheet = SpreadsheetApp.openById("予定のスプレッドシートID"); 20 var sheet = spreadsheet.getActiveSheet(); 21 22 var start = 2; 23 var end = sheet.getLastRow(); 24 25 var today = new Date();   26 var formattedDate = Utilities.formatDate(today, "JST", "yyyy/MM/dd"); 27 28 var spsh = SpreadsheetApp.openById("ユーザーIDのスプレッドシートID"); 29 var sht = spsh.getActiveSheet(); 30 var data = sht.getDataRange().getValues(); 31 var userlist = []; 32 for(var n = 0; n < data.length; n++){ 33 userlist.push(data[n][0]); 34 } 35 36 var value =[]; 37 for(var i = start; i <= end; i++) { 38 var sell_C = "C" + i; 39 var day_C = sheet.getRange(sell_C).getValue(); 40 var day_C = Utilities.formatDate(day_C, "JST", "yyyy/MM/dd"); 41 if(formattedDate != day_C){ 42 continue; 43 } 44 var sell_B = "B" + i; 45 value.push("・" + sheet.getRange(sell_B).getValue() + "\n\n"); 46 } 47 if(value.length == 0){ 48 return; 49 } 50 51 var postData = { 52 "to" : userlist, 53 "messages" : [ 54 { 55 "type" : "text", 56 "text" : "【本日の予定】\n\n" + value.join("") + "今日も一日がんばりましょう!" 57 } 58 ] 59 }; 60 61 var headers = { 62 "Content-Type" : "application/json; charset=UTF-8", 63 "Authorization" : "Bearer " + ACCESS_TOKEN 64 }; 65 66 var options = { 67 "method" : "POST", 68 "headers" : headers, 69 "payload" : JSON.stringify(postData) 70 }; 71 return UrlFetchApp.fetch(PUSH, options); 72} 73 74function reply(data) { 75 var postMsg = data.message.text; 76 var replyToken = data.replyToken; 77 var replyText = ""; 78 79 if(postMsg == "登録") { 80 replyText = "予定の登録はこちら\n" + "Google フォームのURL"; 81 } else if(postMsg == "今後の予定") { 82 var spreadsheet = SpreadsheetApp.openById("予定のスプレッドシートID"); 83 var sheet = spreadsheet.getActiveSheet(); 84 85 var range = sheet.getRange(2, 1, sheet.getLastRow(), 3); 86 range.sort([ 87 {column: 3, ascending: true}, 88 ]); 89 90   var start = 2; 91 var end = sheet.getLastRow(); 92 93 var today = new Date();   94 var formattedDate = Utilities.formatDate(today, "JST", "yyyy/MM/dd"); 95 96 var value =[]; 97 for(var i = start; i <= end; i++) { 98 var sell_C = "C" + i; 99 var day_C = sheet.getRange(sell_C).getValue(); 100 var day_C = Utilities.formatDate(day_C, "JST", "yyyy/MM/dd"); 101 if(formattedDate < day_C){ 102 var sell_B = "B" + i; 103 value.push("・" + sheet.getRange(sell_B).getValue() + "(" + day_C + ")" + "\n\n"); 104 } 105 } 106 replyText = value.join("") + "忘れないようにしましょう!"; 107 } 108 109 if(replyText == ""){ 110 return; 111 } else { 112 var postData = { 113 "replyToken" : replyToken, 114 "messages" : [ 115 { 116 "type" : "text", 117 "text" : replyText 118 } 119 ] 120 }; 121 122 var headers = { 123 "Content-Type" : "application/json; charset=UTF-8", 124 "Authorization" : "Bearer " + ACCESS_TOKEN 125 }; 126 127 var options = { 128 "method" : "POST", 129 "headers" : headers, 130 "payload" : JSON.stringify(postData) 131 }; 132 133 return UrlFetchApp.fetch(REPLY, options); 134 } 135} 136 137function follow(e) { 138 var spsh = SpreadsheetApp.openById("ユーザーIDのスプレッドシートID"); 139 var sht = spsh.getActiveSheet(); 140 sht.appendRow([e.source.userId]); 141} 142 143function unFollow(e){ 144 var spsh = SpreadsheetApp.openById("ユーザーIDのスプレッドシートID"); 145 var sht = spsh.getActiveSheet(); 146 var result = findRow(sht, e.source.userId, 1); 147 if(result > 0){ 148 sht.deleteRows(result); 149 } 150} 151 152function findRow(sht,val,col){ 153 var data = sht.getDataRange().getValues(); 154 for(var i = 0; i < data.length; i++){ 155 if(data[i][col-1] === val){ 156 return i+1; 157 } 158 } 159 return 0; 160}

試したこと

ネットで検索して得た情報をもとに、optionsの中をいじってみましたが、変化はありませんでした。

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

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

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

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

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

papinianus

2020/12/03 07:59

push() というものが、同じプロジェクトの中に他に存在しませんか?
退会済みユーザー

退会済みユーザー

2020/12/03 10:08

返信してくださり、ありがとうございます。 下の「自己解決の方法」にも記載したとおり、1日待った結果、エラーは出なくなりました。 なお、コードが起因のエラーではなかったので、当たり前のことではありますが、同じプロジェクト内に push()は存在していませんでした。 本当にありがとうございました。
guest

回答1

0

ベストアンサー

1日経った今、ダメ元でもう一度 push() を実行したところ、見事成功し、スマホに通知が届きました。昨日の時点では、LINE側のサーバーでリクエストの処理が未完了だったのかもしれません。もし、私と同じようなエラーで悩まされている方がいましたら、1日待ってみるのも良いかもしれません。

投稿2020/12/03 10:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問