前提・実現したいこと
素人ですが、GASでslack用に自動のログ・ファイル削除botを作りたく、奮闘しております。
http://lyncs.hateblo.jp/entry/2017/06/04/191421
https://qiita.com/yoccan/items/46b2a068807d79b59a61
https://teratail.com/questions/126798
上記を参照して過去の質問ベースでコピペし作ったのですが、下記のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
~~ undefined のメソッド「forEach」を呼び出せません。(行 120、ファイル「osouji1」)~~
⇒【listAll.forEach(function(a){】の部分を指摘されています。
おかげさまで解決いたしました。
また別件にて問題が上がっており、下記ご参照頂けますようお願いいたします。
該当のソースコード
/* 引数 */ var BOT_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("BOT_ACCESS_TOKEN"); var SLACK_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("SLACK_ACCESS_TOKEN"); var OAuth_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("OAuth_ACCESS_TOKEN"); var LEGACY_TOKEN = PropertiesService.getScriptProperties().getProperty("LEGACY_TOKEN"); var days = 1; // 日以上経過したら削除 var ignoreType = "images,pdfs"; // 削除対象にしないファイル形式 var targetChannels = ['osouji2nd']// 対象にしたいチャンネル /* 削除処理 */ function deleteOldFile(){ targetChannels.forEach(function(channelName){ var channelId = SlackDelFileApp.getId(channelName, 'channels') || SlackDelFileApp.getId(channelName, 'groups'); if(channelId === ''){ Logger.log('Not found "' + channelName + '". Skip'); return -1; // チャンネルが無ければ終了 } Logger.log('Found "' + channelName + '"(id => "' + channelId + '")'); var deleteFiles = SlackDelFileApp.getFileListWithOutOption(channelId, days, ignoreType); // 削除対象を取得 deleteFiles.files.forEach(function(file){ // 削除 var data = SlackDelFileApp.deleteFile(file.id); if (data.error){ Logger.log(' Failed to delete file ' + file.name + ' Error: ' + data.error); } else { Logger.log(' Deleted file "' + file.name + '"(id => "' + file.id + '")'); } }); }); } /* メッセージ送信 */ function postDeleteFileMessage(channelId, botName, message){ targetChannels.forEach(function(channelName){ Logger.log(SlackDelFileApp.postConfirm(channelName, days, ignoreType)); }); } /* スコープを与える */ var SlackDelFileApp = {} /* SLACKのTOKENを読み込み */ SlackDelFileApp.OAuth_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('OAuth_ACCESS_TOKEN');// slackで発行したTOKENをGASの環境変数に設定 /* soundTricker/SlackApp を使うよりurlからAPI叩いたほうが早いらしいので */ SlackDelFileApp.execute = function(method, params){ if (params === undefined ) params = {'token' : SlackDelFileApp.OAuth_ACCESS_TOKEN}; var options = { 'method': 'POST', 'payload': params } var res = UrlFetchApp.fetch('https://slack.com/api/' + method, options); return JSON.parse(res.getContentText()); } /* 翌日の削除対象ファイルの確認 */ SlackDelFileApp.postConfirm = function(channelName, days, ignoreType){ var channelId = SlackDelFileApp.getId(channelName, 'channels') || SlackDelFileApp.getId(channelName, 'groups'); var deleteFiles = this.getFileListWithOutOption(channelId, days + 1, ignoreType); // 翌日の削除対象を取得 var nullMsg = '明日の削除対象ファイルはないみた~い(「・ω・)「'; var listMsg = '明日の削除対象ファイルは以下の通りで~す(「・ω・)「 ' + deleteFiles.files.length + ' 件のファイルだよ~????'; deleteFiles.files.forEach(function(f){ listMsg += "\n\t・" + f.name ; }); var params = { 'token': SlackDelFileApp.OAuth_ACCESS_TOKEN, 'channel': channelName, 'username' : 'OMURA', //投稿するbotの名前 'text' : deleteFiles.files.length == 0 ? nullMsg : listMsg //投稿するメッセージ } return this.execute('chat.postMessage', params); } /* ファイルの削除*/ SlackDelFileApp.deleteFile = function(id){ var params = { 'token': SlackDelFileApp.OAuth_ACCESS_TOKEN, 'file' : id // delete対象はidで指定 } return this.execute('files.delete', params); } /* ファイルのリスト取得 */ // unused SlackDelFileApp.getFilesList = function(params){ params.token = SlackDelFileApp.OAuth_ACCESS_TOKEN; return this.execute('files.list', params); } /* チャネル名(グループ名)からidを取得 */ SlackDelFileApp.getId = function(name, type) { return "GBH2C79N0"; } /* 日付 -> 秒変換 -> 日時*/ SlackDelFileApp.elapsedDaysToUnixTime = function(days){ var date = new Date(); var now = Math.floor(date.getTime()/ 1000); // unixtime[sec] return now - 8.64e4 * days + '' // 8.64e4[sec] = 1[day] 文字列じゃないと動かないので型変換している } /* 指定したタイプ以外のファイルを削除 */ SlackDelFileApp.getFileListWithOutOption = function(channelId, days, ignoreType, count){ if(count === undefined) count = 1000; var params = { 'token' : SlackDelFileApp.OAuth_ACCESS_TOKEN, 'count' : count, 'ts_to' : SlackDelFileApp.elapsedDaysToUnixTime(days), 'channel' : channelId, } var allFiles = this.execute('files.list', params); // まず、全てのファイルを取ってくる Logger.log(allFiles) params.types = ignoreType; // typeを指定 var ignoreFiles = this.execute('files.list', params); // 指定した形式のファイルを取ってくる var getDiffs = function(listAll,listIgnore){ var diffs = []; listAll.forEach(function(a){ var exist = false; listIgnore.forEach(function(i){ if (a.id === i.id) exist = true; }); if ( !exist ) diffs.push(a); }); return diffs; } Logger.log(allFiles) allFiles.files = getDiffs(allFiles.files, ignoreFiles.files) // 指定したタイプ以外のファイルを取得 return allFiles; }
試したこと
if、forEachに関して調べてみたのですが、そもそもjavasctiptを触るのも今回が初めてで殆ど理解できていない状況です。
途中に出てくる(a)や(i)が何を指しているのかもわからず…。
丸投げで申し訳ございませんが、何卒よろしくお願いいたします。
⇒LEGACY TOKENを入れてみたり、TOKENの権限を増やしてみたりしましたが上手くいかず、難航しておりましたが、
「OAuth_ACCESS_TOKEN」を入れることで当初のエラーは無くなりました。
アドバイス頂きありがとうございました。
(※引数にある各TOKENの違いはよくわからないまま、とりあえずすぐに引っ張って来られるように書いて有ります…。)
しかし、チャンネル内の削除対象がうまく削除されません…。
(この場合は画像・pdfを残しメッセージを削除したい)
[18-07-03 21:06:07:505 PDT] {files=[], paging={total=0, pages=0, count=1000, page=1}, ok=true}
[18-07-03 21:06:07:633 PDT] {files=[], paging={total=0, pages=0, count=1000, page=1}, ok=true}
[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}
ログには上記のように出ております。
細かい入力項目を確認したり、各ソースコードの意味と役割を調べたりもしているのですが、なまじエラーが出ていない分どこが間違っているのか判別がつかない状況です。
重ね重ね恐縮ですが、お知恵を貸して頂けますと幸いです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー