-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.gs
186 lines (167 loc) · 5.84 KB
/
main.gs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
// 初期設定
const scriptProperties = PropertiesService.getScriptProperties();
const SPREAD = SpreadsheetApp.getActiveSpreadsheet();
const SHEET = SPREAD.getSheets()[0];
// 誕生年があるものとないもの
const dateExp = /1?\d\/[123]?\d/;
const dateExpYear = /[19|20]\d{2}\/1?\d\/[123]?\d/;
//doPost関数(Lineからメッセージを受け取る)
function doPost(e) {
//メッセージ受信
const data = JSON.parse(e.postData.contents).events[0];
//ユーザーID取得
const lineUserId = data.source.userId;
//リプレイトークン取得
const replyToken= data.replyToken;
//送信されたメッセージ取得
const postMsg = data.message.text;
// リプライトークンが無かったら処理を止める
if(typeof replyToken === 'undefined') {
return;
}
// キャッシュを設定
const cache = CacheService.getScriptCache();
let type = cache.get("type");
// 処理を分ける
if(type === null) {
if(postMsg === '誕生日の追加') {
cache.put('type', 1);
reply(replyToken, '追加する人の名前を入力してください');
} else if(postMsg === '誕生日の削除'){
cache.put('type', 3);
reply(replyToken, '削除する人の名前を入力してください')
} else if(postMsg === '誕生日の一覧'){
reply(replyToken, showBirthdaysList());
} else {
reply(replyToken, '「誕生日の追加」、「誕生日の削除」、「誕生日の一覧」のいずれかを入力してください');
}
} else {
// 処理途中で追加のキャンセル
if(postMsg === 'キャンセル') {
cache.remove('type');
reply(replyToken, '誕生日の追加をキャンセルしました');
return;
}
switch(type) {
// 誕生日の追加処理
case '1':
cache.put('type', 2);
cache.put('name', postMsg);
reply(replyToken, '追加する誕生日を「1996/12/20」の形式で入力してください \n 誕生年は無くても構いません');
break;
case '2':
if(postMsg.match(dateExp || dateExpYear)) {
cache.put('date', postMsg);
addBirthday(cache.get('name'), cache.get('date'), lineUserId);
reply(replyToken, `${cache.get('name')}さんの誕生日を${cache.get('date')}で登録しました`);
cache.remove('type');
cache.remove('name');
cache.remove('date');
break;
} else {
reply(replyToken, '正しく入力してください。「キャンセル」で処理を中止します');
break;
}
// 誕生日の削除処理
case '3':
if(checkName(postMsg) !== -1) {
deleteBirthday(checkName(postMsg));
reply(replyToken, `${postMsg}さんの誕生日を削除しました`);
cache.remove('type');
break;
} else {
reply(replyToken, `${postMsg}さんの誕生はありませんでした`);
cache.remove('type');
break;
}
}
}
}
// 誕生日の追加
function addBirthday(name, date, lineUserId) {
const sheet = SpreadsheetApp.openById(scriptProperties.getProperty("SHEET_ID")).getSheetByName(scriptProperties.getProperty("SHEET_NAME"));
const splitedDate = date.split('/');
let year, month, day;
if(splitedDate.length === 3) {
year = splitedDate[0];
month = splitedDate[1];
day = splitedDate[2];
sheet.appendRow([
name,
year,
month,
day,
lineUserId
]);
} else {
year = '';
month = splitedDate[0];
day = splitedDate[1];
sheet.appendRow([
name,
year,
month,
day,
lineUserId
]);
}
};
// 誕生日の検索
function checkName(name) {
const sheet = SpreadsheetApp.openById(scriptProperties.getProperty("SHEET_ID")).getSheetByName(scriptProperties.getProperty("SHEET_NAME"));
const values = sheet.getDataRange().getValues();
const nameList = [];
// 初期値に-1を入れておく、-1がそのまま返ってきたら該当するユーザーはいなかったということ
let nameIndex = -1;
// nameListに全ての名前を入れていく
for(let i = 0; i < values.length; i++) {
nameList.push(values[i][0]);
}
// 一つずつnameとマッチするか確かめていく
nameList.forEach((e, i )=> {
if(e == name) {
nameIndex = i;
return;
}
return;
});
return nameIndex;
}
// 誕生日の削除
function deleteBirthday(rowNumber) {
const sheet = SpreadsheetApp.openById(scriptProperties.getProperty("SHEET_ID")).getSheetByName(scriptProperties.getProperty("SHEET_NAME"));
sheet.deleteRows(rowNumber + 1);
}
// 誕生日の一覧
function showBirthdaysList() {
const sheet = SpreadsheetApp.openById(scriptProperties.getProperty("SHEET_ID")).getSheetByName(scriptProperties.getProperty("SHEET_NAME"));
const values = sheet.getDataRange().getValues();
const ranges = sheet.getRange(2, 1, values.length - 1, 4).getValues();
// 返信用のフォーマットに変換する
const dataList = ranges.reduce((list, item) => {
if(item[1] === '') {
return `${list}\n${item[0]} : ${item[2]}月${item[3]}日`;
} else {
return `${list}\n${item[0]} : ${item[1]}年${item[2]}月${item[3]}日`;
}
}, '名前 : 誕生日');
return dataList;
}
// 返信機能
function reply(replyToken, message) {
UrlFetchApp.fetch(scriptProperties.getProperty("URL"), {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + scriptProperties.getProperty("CHANNEL_ACCESS_TOKEN"),
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{
'type': 'text',
'text': message,
}],
}),
});
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}