質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

解決済

3回答

433閲覧

GASによるslack内のファイル削除bot

keikostar

総合スコア13

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

1クリップ

投稿2018/05/18 06:44

編集2018/05/18 08:16

下記の記事を参考に作成しております。
https://qiita.com/yoccan/items/46b2a068807d79b59a61

すでにしたこと
・TOKENは設定してあります
・タイマー機能で動くように設定しています

問題点
・実行をすると以下のようなエラーが表示されます。
[18-05-18 15:40:23:952 JST] 実行に失敗: TypeError: undefined のメソッド「some」を呼び出せません。(行 101、ファイル「コード」)

どのように対処したらいいのかご教授いただけると幸いです。

/* 引数 */ var days = 1; // 日以上経過したら削除 var ignoreType = "images"; // 削除対象にしないファイル形式 var targetChannels = ['stress-control']// 対象にしたいチャンネル /* 削除処理 */ 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.SLACK_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');// slackで発行したTOKENをGASの環境変数に設定 /* soundTricker/SlackApp を使うよりurlからAPI叩いたほうが早いらしいので */ SlackDelFileApp.execute = function(method, params){ if (params === undefined ) params = {'token' : SlackDelFileApp.SLACK_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.SLACK_ACCESS_TOKEN, 'channel': channelName, 'username' : 'shark', //投稿するbotの名前 'text' : deleteFiles.files.length == 0 ? nullMsg : listMsg //投稿するメッセージ } return this.execute('chat.postMessage', params); } /* ファイルの削除*/ SlackDelFileApp.deleteFile = function(id){ var params = { 'token': SlackDelFileApp.SLACK_ACCESS_TOKEN, 'file' : id // delete対象はidで指定 } return this.execute('files.delete', params); } /* ファイルのリスト取得 */ // unused SlackDelFileApp.getFilesList = function(params){ params.token = SlackDelFileApp.SLACK_ACCESS_TOKEN; return this.execute('files.list', params); } /* チャネル名(グループ名)からidを取得 */ SlackDelFileApp.getId = function(name, type) { // 公開->channel 非公開->group という扱いらしいのでどちらにも対応 if(type === undefined) type = 'channels'; var channelsList if(type === 'channels'){ channelsList = this.execute('channels.list').channels; }else if(type ==='groups'){ channelsList = this.execute('groups.list').groups; } var channelId = ''; channelsList.some(function(channels){ if (channels.name.match(name)){ channelId = channels.id; return true; } }); return channelId; } /* 日付 -> 秒変換 -> 日時*/ 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.SLACK_ACCESS_TOKEN, 'count' : count, 'ts_to' : SlackDelFileApp.elapsedDaysToUnixTime(days), 'channel' : channelId, } var allFiles = this.execute('files.list', params); // まず、全てのファイルを取ってくる 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; } allFiles.files = getDiffs(allFiles.files, ignoreFiles.files) // 指定したタイプ以外のファイルを取得 return allFiles; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

コメントでいただいた方法を試しました。

投稿2018/05/23 08:14

keikostar

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

引用元著者および質問者の意図を汲むと、エラーは「チャンネルリストが取得できていない」です。

このメッセージから推測できるエラーの最大要因は「適切な権限を持ったトークンが適切な場所に設定されていない」です。("TOKENは設定してあります"と書いてあるのを読んで言っています)

これでは回答になっていないとお感じになられると思うので、仮に「トークンが正しい」と仮定した場合の対処方法を記載します。

まず
https://api.slack.com/methods/channels.list/test
から、generalのチャンネルidを見付けてください(別にgeneralでなくてもいいですが、変えるほど動かなくなる可能性が高まります)。

"id": "ALPHABET9文字", "name": "general",

そして、↓の部分を

javascript

1/* チャネル名(グループ名)からidを取得 */ 2SlackDelFileApp.getId = function(name, type) { // 公開->channel 非公開->group という扱いらしいのでどちらにも対応 3 if(type === undefined) type = 'channels'; 4 5 var channelsList 6 if(type === 'channels'){ 7 channelsList = this.execute('channels.list').channels; 8 }else if(type ==='groups'){ 9 channelsList = this.execute('groups.list').groups; 10 } 11 var channelId = ''; 12 channelsList.some(function(channels){ 13 if (channels.name.match(name)){ 14 channelId = channels.id; 15 return true; 16 } 17 }); 18 return channelId; 19}

↓のように書き変えてください(ALPHABET9文字と書いているところに本当に探しあてたidを入れてください。

javascript

1/* チャネル名(グループ名)からidを取得 */ 2SlackDelFileApp.getId = function(name, type) { 3 return "ALPHABET9文字"; 4}

こうすることで、

  1. someのエラーは必ず消える
  2. トークンが正しければ、generalのチャンネルでは動く

ことが確認できると思います。
繰り返しにはなりますが、トークンが正しくなければgeneral(idに対応したチャンネルどこでも)でさえも動作しません。

--補足
もし、generalにだけにでも投稿できれば
0. generalもしくはどこかのチャンネルに固定なら操作が可能である
0. チャンネルが変動しなければ、配列などによって(つまりslackに左右されずに)チャンネルを切り替える動作がjavascriptのみで(究極的にはコピペでも)実現できる
という意味でのご提案となります。

投稿2018/05/21 12:20

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keikostar

2018/05/23 08:13

分かりやすいアドバイスをくださりどうもありがとうございました。ぶじ動かすことができました。
guest

0

some メソッドが呼び出せない(存在しない)といってるので、スペルミスしてないか、そもそもそういうメソッドを持っているのか、ってとこらへんをチェックしてみることですね

投稿2018/05/20 07:21

y_waiwai

総合スコア87715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keikostar

2018/05/20 21:45

ご回答どうもありがとうございます。元記事のをそのまま使っているので、どのように修正すればよいものかと思っていました。定義されてない以上、作者さんのみぞ知るということになってしまうのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問