LoginSignup
0
1

More than 1 year has passed since last update.

GASを利用してSlackから取得したメッセージをスプレッドシートに書き出す方法

Last updated at Posted at 2023-01-08

はじめに

業務でSlackに吐き出しているログからエラーログだけ抽出したいなと思って作成しました。
アプリからSlackに向けてログを出力している前提になりますが、全件取得から検索などにも使えるので参考程度にぜひ。

目次

  1. Slack用App作成
  2. Slackから特定のメッセージを取得

Slack用App作成

  • SlackAPI(こちらのサイトでCreate an APPをクリック)
    APPの作成方法は通常と変わらないので今回は省略します。
    スコープは以下の通りに設定してください。(これをしないと動きません。)
    スクリーンショット 2023-01-09 0.38.37.png

  • スコープの設定が必要な理由
    今回はconversations.historyというSlackのAPIを使用します。公式で、スコープの指定(Required scopes)が載っているので、こちらを全て追加する必要があります。多い分には問題ないですし、後でスコープの追加・削除が可能です。
    スクリーンショット 2023-01-09 0.45.00.png

Slackから特定のメッセージを取得

以下、参考スクリプトです。
※SlackのチャンネルIDと作成したAPPのトークンが必要になります。

SlackMessage.gs
function Run() {

  let channel_id = '{SlackのチャンネルID}';  
  let oldest = getUnixTime("2022/04/01 00:00:00"); // 取得開始日時
  let latest = getUnixTime("2022/05/01 23:59:59"); // 取得終了日時
  let limit = 1000; // 公式サイトによると最大1000件までの取得らしい
  let url = 'https://slack.com/api/conversations.history' +
            '?channel=' + channel_id +
            '&latest=' + latest +
            '&oldest=' + oldest +
            '&limit=' + limit;

  let token = '{作成したAPPのトークン}';
  const options = {
      "headers": { 'Authorization': 'Bearer ' + token }
  };
  
  let response = UrlFetchApp.fetch(url,options);
  let data = JSON.parse(response);
  let messages = data.messages.reverse();

  // スプレッドシートの情報取得
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheets()[0];
  let lastrow = sheet.getLastRow(); // 最終行取得

  // メッセージをシートに書き込む
  let line = 0;
  for ( let i = 0; i < messages.length; i++ ) {
  
    if (messages[i].text.match('error')) { // errorという文字がつくものを取得している
      sheet.getRange(lastrow + line + 1, 1).setValue(convertTimestamp(messages[i].ts)); // 日付
      sheet.getRange(lastrow + line + 1, 2).setValue(messages[i].text); // テキスト
      line += 1;
    }
  }
}

function getUnixTime(dateTime) {
  let date = new Date(dateTime);
  let milsec = date.getTime();
  let sec = milsec / 1000;
  let time = sec.toString();
  return time;
}

function convertTimestamp(timestamp) {
    let date_format = function(num) {
        return ( num < 10 ) ? '0' + num  : num;
    };
    let d = new Date(timestamp * 1000);
    let date = d.getFullYear() + '/';
    date += date_format( d.getMonth() + 1 ) + '/';
    date += date_format( d.getDate() ) + ' ';
    date += date_format( d.getHours() ) + ':' + date_format( d.getMinutes() );

    return date;
}

最後に

GASを初めて触ったので、今後も改良していきたいと思います。
丸1日勉強して頑張って作成しました。
conversations.historyは汎用性が高いので便利ですが、今思えばsearch.messagesとかでやったほうが楽だったかもしれません。

0
1
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
0
1