回答編集履歴

2

2021/11/02 04:17

投稿

退会済みユーザー
test CHANGED
@@ -1,18 +1,72 @@
1
- リンクを参考にすると下記のようになるでしょうか。
2
-
3
- ```diff
1
+ ```
2
+
3
+ //★★LINE Messaging APIのチャネルアクセストークン★★
4
+
5
+ var LINE_ACCESS_TOKEN = "アクセストークン";
6
+
7
+
8
+
9
+ //★★スプレッドシートID★★
10
+
11
+ var ss = SpreadsheetApp.openById("スプレッドシートID");
12
+
13
+
14
+
15
+ //★★シート名★★
16
+
17
+ var sh = ss.getSheetByName("list");
18
+
19
+
20
+
21
+
22
+
23
+ //LINEからPOSTリクエストを受けたときに起動する
24
+
25
+ //eはJSON文字列
26
+
27
+ function doPost(e){
28
+
29
+ if (typeof e === "undefined"){
30
+
31
+ //動作を終了する
32
+
33
+ return;
34
+
35
+ } else {
36
+
37
+ //JSON文字列をパース(解析)し、変数jsonに格納する
38
+
39
+ var json = JSON.parse(e.postData.contents);
40
+
41
+
42
+
43
+ //変数jsonを関数replyFromSheetに渡し、replyFromSheetを実行する
44
+
45
+ replyFromSheet(json)
46
+
47
+ }
48
+
49
+ }
50
+
51
+
52
+
53
+ //返信用の関数replyFromSheet
54
+
55
+ //dataには変数jsonが代入される
4
56
 
5
57
  function replyFromSheet(data) {
6
58
 
7
- + // POST情報から必要データを抽出
59
+ // POST情報から必要データを抽出
8
-
60
+
9
- + var lineUserId = data.events[0].source.userId;
61
+ var lineUserId = data.events[0].source.userId;
10
-
62
+
11
- + var postMsg = data.events[0].message.text;
63
+ var postMsg = data.events[0].message.text;
64
+
12
-
65
+ var action = data.events[0].message.action;
66
+
13
- + // 記録用に検索語とuserIdを記録
67
+ // 記録用に検索語とuserIdを記録
14
-
68
+
15
- + debug(postMsg, lineUserId);
69
+ debug(postMsg, lineUserId);
16
70
 
17
71
 
18
72
 
@@ -28,54 +82,244 @@
28
82
 
29
83
 
30
84
 
85
+ //シートのA~G列を二次元配列で取得する
86
+
87
+ var wordList = sh.getRange(1,1,lastRow,7).getValues();
88
+
89
+
90
+
91
+ //受信したメッセージ情報を変数に格納する
92
+
93
+ var reply_token = data.events[0].replyToken; //reply token
94
+
95
+ var text = data.events[0].message.text; //ユーザーが送信した語句
96
+
97
+
98
+
99
+ //返信メッセージのタイプを格納するための空配列を宣言する
100
+
101
+ var replyType = [];
102
+
103
+
104
+
105
+ //返信メッセージを格納するための空配列を宣言する
106
+
107
+ var replyList = [];
108
+
109
+
110
+
111
+ //LINEで受信した語句がシートの受信語句と同じ場合、
112
+
113
+ //返信メッセージのタイプをreplyTypeにpushし、
114
+
115
+ //さらにその行のA列~G列をreplyListにpushする
116
+
117
+ for(var i = 1; i < wordList.length; i++) {
118
+
119
+ if(wordList[i][0] == text) {
120
+
121
+ replyType.push(wordList[i][1]);
122
+
123
+ replyList.push(wordList[i]); //ポイント: 一次元配列をpushする
124
+
125
+ }
126
+
127
+ }
128
+
129
+
130
+
131
+ var messageArray = [];
132
+
133
+ //LINEで受信した語句がシートの受信語句と一致しない場合、messageを送信する
134
+
135
+ if (replyType.length < 1) {
136
+
137
+ var message = "質問の答えがありません。ほかの言葉で質問をお願いします。";
138
+
139
+ messageArray.push({
140
+
141
+ type: "text",
142
+
143
+ text: message,
144
+
145
+ });
146
+
147
+ sendMessage(messageArray, reply_token);
148
+
149
+ return;
150
+
151
+
152
+
153
+
154
+
155
+ //replyTypeのLengthが5より大きい場合、messageLengthを5にする
156
+
157
+ //※※一度に最大5つの吹き出ししか返信できないため※※
158
+
159
+ } else if(replyType.length > 5) {
160
+
161
+ var messageLength = 5;
162
+
163
+ } else {
164
+
165
+ var messageLength = replyType.length;
166
+
167
+ }
168
+
169
+
170
+
171
+ //"messages"に渡す配列を格納するための空配列を宣言する
172
+
173
+ var messageArray = [];
174
+
175
+
176
+
177
+ //replyTypeに格納されている返信メッセージのタイプと
178
+
179
+ //replyListに格納されている返信メッセージを最大5つ、
180
+
181
+ //messageArrayにpushする
182
+
183
+ for(var j = 0; j < messageLength; j++) {
184
+
185
+ switch (replyType[j]) {
186
+
187
+ case "text":
188
+
189
+ messageArray.push({"type": replyType[j], "text": replyList[j][2]});
190
+
31
- (以下略)
191
+ break;
192
+
193
+
194
+
195
+ case "sticker":
196
+
197
+ messageArray.push({"type": replyType[j], "packageId": replyList[j][3], "stickerId": replyList[j][4]});
198
+
199
+ break;
200
+
201
+
202
+
203
+ case "image":
204
+
205
+ messageArray.push({"type": replyType[j], "originalContentUrl": replyList[j][5], "previewImageUrl": replyList[j][6]});
206
+
207
+ break;
208
+
209
+
210
+
211
+ case "video":
212
+
213
+ messageArray.push({"type": replyType[j], "originalContentUrl": replyList[j][5], "previewImageUrl": replyList[j][6]});
214
+
215
+ break;
216
+
217
+
218
+
219
+ //replyList[j][2]はJSON.parseを使ってパースする必要がある
220
+
221
+ case "flex":
222
+
223
+ messageArray.push({"type": replyType[j], "altText": "this is a flex message", "contents": JSON.parse(replyList[j][2])});
224
+
225
+ break;
226
+
227
+ }
228
+
229
+ }
230
+
231
+
232
+
233
+ sendMessage(messageArray, reply_token);
234
+
235
+ }
236
+
237
+
238
+
239
+ // メッセージ送信関数
240
+
241
+ // messageArrayは配列
242
+
243
+ function sendMessage(messageArray, reply_token) {
244
+
245
+ var replyUrl = "https://api.line.me/v2/bot/message/reply"; // 追加する
246
+
247
+ var headers = {
248
+
249
+ "Content-Type": "application/json; charset=UTF-8",
250
+
251
+ Authorization: "Bearer " + LINE_ACCESS_TOKEN,
252
+
253
+ };
254
+
255
+
256
+
257
+ var postData = {
258
+
259
+ replyToken: reply_token,
260
+
261
+ messages: messageArray,
262
+
263
+ };
264
+
265
+
266
+
267
+ var options = {
268
+
269
+ method: "post",
270
+
271
+ headers: headers,
272
+
273
+ payload: JSON.stringify(postData),
274
+
275
+ };
276
+
277
+
278
+
279
+ //LINE Messaging APIにデータを送信する
280
+
281
+ UrlFetchApp.fetch(replyUrl, options);
282
+
283
+ }
284
+
285
+
286
+
287
+ /** ユーザーのアカウント名を取得
288
+
289
+ */
290
+
291
+ function getUserDisplayName(userId) {
292
+
293
+ var url = 'https://api.line.me/v2/bot/profile/' + userId;
294
+
295
+ var userProfile = UrlFetchApp.fetch(url,{
296
+
297
+ 'headers': {
298
+
299
+ 'Authorization' : 'Bearer ' + LINE_ACCESS_TOKEN,
300
+
301
+ },
302
+
303
+ })
304
+
305
+ return JSON.parse(userProfile).displayName;
306
+
307
+ }
308
+
309
+
310
+
311
+ // debugシートに値を記載
312
+
313
+ function debug(text, userId) {
314
+
315
+ var sheet = ss.getSheetByName('debug');
316
+
317
+ var date = new Date();
318
+
319
+ var userName = getUserDisplayName(userId);
320
+
321
+ sheet.appendRow([userId, userName, text, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]);
322
+
323
+ }
32
324
 
33
325
  ```
34
-
35
-
36
-
37
- さらに現状のコードに以下を追加
38
-
39
- ```
40
-
41
- /** ユーザーのアカウント名を取得
42
-
43
- */
44
-
45
- function getUserDisplayName(userId) {
46
-
47
- var url = 'https://api.line.me/v2/bot/profile/' + userId;
48
-
49
- var userProfile = UrlFetchApp.fetch(url,{
50
-
51
- 'headers': {
52
-
53
- 'Authorization' : 'Bearer ' + LINE_ACCESS_TOKEN,
54
-
55
- },
56
-
57
- })
58
-
59
- return JSON.parse(userProfile).displayName;
60
-
61
- }
62
-
63
-
64
-
65
- // debugシートに値を記載
66
-
67
- function debug(text, userId) {
68
-
69
- var SHEET_ID = ss;
70
-
71
- var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug');
72
-
73
- var date = new Date();
74
-
75
- var userName = getUserDisplayName(userId);
76
-
77
- sheet.appendRow([userId, userName, text, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]);
78
-
79
- }
80
-
81
- ```

1

2021/11/02 04:16

投稿

退会済みユーザー
test CHANGED
@@ -9,8 +9,6 @@
9
9
  + var lineUserId = data.events[0].source.userId;
10
10
 
11
11
  + var postMsg = data.events[0].message.text;
12
-
13
- + var replyToken = data.events[0].replyToken;
14
12
 
15
13
  + // 記録用に検索語とuserIdを記録
16
14