LoginSignup
35
38

More than 5 years have passed since last update.

【GAS】Slackから特定のチャンネル内の投稿内容をすべて取得してスプレッドシートに取り込む

Last updated at Posted at 2016-10-05

 下のスクリーンショットのようにセルB1にチャンネル名を入力しておき、スクリプトを動かすと、セルA3からずらずらっとメッセージなどの情報が出てきます。

スクリーンショット 2016-10-05 14.50.51.png

 APIにはチャンネル名ではなく、チャンネルIDを渡さなければならず、最初面食らいました。よってまずチャンネルIDとチャンネル名の一覧を取得し、そこからチャンネルIDを探してという流れになります。

 また、返ってくるJSONデータも投稿内容によっていろいろな項目があってそのすべては把握できていません。なのでその辺は割りとテキトーなことになっていますし、その意味ではタイトルは「すべて」取得と書いていますが厳密にはすべてではありません。
 
 詳細は省きますがトークンはリンク先から取得できたと思います。
 https://api.slack.com/web

コード.gs
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();

function getSlack() {

  // チャンネルリストを取得
  var token = "取得したトークン";
  var url = "https://slack.com/api/channels.list?token="+token+"";
  var response = UrlFetchApp.fetch(url);
  var json = response.getContentText();
  var data = JSON.parse(json);

  // 対象となるチャンネル名から対応するチャンネルIDを探し出す
  var channel_name = sh.getRange(1,2).getValue();
  for (var i=0; i<data.channels.length; i++) {
    if (data.channels[i].name == channel_name) {
      var channel_id = data.channels[i].id;
      break;
    }
  }

  // 取得したチャンネルIDをもとにチャンネル内のすべてのメッセージを取得
  var url = "https://slack.com/api/channels.history?token="+token+"&channel="+channel_id+"";
  var response = UrlFetchApp.fetch(url);
  var json = response.getContentText();
  var data = JSON.parse(json);

  // スプレッドシートに取り込む

  // 最終行取得
  var lr = sh.getLastRow();
  // 初期化
  if (lr > 2) sh.getRange(3,1,lr-2,sh.getLastColumn()).clear();
  // 出てきそうな項目名を予め列挙しておく(この辺は必要に応じて加減すればよいでしょう)
  var item = [
    "file",
    "text",
    "type",
    "user",
    "ts"
  ];
  // 2次元配列化
  var ary = [];
  var ary2 = [];
  for (var i=0; i<data.messages.length; i++) {
    for (var j=0; j<item.length; j++) {
      ary.push(data.messages[i][item[j]]);
      // もしundefinedなら空欄に直す
      if (!ary[j]) {
        ary[j] = "";
      }
    }
    ary2.push(ary);
    ary = [];
  }
  // スプレッドシートに転記
  sh.getRange(3,1,ary2.length,item.length).setValues(ary2);
}

 実際の運用ではチャンネル名とIDやユーザー名とIDなどは別シートに予めリスト化しておき、そこから拾うような感じになるでしょうか。また、応用すれば更新されたデータのみを毎日自動でチェックとかもできるでしょう。

35
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
38