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

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

ただいまの
回答率

90.50%

  • JavaScript

    16454questions

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

  • Google Apps Script

    847questions

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

  • Slack

    179questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 662

keikostar

score 1

下記の記事を参考に作成しております。
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;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

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

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

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

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

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


そして、↓の部分を

/* チャネル名(グループ名)から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;
}


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

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

こうすることで、

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

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

--補足
もし、generalにだけにでも投稿できれば

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/23 17:13

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/21 06:45

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16454questions

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

  • Google Apps Script

    847questions

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

  • Slack

    179questions

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