lineBotをスプレッドシートに日時の書き込みを行い、その後、書き込みが完了したことを返信するというシステムを作りたいです。
「take」とlineBotに送信するとスプレッドシートに日時を書き込み、「Return」と書き込むとそのセルの隣に日時を書き込みます。
下のコードだと、シートに日時は書き込めるのですが、LineBotが返信してくれないことに加え、
接続確認にも「Webhookが無効なHTTPステータスコードを返しました(期待されるステータスコードは200です)」と表示されます。
GAS
1 2var CHANNEL_ACCESS_TOKEN = 'チャンネルアクセストークン'; 3var spreadsheet = SpreadsheetApp.openById('シートのID'); 4 5var sheets = spreadsheet.getSheets(); //log用のシート 6var book_sheet = sheets[0]; //シート1 7 8function sendMsg(reply_token,message){ 9 10 var reply_token = JSON.parse(e.postData.contents).events[0].replyToken; 11 var url2 = 'https://api.line.me/v2/bot/message/reply'; 12 var response = Url2FetchApp.fetch(url2, { 13 'headers': { 14 'Content-Type': 'application/json; charset=UTF-8', 15 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 16 }, 17 'method': 'post', 18 'payload': JSON.stringify({ 19 'replyToken': reply_token, 20 'messages': [{ 21 'type': 'text', 22 'text': message, 23 }], 24 }), 25 }); 26 Logger.log(response); 27return response.getResponseCode(); 28} 29 30function doPost(e) { 31 32 var date = new Date(); 33 var event_data = JSON.parse(e.postData.contents).events[0] 34 var reply_token= event_data.replyToken; 35 const lastrow1 = box_sheet.getDataRange().getLastRow(); 36 if (typeof reply_token === 'undefined') { 37 return; 38 } 39 40 var user_message = event_data.message.text; 41 42 43 if (user_message =='take'){ 44 box_sheet.getRange(lastrow1 + 1, 1).setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss') ); //ここで止まってしまう。。 45 sendMsg(reply_token,"OK!") 46 } else if (user_message=='return'){ 47 box_sheet.getRange(lastrow1, 2).setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss') ); 48 sendMsg(reply_token,"OK!") 49 } 50 51 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 52 53}
色々調べた結果、doPost()の関数の中の変数user_messageの下に新たな変数 var user_name = getUserName(user_id); を加えると、LineBot側との接続が成功しますが、返信もない上、シートにも書き込んでくれなくなります。
具体的なコードは下記です。
GAS
1function getUserName(UID){/新しい関数 2 var url = 'https://api.line.me/v2/bot/profile/' + UID; 3 try { 4 var response = UrlFetchApp.fetch(url,{ 5 'headers': { 6 'Content-Type': 'application/json; charset=UTF-8', 7 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 8 } 9 }) 10 }catch(e){ 11 return 0; 12 } 13 var json = JSON.parse(response.getContentText()); 14 return json["displayName"] 15} 16//以下、上と同じ 17function sendMsg(reply_token,message){ 18 19 var reply_token = JSON.parse(e.postData.contents).events[0].replyToken; 20 var url2 = 'https://api.line.me/v2/bot/message/reply'; 21 var response = Url2FetchApp.fetch(url2, { 22 'headers': { 23 'Content-Type': 'application/json; charset=UTF-8', 24 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 25 }, 26 'method': 'post', 27 'payload': JSON.stringify({ 28 'replyToken': reply_token, 29 'messages': [{ 30 'type': 'text', 31 'text': message, 32 }], 33 }), 34 }); 35 Logger.log(response); 36return response.getResponseCode(); 37} 38 39function doPost(e) { 40 41 var date = new Date(); 42 var event_data = JSON.parse(e.postData.contents).events[0] 43 var reply_token= event_data.replyToken; 44 const lastrow1 = box_sheet.getDataRange().getLastRow(); 45 if (typeof reply_token === 'undefined') { 46 return; 47 } 48 49 var user_message = event_data.message.text; 50 var user_name = getUserName(user_id); 51 52 if (user_message =='take'){ 53 box_sheet.getRange(lastrow1 + 1, 1).setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss') ); 54 sendMsg(reply_token,"OK!") 55 } else if (user_message=='return'){ 56 box_sheet.getRange(lastrow1, 2).setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss') ); 57 sendMsg(reply_token,"OK!") 58 } 59 60 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 61 62}
想定する挙動は
LINEBOTに「Take」の文字列を送信すると、スプレッドシートの(最終列,1)に送信した時刻が刻まれ、「Return」の文字列をLineBotに送信すると、スプレッドシートの(最終列,2)に時刻が表示されるというものです。
どこか返信ができない原因があるのでしょうか。ご教示よろしくお願いいたします。