一応載せておきますが、投票機能がまだ完成しておらず一部動きません。(一旦完成させて動いていたのに、改造しようとしてたらいつの間にか動かなくなっていました・・・。完全にミスです。動いた時点で別に保存しておくべきでした。)
もし参考にされる方がいらっしゃいましたら、部分部分を参考にする形でご利用ください。
var channel_access_token = "取得したアクセストークン"
function doPost(e) {
var ss = SpreadsheetApp.openById("スプレッドシートid")
var count = ss.getRange("D1").getValue();
var voteAllCount = ss.getRange("D2").getValue();
var events = JSON.parse(e.postData.contents).events;
var ids = []
var tasuha;
for(var i=1;i<=count;i++){
if(ss.getRange("J"+i).getValue() == "tasuha"){
tasuha = ss.getRange("L"+i).getValue()
}
}
events.forEach(function(event) {
if(event.type == "message") {
if((event.message.text).match(/ワードウルフ開始/)){
Count(event)
} else if((event.message.text).match(/はい、参加します!人数カウント中です。/)) {
start(event,count)
} else if((event.message.text).match(/はい、はじめます!/)) {
sendMessage(event)
} else if((event.message.text).match(/やりません〜〜〜〜〜〜/)){
ss.getRange("D1").setValue(0);
ss.getRange("E1:E15").clear();
ss.getRange("I1:I15").clear();
ss.getRange("J1:J15").clear();
GoodbyeMessage(event)
} else if((event.message.text).match(/ワードウルフ終了/)){
endMessage(event)
} else if((event.message.text).match(/多数派の方へ:少数派は誰ですか?/)){
Vote(event,count)
} else if((event.message.text).match(/投票終了です。\n多数派の方の勝利です!/)){
tasuhaWinMessage(event)
resultMessage(event,count)
ss.getRange("D1").setValue(0);
ss.getRange("E1:E15").clear();
ss.getRange("I1:I15").clear();
ss.getRange("J1:J15").clear();
ss.getRange("K1:K15").clear();
ss.getRange("L1:L15").clear();
ss.getRange("M1:M15").setValue(0);
} else if((event.message.text).match(/投票終了です。多数派の方は負けです。\n少数派の方へ:多数派は何ですか?/)){
} else if(event.message.text == tasuha){
syosuhaWinMessage(event)
resultMessage(event,count)
ss.getRange("D1").setValue(0);
ss.getRange("E1:E15").clear();
ss.getRange("I1:I15").clear();
ss.getRange("J1:J15").clear();
ss.getRange("K1:K15").clear();
ss.getRange("L1:L15").clear();
ss.getRange("M1:M15").setValue(0);
}
} else if(event.type == "follow") {
follow(event);
} else if(event.type == "unfollow") {
unFollow(event);
}
if("postback" in event){
var userID = event.source.userId;
var userName = getUserName(userID);
var userPicture = getUserPicture(userID)
if(event.postback.data == "counter"){
if(count == 0){
ss.getRange("D1").setValue(count+1);
count += 1;
ss.getRange("E"+count).setValue(userID);
ss.getRange("I"+count).setValue(userName);
ss.getRange("K"+count).setValue(userPicture);
} else {
for(var i=1;i<=count;i++){
ids[i] = ss.getRange("E"+i).getValue();
if(event.source.userId == ids[i]){
stopMessage(event,i);
} else {
ss.getRange("D1").setValue(count+1);
count += 1;
ss.getRange("E"+count).setValue(userID);
ss.getRange("I"+count).setValue(userName);
ss.getRange("K"+count).setValue(userPicture);
}
}
}
}
if(event.postback.data == "end"){
VoteMessage(event)
}
for(var i=1;i<=count;i++){
if(event.postback.data == "投票データ"+i){
voteAllCount += 1;
voteCount[i] = ss.getRange("M"+i).getValue()
ss.getRange("M"+i).setValue(voteCount[i]+1);
}
}
if(voteAllCount == count){
}
}
});
}
function getUserName(userID) {
var url = "https://api.line.me/v2/bot/profile/" + userID;
var response = UrlFetchApp.fetch(url, {
"headers" : {
"Authorization" : "Bearer " + channel_access_token
}
});
return JSON.parse(response.getContentText()).displayName;
}
function getUserPicture(userID) {
var url = "https://api.line.me/v2/bot/profile/" + userID;
var response = UrlFetchApp.fetch(url, {
"headers" : {
"Authorization" : "Bearer " + channel_access_token
}
});
return JSON.parse(response.getContentText()).pictureUrl;
}
function Count(e) {
var msg = {
"type": "template",
"altText": "this is a confirm template",
"template": {
"type": "confirm",
"text": "ワードウルフを始めます。\n参加しますか?",
"actions": [
{
"type":"postback",
"label":"Yes",
"data":"counter",
"text":"はい、参加します!人数カウント中です。"
},
{
"type": "message",
"label": "No",
"text": "no"
}
]
}
}
var postData = {
"replyToken" : e.replyToken,
"messages" : [msg]
}
var options = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(postData)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", options);
}
function start(e,count) {
var ret_msg = {
"type": "template",
"altText": "this is a confirm template",
"template": {
"type": "confirm",
"text": count + "人で始めますか?",
"actions": [
{
"type":"postback",
"label":"Yes",
"data":"action=yes",
"text":"はい、はじめます!"
},
{
"type": "message",
"label": "やめる",
"text": "やりません〜〜〜〜〜〜"
}
]
}
}
var postData2 = {
"replyToken" : e.replyToken,
"messages" : [ret_msg]
}
var options2 = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(postData2)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", options2);
}
function sendMessage(e){
var ss = SpreadsheetApp.openById("スプレッドシートid")
var num = (Math.floor(Math.random()*400)+1)*2 - 1
var valueA = ss.getRange("A"+num).getValue();
var valueB = ss.getRange("B"+num).getValue();
var count = ss.getRange("D1").getValue();
var randomN = Math.floor(Math.random()*count)+1
var ids = []
for(var i=1;i<=count;i++){
ids[i] = ss.getRange("E"+i).getValue();
}
if(count <= 6){
var syosuha = ss.getRange("E"+randomN).getValue();
for(var i=1;i<=count;i++){
if(ids[i] == syosuha){
ss.getRange("J"+i).setValue("syosuha");
var messageB = {
"to" : syosuha,
"messages" : [
{
"type" : "text",
"text" : "あなたのお題は"+valueB+" です!!グループに戻ってゲームを始めてください。"
}
]
};
var replyDataB = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(messageB)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", replyDataB);
} else {
ss.getRange("J"+i).setValue("tasuha");
ss.getRange("L"+i).setValue(valueA);
var messageA = {
"to" : ids[i],
"messages" : [
{
"type" : "text",
"text" : "あなたのお題は "+valueA+" です!!グループに戻ってゲームを始めてください。"
}
]
};
var replyDataA = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(messageA)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", replyDataA);
}
}
} else {
var syosuha1 = ss.getRange("E"+randomN).getValue();
if (randomN-1 <= 0){
randomN += 1;
} else {
randomN -= 1;
}
var syosuha2 = ss.getRange("E"+randomN).getValue()
for(var i=1;i<=count;i++){
if(ids[i] == syosuha1 || ids[i] == syosuha2){
ss.getRange("J"+i).setValue("syosuha");
var messageB = {
"to" : ids[i],
"messages" : [
{
"type" : "text",
"text" : "あなたのお題は "+valueB+" です!!グループに戻ってゲームを始めてください。"
}
]
};
var replyDataB = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(messageB)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", replyDataB);
} else {
ss.getRange("J"+i).setValue("tasuha");
ss.getRange("L"+i).setValue(valueA);
var messageA = {
"to" : ids[i],
"messages" : [
{
"type" : "text",
"text" : "あなたのお題は "+valueA+" です!!グループに戻ってゲームを始めてください。"
}
]
};
var replyDataA = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(messageA)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", replyDataA);
}
}
}
ss.getRange("D1").setValue(0);
ss.getRange("E").clearContent();
}
function stopMessage(e,i){
var ss = SpreadsheetApp.openById("スプレッドシートid");
var userName = ss.getRange("I"+i).getValue();
var stopMessage = {
"replyToken" : e.replyToken,
"messages" : [
{
"type" : "text",
"text" : userName + "さん、連打しないでください!!"
}
]
};
var stopReplyData = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(stopMessage)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", stopReplyData);
}
function endMessage(e) {
var endMessage = {
"type": "template",
"altText": "this is a confirm template",
"template": {
"type": "confirm",
"text": "ワードウルフを終了しますか?",
"actions": [
{
"type":"postback",
"label":"Yes",
"data":"end",
"text":"はい、終了します"
},
{
"type": "message",
"label": "続けます",
"text": "続けます"
}
]
}
}
var endPostData = {
"replyToken" : e.replyToken,
"messages" : [endMessage]
}
var endOptions = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(endPostData)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", endOptions);
}
function VoteMessage(e){
var VoteMessage = {
"replyToken" : e.replyToken,
"messages" : [
{
"type" : "text",
"text" : "多数派の方へ:少数派は誰ですか?"
}
]
};
var VoteMessageData = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(VoteMessage)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", VoteMessageData);
}
function Vote(e,count){
var ss = SpreadsheetApp.openById("スプレッドシートid")
var columns = [];
for(var i=1;i<=count;i++){
columns.push({
"thumbnailImageUrl": ss.getRange("K"+i).getValue(),
"title": ss.getRange("I"+i).getValue(),
"text": "",
"actions": [{"type": "postback",
"label": "少数派だと疑う",
"data": "投票データ"+i,
"text": "投票しました。"}]
});
}
var vote = {
"type": "template",
"template": {
"type" : "carousel",
"columns": columns
},
"altText": "代替テキスト"
}
var voteData = {
"replyToken" : e.replyToken,
"messages" : [vote]
}
var voteOptions = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(voteData)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", voteOptions);
}
function tasuhaWinMessage(e){
var tasuhaWinMessage = {
"replyToken" : e.replyToken,
"messages" : [
{
"type" : "text",
"text" : "おめでとうございます!\n多数派の勝利です。"
}
]
};
var tasuhaWinData = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(tasuhaWinMessage)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", tasuhaWinData);
}
function syosuhaWinMessage(e){
var syosuhaWinMessage = {
"replyToken" : e.replyToken,
"messages" : [
{
"type" : "text",
"text" : "おめでとうございます!\n少数派の勝利です。"
}
]
};
var syosuhaWinData = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(syosuhaWinMessage)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", syosuhaWinData);
}
function resultMessage(e,count){
var ss = SpreadsheetApp.openById("スプレッドシートid")
var tasuha = []
var syosuha = []
for(var i=0;i<=count;i++){
if(ss.getRange("J"+i).getValue == "tasuha"){
tasuha.push(ss.getRange("I"+i).getValue);
} else if(ss.getRange("J"+i).getValue == "syosuha"){
syosuha.push(ss.getRange("I"+i).getValue);
}
}
var resultMessage = {
"replyToken" : e.replyToken,
"messages" : [
{
"type" : "text",
"text" : "結果: \n☆多数派\n" +tasuha+ "\n☆少数派\n" + syosuha
}
]
};
var resultData = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(resultMessage)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", resultData);
}
function GoodbyeMessage(e) {
var byeMessage = {
"replyToken" : e.replyToken,
"messages" : [
{
"type" : "text",
"text" : "そうですか・・・>< また呼んでくださいね!"
}
]
};
var byeData = {
"method" : "post",
"headers" : {
"Content-Type" : "application/json",
"Authorization" : "Bearer " + channel_access_token
},
"payload" : JSON.stringify(byeMessage)
};
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", byeData);
}