LoginSignup
59
61

More than 5 years have passed since last update.

Slackのログをスプレッドシートと連携して技術メモの整理に使っている話

Last updated at Posted at 2018-12-01

この記事は Google Apps Script Advent Calendar の1日目です。カレンダー立ち上げたので1日目書きます!

最近、自分の技術メモをSlackとスプレッドシートを使って整理するという試みを始めたので紹介します!

やっていることは、Slackで自分のDMに作業ログを呟いて、1日1回スプレッドシートに保存しているだけです。

やろうと思った動機

作業中に詰まったところや手順をメモしたりするのですが、これをうまいことまとめたいと思ったのがきっかけです。

僕の場合、ちゃんと整理したわかりやすいメモを残そうとすると、そっちに気を取られて作業の進みが遅くなってしまう。
とはいえ、適当に書いてしまうと後から見てもよくわからない!というのが問題としてありました。

良い方法はないかと考えた結果、

  • 作業したときに雑でも良いのでメモをする
  • その場でメモをわかりやすく整理することは諦める
  • 後で時間がある時にwikiなどにまとめる

というやり方が合っていそうな感じがしたので、Slackとスプレッドシートを連携させることを思いつきました。

仕事中は基本的にSlackを立ち上げているし、自分宛のDMを使って簡単なメモを残すとかはたまにやっていたので、気軽にメモを残しやすい。
スプレッドシートは一覧性が高いので後からまとめやすいし、GASを使って定期的にSlackのAPIを叩けます。

で、実際に試してみました。実装自体はすんなりできました。

Slack側の設定

まずはSlackのAPIを叩いてメッセージを取得できるようにします。
トークンの取得が必要です。以下の記事などを参考に。

APIを叩いてメッセージを取得します。DMのメッセージを取得するには、im.history というAPIを使います。

僕は自分宛のDMを使いましたが、自分専用のチャンネルを作るとかも良いと思います。
その場合は、channels.history というAPIを使います。

取得したトークンとチャンネルIDをパラメータに設定してAPIを叩くとこんな感じで返ってきます。

{
    "ok": true,
    "messages": [
        {
            "type": "message",
            "user": "xxxxxxxxxx",
            "text": "xxxxxxxxxxxxxxxxxxxx",
            "client_msg_id": "xxxxxxxxxx",
            "ts": "xxxxxxxxxx"
        },
        {
            "type": "message",
            "user": "xxxxxxxxxx",
            "text": "xxxxxxxxxxxxxxxxxxxx",
            "client_msg_id": "xxxxxxxxxx",
            "ts": "xxxxxxxxxx"
        },
        
    ]
}

チャンネルのIDが全然わからなくて困ったのですが、Webでみた時のURL https://hoge.slack.com/messages/{ID}/ の最後の文字列部分がIDでした。

GASのスクリプト

SlackのメッセージがAPIで取得できたら、GASで取得するだけです。

僕の場合、スプレッドシートには 日付 内容 URL 状態 ってのをあらかじめ作ってます。

日付:Slackに投稿した日付
内容:Slackに書いた本文
URL:Slackの本文中にURLがあった時にタイトルとURL
状態:あとで整理したら処理済にする。

コードはこんな感じ。

// Slackからメッセージ取得
function getSlackLog() {
    var requestUrl = 'https://slack.com/api/im.history?';
    var payload = {
        // Slack Token
        'token': 'xxxxxxxxxx',
        // Channel ID
        'channel': 'xxxxxxxxxx',
        // 25時間分のメッセージ取得
        'oldest': parseInt( new Date() / 1000 ) - (60 * 60 * 25)
    }

    // パラメータの設定
    var param = [];
    for (var key in payload) {
        param.push(key + '=' + payload[key]);
    }
    requestUrl += param.join('&');

    return UrlFetchApp.fetch(requestUrl);
}

// 取得したSlackのメッセージをスプレッドシートに保存
function setSlackLog() {
    // Slackのメッセージを取得して逆順に
    var response = JSON.parse(getSlackLog());
    var messages = response.messages.reverse();

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

    // メッセージをシートに書き込む
    for ( var i = 0; i < messages.length; i++ ){
        // 日付
        sheet.getRange(lastrow + i + 1, 1).setValue(convertTimestamp(messages[i].ts));
        // 内容
        sheet.getRange(lastrow + i + 1, 2).setValue(messages[i].text);
        // リンクがあればリンクURL
        if (messages[i].attachments) {
            sheet.getRange(lastrow + i + 1, 3).setValue(messages[i].attachments[0].title + String.fromCharCode(10) + messages[i].attachments[0].title_link);
        }
    }
}

// UNIXタイムスタンプを変換
function convertTimestamp(timestamp) {
    var date_format = function(num) {
        return ( num < 10 ) ? '0' + num  : num;
    };
    var d = new Date(timestamp * 1000);
    var 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;
}

コードはGithubにもアップしてます。

setSlackLog という関数を、1日1回に定期実行しています。
URLとかは1つしか反映されません。自分用なので手抜きです。

ぼかしますが、実行されるとこんな感じになります。

slacklog.jpg

Slackのメモを25時間分にしてるのは、GASの定期実行の時間が○時〜○時の間のようにアバウトだから念のためです。

今の所はこんな感じで運用してますが、それなりに満足しています。

GASはアイディア次第で色々できるので良いですね!
明日以降の記事も楽しみです!

59
61
1

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
59
61