GASを用いたLINE botで集計システムを作る際の、メンバー追加ができない不具合

GAS

1// LINE developersのメッセージ送受信設定に記載のアクセストークン 2const LINE_TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_TOKEN"); // Messaging API設定の一番下で発行できるLINE Botのアクセストークン 3const LINE_URL = 'https://api.line.me/v2/bot/message/reply'; 4 5// コミュニティ情報を保持する配列 6let communities = []; 7 8// メンバー情報を保持する配列 9let members = []; 10 11// ユーザーがメッセージを送信した時に下記を実行する 12function doPost(e) { 13 const json = JSON.parse(e.postData.contents); 14 const reply_token = json.events[0].replyToken; 15 const messageText = json.events[0].message.text; 16 17 if (typeof reply_token === 'undefined') { 18 return; 19 } 20 21 const option = { 22 'headers': { 23 'Content-Type': 'application/json; charset=UTF-8', 24 'Authorization': 'Bearer ' + LINE_TOKEN, 25 }, 26 'method': 'post', 27 'payload': JSON.stringify({ 28 'replyToken': reply_token, 29 'messages': [{ 30 'type': 'text', 31 'text': processMessage(messageText), 32 }], 33 }), 34 }; 35 36 UrlFetchApp.fetch(LINE_URL, option); 37 return; 38} 39 40// 受信したメッセージを処理する関数 41function processMessage(message) { 42 const command = message.split('、')[0]; 43 const params = message.split('、').slice(1); 44 45 switch (command) { 46 case 'コミュニティ追加': 47 return addCommunity(params); 48 case 'コミュニティ編集': 49 return editCommunity(params); 50 case 'コミュニティ削除': 51 return deleteCommunity(params); 52 case '追加': 53 return addMember(params); 54 case '削除': 55 return deleteMember(params); 56 case '確認': 57 return checkCommunities(); 58 default: 59 return '無効なコマンドです。'; 60 } 61} 62 63// コミュニティを追加する関数 64function addCommunity(params) { 65 const [date, name, startTime] = params; 66 const existingCommunity = findCommunity(date); 67 68 if (existingCommunity) { 69 return '既に同じ日程のコミュニティが存在します。'; 70 } else { 71 communities.push({ date, name, startTime }); 72 return 'コミュニティを追加しました。'; 73 } 74} 75 76// コミュニティを編集する関数 77function editCommunity(params) { 78 const [date, name, startTime, newDate, newName, newStartTime] = params; 79 const index = findCommunityIndex(date, name, startTime); 80 81 if (index !== -1) { 82 communities[index] = { date: newDate, name: newName, startTime: newStartTime }; 83 updateMembersDate(date, newDate); 84 return `コミュニティ日程を変更しました。\n〇${newDate} ${newName} ${newStartTime}`; 85 } else { 86 return '該当するコミュニティが見つかりません。'; 87 } 88} 89 90// コミュニティを削除する関数 91function deleteCommunity(params) { 92 const [date, name, startTime] = params; 93 const index = findCommunityIndex(date, name, startTime); 94 95 if (index !== -1) { 96 communities.splice(index, 1); 97 return 'コミュニティ日程を削除しました。'; 98 } else { 99 return '該当するコミュニティが見つかりません。'; 100 } 101} 102 103// メンバーを追加する関数 104function addMember(params) { 105 const [date, type, name] = params; 106 const community = findCommunity(date); 107 108 if (community) { 109 members.push({ date, type, name }); 110 return `以下のコミュニティにメンバーを追加しました。\n〇${community.date} ${community.name} ${community.startTime}\n${getMemberList()}`; 111 } else { 112 return '該当するコミュニティが見つかりません。'; 113 } 114} 115 116// メンバーを削除する関数 117function deleteMember(params) { 118 const [date, type, name] = params; 119 const index = findMemberIndex(date, type, name); 120 121 if (index !== -1) { 122 members.splice(index, 1); 123 return `以下のコミュニティからメンバーを削除しました。\n〇${date} ${findCommunity(date).name} ${findCommunity(date).startTime}\n${getMemberList()}`; 124 } else { 125 return '該当するメンバーが見つかりません。'; 126 } 127} 128 129// コミュニティ情報を確認する関数 130function checkCommunities() { 131 let reply = 'コミュニティ日程\n'; 132 133 communities.forEach(community => { 134 reply += `〇${community.date} ${community.name} ${community.startTime}\n`; 135 const matchingMembers = members.filter(member => member.date == community.date); 136 137 if (matchingMembers.length > 0) { 138 const memberNames = matchingMembers.map(member => member.name); 139 reply += memberNames.join('、') + '\n'; 140 } else { 141 reply += 'メンバーはいません。\n'; 142 } 143 }); 144 145 reply += `全${members.length}人(本人:${countMembersByType('本人')}人 友達:${countMembersByType('友達')}人)`; 146 return reply; 147} 148 149// 指定された日程のコミュニティを検索する関数 150function findCommunity(date) { 151 return communities.find(community => community.date == date); 152} 153 154// 指定された日程のコミュニティのインデックスを検索する関数 155function findCommunityIndex(date, name, startTime) { 156 return communities.findIndex(community => community.date == date && community.name == name && community.startTime == startTime); 157} 158 159// 指定された日程のメンバーのインデックスを検索する関数 160function findMemberIndex(date, type, name) { 161 return members.findIndex(member => member.date == date && member.type == type && member.name == name); 162} 163 164// メンバーの参加日を更新する関数 165function updateMembersDate(oldDate, newDate) { 166 members.forEach(member => { 167 if (member.date == oldDate) { 168 member.date = newDate; 169 } 170 }); 171} 172 173// メンバーの人数を種類別にカウントする関数 174function countMembersByType(type) { 175 return members.filter(member => member.type === type).length; 176} 177 178// メンバーリストを作成する関数 179function getMemberList() { 180 let memberList = ''; 181 const memberTypes = ['本人', '友達']; 182 183 memberTypes.forEach(type => { 184 const matchingMembers = members.filter(member => member.type === type); 185 186 if (matchingMembers.length > 0) { 187 const memberNames = matchingMembers.map(member => member.name); 188 memberList += `${type}:${memberNames.join('、')} `; 189 } 190 }); 191 192 return `全${members.length}人(${memberList.trim()})`; 193} 194 195// メッセージを解析して対応する関数を呼び出す 196function parseMessage(message) { 197 const command = message.split('、')[0]; 198 const params = message.split('、').slice(1); 199 200 switch (command) { 201 case 'コミュニティ追加': 202 return addCommunity(params); 203 case 'コミュニティ編集': 204 return editCommunity(params); 205 case 'コミュニティ削除': 206 return deleteCommunity(params); 207 case '追加': 208 return addMember(params); 209 case '削除': 210 return deleteMember(params); 211 case '確認': 212 return checkCommunities(); 213 default: 214 return '無効なコマンドです。'; 215 } 216} 217 218// メッセージを処理する関数 219function processMessage(messageText, replyToken) { 220 const reply = parseMessage(messageText); 221 222 const option = { 223 'headers': { 224 'Content-Type': 'application/json; charset=UTF-8', 225 'Authorization': 'Bearer ' + LINE_TOKEN, 226 }, 227 'method': 'post', 228 'payload': JSON.stringify({ 229 'replyToken': replyToken, 230 'messages': [{ 231 'type': 'text', 232 'text': reply, 233 }], 234 }), 235 }; 236 237 UrlFetchApp.fetch(LINE_URL, option); 238} 239 240// ユーザーがメッセージを送信した時に実行する関数 241function doPost(e) { 242 const json = JSON.parse(e.postData.contents); 243 const replyToken = json.events[0].replyToken; 244 const messageText = json.events[0].message.text; 245 246 processMessage(messageText, replyToken); 247 248 return; 249} 250

コメントを投稿

0 コメント