###概要
GASというGoogleのサイトで、LINEリマインダーアプリを作ろうとしています。
まったくの初心者なので、このサイトを参考にしています。
https://qiita.com/3yen/items/30496f963ceb0af31a1a
(天気予報の部分は、難しいのと、ID取得がうまくいかないのでやめました)
しかし、アカウントにこのコード?を紐づけておうむ返しするところまではできたのですが、リマインド機能をラインの方で指示してもおうむ返ししかしてくれません。
どうしたらリマインド機能がうまくいくでしょうか。
とても困っています。どうぞよろしくお願いします。
以下に、実際に書いた物をおきます。これですべてです。
実際に使用したコード
//ここから、ラインアカウント基本設定及び及びおうむ返ししてくれるシステムのコード //LINE Developersで取得したアクセストークンを入れる var CHANNEL_ACCESS_TOKEN = 'yDzD6ydHHl8yrKLU0uSZ1M2Dp1gAp2cwgwklkk2KUOjxBjpCBzyDnWGrig507EK297qAveM7yfDizHSnjlFBNO3ypvqansfnYLztfm4b0uT8WcSM72FR1BDIW/IiB/7XoW7O3v2sf+0fT+RkM/yTrgdB04t89/1O/w1cDnyilFU='; var line_endpoint = 'https://api.line.me/v2/bot/message/reply'; //ポストで送られてくるので、送られてきた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; // メッセージを返信 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': message, }], }), }); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); } ######おうむ返しの部分はここまで、以下リマインド機能 var spreadsheet = SpreadsheetApp.openById('IDを入力'); var sheet = spreadsheet.getSheetByName('webhook'); function appendToSheet(text) { sheet.appendRow([text]); } //セルに中身があるか function blankTF(row, col){ return !(sheet.getRange(row, col).isBlank()); } //sheetの行数 function lastRow() { var dat = sheet.getLastRow(); return dat; } //全行サーチ function seachAll(){ var dat = sheet.getDataRange().getValues(); } //指定した行の削除 function deleatRow(RowNum){ sheet.deleteRow(RowNum); } //全削除 function deleatAll(){ sheet.clearContents(); } //セル[row][col]の値を返す function getFromRowCol(row, col) { var dat = sheet.getDataRange().getValues(); return dat[row][col]; } //セル[row][col]にvalを入れる function setFromRowCol(val, row, col) { sheet.getRange(row , col).setValue(val); } //row行1列のデータ(内容)を取得 function getTodoCell(row) { return sheet.getRange(row , 1).getValue(); } //row行2列のデータ(日付)を取得 function getDateCell(row) { return sheet.getRange(row , 2).getValue(); } //row行3列のデータ(trigger)を取得 function getTriggerCell(row) { return sheet.getRange(row , 3).getValue(); function setTrigger(row, date) { var triggerDay = moment(date,'YYYY年MM月DD日H時m分').toDate(); var trigger = ScriptApp.newTrigger("remind").timeBased().at(triggerDay).create(); setFromRowCol(trigger.getUniqueId(), row, 3); } function deleteTrigger(uniqueId) { var triggers = ScriptApp.getProjectTriggers(); for(var i=0; i < triggers.length; i++) { if (triggers[i].getUniqueId() === uniqueId) { ScriptApp.deleteTrigger(triggers[i]); } } } var moment = Moment.load(); //ポストで送られてくるので、送られてきたJSONをパース function doPost(e) { var json = JSON.parse(e.postData.contents); var replyText = 'null'; var filledDo = false; var filledDate = true; if(lastRow()>0){ filledDo = blankTF(lastRow(),1); filledDate = blankTF(lastRow(),2); } var userId = json.events[0].source.userId; //返信するためのトークン取得 var replyToken= json.events[0].replyToken; if (typeof replyToken === 'undefined') { return; } var message = json.events[0].message.text; switch (message) { case 'キャンセル': replyText = cancel(); break; case '天気': replyText = ''; push_message(); break; case '確認': if (lastRow()>0) { replyText = confirm(); } else { replyText = 'まだ何にも登録してないでしょ'; } break; default: if(message.match(/削除/)){ replyText = del(message); } else if(filledDate){ replyText = setDo(message); break; }else{ replyText = setDate(message); break; } break; } // メッセージを返信 UrlFetchApp.fetch(line_endpoint, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': replyToken, 'messages': [{ 'type': 'text', 'text': replyText, }], }), }); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); } //データの削除 function del(m){ m=m.replace('削除', ''); if (m==''){ return '「削除+リマインダー番号」で指定しなさい' } m = m.replace(/[A-Za-z0-9]/g, function (s) { return String.fromCharCode(s.charCodeAt(0) - 0xFEE0); }); if(m>lastRow()){ return '番号間違ってるわよ\nもう一回確認しなさい'; } var s = getTodoCell(m); var deltriggerID = getTriggerCell(m); deleteTrigger(deltriggerID); deleatRow(m); return '「'+s+'」'+'を削除したわ'; } //データの確認 function confirm(){ var replyText = 'まだ何にも登録してないでしょ'; if(lastRow()>0){ replyText = ''; for (var i = 1; i <= lastRow(); i++) { replyText += i+';'+ getDateCell(i) + 'に「' + getTodoCell(i) + '」\n'; } } replyText+='以上よ'; return replyText; } //入力のキャンセル function cancel(){ if(lastRow()>0){ deleatRow(lastRow()); return 'キャンセルしたわ\nまたなんかあったら言って'; }else{ return 'キャンセルするものなんてないわよ'; } } //日付の入力 function setDate(m){ // 全角英数を半角に変換 m = m.replace(/[A-Za-z0-9]/g, function (s) { return String.fromCharCode(s.charCodeAt(0) - 0xFEE0); }); var date = Moment.moment(m, 'M月D日H時m分', true).format('YYYY年MM月DD日H時m分'); if (date === 'Invalid date') { var match = m.match(/\d+/g); if (match !== null) { date = Moment.moment().add(+match[0], 'minutes').format('YYYY年MM月DD日H時m分'); } } if (date === 'Invalid date') { return '「何分後」「」' } setTrigger(lastRow(), date); setFromRowCol(date,lastRow(), 2); return 'はいはい\n'+date + 'に連絡するわ'; } //データの入力 function setDo(m){ if(RandomReturn()){ return 'めんどくさぁ......'; } setFromRowCol(m, lastRow()+1, 1); return '「' + m + '」ね、いつ連絡すればいいのよ\n「キャンセル」って言ってくれればやめるけど'; } function getnowDate(){ return Moment.moment().format('YYYY年MM月DD日H時m分'); } function remind(e){ var nowDate = getnowDate(); var replyText = 'リマインド登録されてないわよ'; if(lastRow()>0){ for (var i = 1; i <= lastRow(); i++) { replyText = getDateCell(i); if(getDateCell(i)==Moment.moment().format('YYYY年MM月DD日H時m分')){ replyText = getTodoCell(i); var deltriggerID = getTriggerCell(i); deleteTrigger(deltriggerID); deleatRow(i); } } } var postData = { "to": 'ユーザーID', "messages": [ { "type": "text", "text": replyText+'\nふゆがわざわざリマインドしてあげたんだから、忘れるんじゃないわよ' } ]} var headers = { "Content-Type": "application/json", 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }; var options = { "method": "post", "headers": headers, "payload": JSON.stringify(postData) }; var response = UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", options); } } //終わりです。ちなみに、全部コピペしただけなのですが、実行ボタンを押したときにはエラーは出ませんでした。
発生している問題・エラーメッセージ
エラーメッセージは特にありませんでした。
該当のソースコード
たぶんJavaspriptというものです。
試したこと
下手に触るともっとわからなくなるなと思い、何も試せていません。ごめんなさい。
補足情報(FW/ツールのバージョンなど)
LINEはLINEDeveloperという機能を使っています
あなたの回答
tips
プレビュー