前提・実現したいこと
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の中をいじってみましたが、変化はありませんでした。
回答1件
あなたの回答
tips
プレビュー