質問編集履歴

3

ソースコードを最新のものに変更/課題の内容が変わったため追記・補足

2018/07/04 04:23

投稿

TOMOMI33
TOMOMI33

スコア9

test CHANGED
File without changes
test CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
 
4
4
 
5
+
6
+
5
7
  素人ですが、GASでslack用に自動のログ・ファイル削除botを作りたく、奮闘しております。
6
8
 
7
9
 
@@ -24,11 +26,17 @@
24
26
 
25
27
 
26
28
 
27
- ~~ undefined のメソッド「forEach」を呼び出せません。(行 120、ファイル「osouji1」)
29
+ ~~ undefined のメソッド「forEach」を呼び出せません。(行 120、ファイル「osouji1」)~~
28
-
29
-
30
-
30
+
31
+
32
+
31
- ⇒【listAll.forEach(function(a){】の部分を指摘されています。~~
33
+ ~~⇒【listAll.forEach(function(a){】の部分を指摘されています。~~
34
+
35
+
36
+
37
+ **おかげさまで解決いたしました。**
38
+
39
+ **また別件にて問題が上がっており、下記ご参照頂けますようお願いいたします。**
32
40
 
33
41
 
34
42
 
@@ -316,13 +324,13 @@
316
324
 
317
325
 
318
326
 
319
- ~~if、forEachに関して調べてみたのですが、そもそもjavasctiptを触るのも今回が初めてで殆ど理解できていない状況です。
327
+ ~~if、forEachに関して調べてみたのですが、そもそもjavasctiptを触るのも今回が初めてで殆ど理解できていない状況です。~~
320
-
328
+
321
- 途中に出てくる(a)や(i)が何を指しているのかもわからず…。
329
+ ~~途中に出てくる(a)や(i)が何を指しているのかもわからず…。~~
322
-
323
-
324
-
330
+
331
+
332
+
325
- 丸投げで申し訳ございませんが、何卒よろしくお願いいたします。~~
333
+ ~~丸投げで申し訳ございませんが、何卒よろしくお願いいたします。~~
326
334
 
327
335
 
328
336
 

2

ソースコードを最新のものに変更/課題の内容が変わったため追記・補足

2018/07/04 04:23

投稿

TOMOMI33
TOMOMI33

スコア9

test CHANGED
File without changes
test CHANGED
@@ -24,11 +24,13 @@
24
24
 
25
25
 
26
26
 
27
- undefined のメソッド「forEach」を呼び出せません。(行 120、ファイル「osouji1」)
27
+ ~~ undefined のメソッド「forEach」を呼び出せません。(行 120、ファイル「osouji1」)
28
-
29
-
30
-
28
+
29
+
30
+
31
- ⇒【listAll.forEach(function(a){】の部分を指摘されています。
31
+ ⇒【listAll.forEach(function(a){】の部分を指摘されています。~~
32
+
33
+
32
34
 
33
35
 
34
36
 
@@ -36,12 +38,18 @@
36
38
 
37
39
 
38
40
 
41
+ ```
42
+
39
43
  /* 引数 */
40
44
 
41
45
  var BOT_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("BOT_ACCESS_TOKEN");
42
46
 
43
47
  var SLACK_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("SLACK_ACCESS_TOKEN");
44
48
 
49
+ var OAuth_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("OAuth_ACCESS_TOKEN");
50
+
51
+ var LEGACY_TOKEN = PropertiesService.getScriptProperties().getProperty("LEGACY_TOKEN");
52
+
45
53
  var days = 1; // 日以上経過したら削除
46
54
 
47
55
  var ignoreType = "images,pdfs"; // 削除対象にしないファイル形式
@@ -70,7 +78,7 @@
70
78
 
71
79
  Logger.log('Found "' + channelName + '"(id => "' + channelId + '")');
72
80
 
73
-
81
+
74
82
 
75
83
  var deleteFiles = SlackDelFileApp.getFileListWithOutOption(channelId, days, ignoreType); // 削除対象を取得
76
84
 
@@ -122,7 +130,7 @@
122
130
 
123
131
  /* SLACKのTOKENを読み込み */
124
132
 
125
- SlackDelFileApp.SLACK_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');// slackで発行したTOKENをGASの環境変数に設定
133
+ SlackDelFileApp.OAuth_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('OAuth_ACCESS_TOKEN');// slackで発行したTOKENをGASの環境変数に設定
126
134
 
127
135
 
128
136
 
@@ -130,7 +138,7 @@
130
138
 
131
139
  SlackDelFileApp.execute = function(method, params){
132
140
 
133
- if (params === undefined ) params = {'token' : SlackDelFileApp.SLACK_ACCESS_TOKEN};
141
+ if (params === undefined ) params = {'token' : SlackDelFileApp.OAuth_ACCESS_TOKEN};
134
142
 
135
143
  var options = {
136
144
 
@@ -156,11 +164,11 @@
156
164
 
157
165
  var deleteFiles = this.getFileListWithOutOption(channelId, days + 1, ignoreType); // 翌日の削除対象を取得
158
166
 
159
- var nullMsg = '明日の削除対象ファイルはありません';
167
+ var nullMsg = '明日の削除対象ファイルはないみた~い(「・ω・)「';
160
-
168
+
161
- var listMsg = '明日の削除対象ファイルは以下 ' + deleteFiles.files.length + ' 件のファイルです。';
169
+ var listMsg = '明日の削除対象ファイルは以下の通りで~す(「・ω・)「 ' + deleteFiles.files.length + ' 件のファイルだよ~????';
162
-
163
-
170
+
171
+
164
172
 
165
173
  deleteFiles.files.forEach(function(f){
166
174
 
@@ -168,15 +176,15 @@
168
176
 
169
177
  });
170
178
 
171
-
179
+
172
180
 
173
181
  var params = {
174
182
 
175
- 'token': SlackDelFileApp.SLACK_ACCESS_TOKEN,
183
+ 'token': SlackDelFileApp.OAuth_ACCESS_TOKEN,
176
184
 
177
185
  'channel': channelName,
178
186
 
179
- 'username' : 'omura.osouji', //投稿するbotの名前
187
+ 'username' : 'OMURA', //投稿するbotの名前
180
188
 
181
189
  'text' : deleteFiles.files.length == 0 ? nullMsg : listMsg //投稿するメッセージ
182
190
 
@@ -186,7 +194,7 @@
186
194
 
187
195
  }
188
196
 
189
-
197
+
190
198
 
191
199
  /* ファイルの削除*/
192
200
 
@@ -194,7 +202,7 @@
194
202
 
195
203
  var params = {
196
204
 
197
- 'token': SlackDelFileApp.SLACK_ACCESS_TOKEN,
205
+ 'token': SlackDelFileApp.OAuth_ACCESS_TOKEN,
198
206
 
199
207
  'file' : id // delete対象はidで指定
200
208
 
@@ -210,7 +218,7 @@
210
218
 
211
219
  SlackDelFileApp.getFilesList = function(params){
212
220
 
213
- params.token = SlackDelFileApp.SLACK_ACCESS_TOKEN;
221
+ params.token = SlackDelFileApp.OAuth_ACCESS_TOKEN;
214
222
 
215
223
  return this.execute('files.list', params);
216
224
 
@@ -250,7 +258,7 @@
250
258
 
251
259
  var params = {
252
260
 
253
- 'token' : SlackDelFileApp.SLACK_ACCESS_TOKEN,
261
+ 'token' : SlackDelFileApp.OAuth_ACCESS_TOKEN,
254
262
 
255
263
  'count' : count,
256
264
 
@@ -262,7 +270,7 @@
262
270
 
263
271
  var allFiles = this.execute('files.list', params); // まず、全てのファイルを取ってくる
264
272
 
265
-
273
+ Logger.log(allFiles)
266
274
 
267
275
  params.types = ignoreType; // typeを指定
268
276
 
@@ -274,7 +282,7 @@
274
282
 
275
283
  var diffs = [];
276
284
 
277
- ** listAll.forEach(function(a){**
285
+ listAll.forEach(function(a){
278
286
 
279
287
  var exist = false;
280
288
 
@@ -292,7 +300,7 @@
292
300
 
293
301
  }
294
302
 
295
-
303
+ Logger.log(allFiles)
296
304
 
297
305
  allFiles.files = getDiffs(allFiles.files, ignoreFiles.files) // 指定したタイプ以外のファイルを取得
298
306
 
@@ -300,19 +308,55 @@
300
308
 
301
309
  }
302
310
 
311
+ ```
312
+
303
313
 
304
314
 
305
315
  ### 試したこと
306
316
 
307
317
 
308
318
 
309
- if、forEachに関して調べてみたのですが、そもそもjavasctiptを触るのも今回が初めてで殆ど理解できていない状況です。
319
+ ~~if、forEachに関して調べてみたのですが、そもそもjavasctiptを触るのも今回が初めてで殆ど理解できていない状況です。
310
320
 
311
321
  途中に出てくる(a)や(i)が何を指しているのかもわからず…。
312
322
 
313
323
 
314
324
 
315
- 丸投げで申し訳ございませんが、何卒よろしくお願いいたします。
325
+ 丸投げで申し訳ございませんが、何卒よろしくお願いいたします。~~
326
+
327
+
328
+
329
+ ⇒LEGACY TOKENを入れてみたり、TOKENの権限を増やしてみたりしましたが上手くいかず、難航しておりましたが、
330
+
331
+ 「OAuth_ACCESS_TOKEN」を入れることで当初のエラーは無くなりました。
332
+
333
+ アドバイス頂きありがとうございました。
334
+
335
+ (※引数にある各TOKENの違いはよくわからないまま、とりあえずすぐに引っ張って来られるように書いて有ります…。)
336
+
337
+
338
+
339
+  しかし、チャンネル内の削除対象がうまく削除されません…。
340
+
341
+ (この場合は画像・pdfを残しメッセージを削除したい)
342
+
343
+
344
+
345
+ > [18-07-03 21:06:07:505 PDT] {files=[], paging={total=0, pages=0, count=1000, page=1}, ok=true}
346
+
347
+ [18-07-03 21:06:07:633 PDT] {files=[], paging={total=0, pages=0, count=1000, page=1}, ok=true}
348
+
349
+ [18-07-03 21:06:07:729 PDT] {channel=GBH2C79N0, ok=true, message={subtype=bot_message, text=明日の削除対象ファイルはないみた~い(「・ω・)「, type=message, bot_id=BBJCJT7M2, username=OMURA, ts=1530677167.000127}, ts=1530677167.000127}
350
+
351
+
352
+
353
+ ログには上記のように出ております。
354
+
355
+
356
+
357
+ 細かい入力項目を確認したり、各ソースコードの意味と役割を調べたりもしているのですが、なまじエラーが出ていない分どこが間違っているのか判別がつかない状況です。
358
+
359
+ 重ね重ね恐縮ですが、お知恵を貸して頂けますと幸いです。
316
360
 
317
361
 
318
362
 

1

ソースコードを一部→全部に変えました。行120を太字にしてます。

2018/07/04 04:19

投稿

TOMOMI33
TOMOMI33

スコア9

test CHANGED
File without changes
test CHANGED
@@ -28,10 +28,220 @@
28
28
 
29
29
 
30
30
 
31
+ ⇒【listAll.forEach(function(a){】の部分を指摘されています。
32
+
33
+
34
+
31
35
  ### 該当のソースコード
32
36
 
33
37
 
34
38
 
39
+ /* 引数 */
40
+
41
+ var BOT_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("BOT_ACCESS_TOKEN");
42
+
43
+ var SLACK_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("SLACK_ACCESS_TOKEN");
44
+
45
+ var days = 1; // 日以上経過したら削除
46
+
47
+ var ignoreType = "images,pdfs"; // 削除対象にしないファイル形式
48
+
49
+ var targetChannels = ['osouji2nd']// 対象にしたいチャンネル
50
+
51
+
52
+
53
+
54
+
55
+ /* 削除処理 */
56
+
57
+ function deleteOldFile(){
58
+
59
+ targetChannels.forEach(function(channelName){
60
+
61
+ var channelId = SlackDelFileApp.getId(channelName, 'channels') || SlackDelFileApp.getId(channelName, 'groups');
62
+
63
+ if(channelId === ''){
64
+
65
+ Logger.log('Not found "' + channelName + '". Skip');
66
+
67
+ return -1; // チャンネルが無ければ終了
68
+
69
+ }
70
+
71
+ Logger.log('Found "' + channelName + '"(id => "' + channelId + '")');
72
+
73
+
74
+
75
+ var deleteFiles = SlackDelFileApp.getFileListWithOutOption(channelId, days, ignoreType); // 削除対象を取得
76
+
77
+
78
+
79
+ deleteFiles.files.forEach(function(file){ // 削除
80
+
81
+ var data = SlackDelFileApp.deleteFile(file.id);
82
+
83
+ if (data.error){
84
+
85
+ Logger.log(' Failed to delete file ' + file.name + ' Error: ' + data.error);
86
+
87
+ } else {
88
+
89
+ Logger.log(' Deleted file "' + file.name + '"(id => "' + file.id + '")');
90
+
91
+ }
92
+
93
+ });
94
+
95
+ });
96
+
97
+ }
98
+
99
+
100
+
101
+ /* メッセージ送信 */
102
+
103
+ function postDeleteFileMessage(channelId, botName, message){
104
+
105
+
106
+
107
+ targetChannels.forEach(function(channelName){
108
+
109
+ Logger.log(SlackDelFileApp.postConfirm(channelName, days, ignoreType));
110
+
111
+ });
112
+
113
+ }
114
+
115
+
116
+
117
+ /* スコープを与える */
118
+
119
+ var SlackDelFileApp = {}
120
+
121
+
122
+
123
+ /* SLACKのTOKENを読み込み */
124
+
125
+ SlackDelFileApp.SLACK_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');// slackで発行したTOKENをGASの環境変数に設定
126
+
127
+
128
+
129
+ /* soundTricker/SlackApp を使うよりurlからAPI叩いたほうが早いらしいので */
130
+
131
+ SlackDelFileApp.execute = function(method, params){
132
+
133
+ if (params === undefined ) params = {'token' : SlackDelFileApp.SLACK_ACCESS_TOKEN};
134
+
135
+ var options = {
136
+
137
+ 'method': 'POST',
138
+
139
+ 'payload': params
140
+
141
+ }
142
+
143
+ var res = UrlFetchApp.fetch('https://slack.com/api/' + method, options);
144
+
145
+ return JSON.parse(res.getContentText());
146
+
147
+ }
148
+
149
+
150
+
151
+ /* 翌日の削除対象ファイルの確認 */
152
+
153
+ SlackDelFileApp.postConfirm = function(channelName, days, ignoreType){
154
+
155
+ var channelId = SlackDelFileApp.getId(channelName, 'channels') || SlackDelFileApp.getId(channelName, 'groups');
156
+
157
+ var deleteFiles = this.getFileListWithOutOption(channelId, days + 1, ignoreType); // 翌日の削除対象を取得
158
+
159
+ var nullMsg = '明日の削除対象ファイルはありません';
160
+
161
+ var listMsg = '明日の削除対象ファイルは以下 ' + deleteFiles.files.length + ' 件のファイルです。';
162
+
163
+
164
+
165
+ deleteFiles.files.forEach(function(f){
166
+
167
+ listMsg += "\n\t・" + f.name ;
168
+
169
+ });
170
+
171
+
172
+
173
+ var params = {
174
+
175
+ 'token': SlackDelFileApp.SLACK_ACCESS_TOKEN,
176
+
177
+ 'channel': channelName,
178
+
179
+ 'username' : 'omura.osouji', //投稿するbotの名前
180
+
181
+ 'text' : deleteFiles.files.length == 0 ? nullMsg : listMsg //投稿するメッセージ
182
+
183
+ }
184
+
185
+ return this.execute('chat.postMessage', params);
186
+
187
+ }
188
+
189
+
190
+
191
+ /* ファイルの削除*/
192
+
193
+ SlackDelFileApp.deleteFile = function(id){
194
+
195
+ var params = {
196
+
197
+ 'token': SlackDelFileApp.SLACK_ACCESS_TOKEN,
198
+
199
+ 'file' : id // delete対象はidで指定
200
+
201
+ }
202
+
203
+ return this.execute('files.delete', params);
204
+
205
+ }
206
+
207
+
208
+
209
+ /* ファイルのリスト取得 */ // unused
210
+
211
+ SlackDelFileApp.getFilesList = function(params){
212
+
213
+ params.token = SlackDelFileApp.SLACK_ACCESS_TOKEN;
214
+
215
+ return this.execute('files.list', params);
216
+
217
+ }
218
+
219
+
220
+
221
+ /* チャネル名(グループ名)からidを取得 */
222
+
223
+ SlackDelFileApp.getId = function(name, type) {
224
+
225
+ return "GBH2C79N0";
226
+
227
+ }
228
+
229
+
230
+
231
+ /* 日付 -> 秒変換 -> 日時*/
232
+
233
+ SlackDelFileApp.elapsedDaysToUnixTime = function(days){
234
+
235
+ var date = new Date();
236
+
237
+ var now = Math.floor(date.getTime()/ 1000); // unixtime[sec]
238
+
239
+ return now - 8.64e4 * days + '' // 8.64e4[sec] = 1[day] 文字列じゃないと動かないので型変換している
240
+
241
+ }
242
+
243
+
244
+
35
245
  /* 指定したタイプ以外のファイルを削除 */
36
246
 
37
247
  SlackDelFileApp.getFileListWithOutOption = function(channelId, days, ignoreType, count){
@@ -64,7 +274,7 @@
64
274
 
65
275
  var diffs = [];
66
276
 
67
- listAll.forEach(function(a){
277
+ ** listAll.forEach(function(a){**
68
278
 
69
279
  var exist = false;
70
280