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

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

ただいまの
回答率

90.33%

  • Google Apps Script

    951questions

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

  • Slack

    197questions

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

Slack team log をgoogle spreadsheetに出力する方法

受付中

回答 0

投稿 編集

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

Tiktokkkk

score 0

 前提・実現したいこと

ここに質問の内容を詳しく書いてください。

Slackのaccess logをspreadsheetに出力したい。週次などのサイクルで自動出力できたらベスト。

調べたところ、channel historyをspreasheetに出力するには下記のようにすればいいことまでわかってます。あとはこれをchannel historyでなく、team logで同様のことをするにはどうしたらよいのか?
というのが質問です。

https://github.com/motemen/gas-slack-log-spreadsheet/blob/master/app.js

Teamlogは下記を指します。

https://api.slack.com/methods/team.accessLogs

=============================

// Configuration: Obtain Slack web API token at https://api.slack.com/web
var API_TOKEN = PropertiesService.getScriptProperties().getProperty('slack_api_token');
if (!API_TOKEN) {
    throw 'You should set "slack_api_token" property from [File] > [Project properties] > [Script properties]';
}
var FOLDER_NAME = 'Slack Team Access Logs';
/**** Do not edit below unless you know what you are doing ****/
var COL_LOG_USERID = 1;
var COL_LOG_USERNAME = 2;
var COL_LOG_DATEFIRST = 3;
var COL_LOG_DATELAST = 4;
var COL_LOG_IP =5;
var COL_LOG_USERAGENT = 6;
var COL_LOG_ISP = 7;
var COL_LOG_RAW_JSON = 8;
var COL_MAX = COL_LOG_RAW_JSON;
// Slack offers 10,000 history logs for free plan teams. As premium, pagination assumes 1,000(maximum count per page assumes 1,000)
var MAX_HISTORY_PAGINATION = 1000;
var HISTORY_COUNT_PER_PAGE = 1000;
function StoreLogsDelta() {
    var logger = new SlackTeamAccessLogger();
    logger.run();
}
;
var SlackTeamAccessLogger = function SlackTeamAccessLogger(){

    SlackTeamAccessLogger.prototype.requestSlackAPI = function (path, params) {
        if (params === void 0) { params = {}; }
        var url = "https://slack.com/api/" + path + "?";
        var qparams = [("token=" + encodeURIComponent(API_TOKEN))];
        for (var k in params) {
            qparams.push(encodeURIComponent(k) + "=" + encodeURIComponent(params[k]));
        }
        url += qparams.join('&');
        Logger.log("==> GET " + url);
        var resp = UrlFetchApp.fetch(url);
        var data = JSON.parse(resp.getContentText());
        if (data.error) {
            throw "GET " + path + ": " + data.error;
        }
        return data;
    };
    SlackTeamAccess.prototype.run = function () {
        var teamaccessResp = this.requestSlackAPI('username.list');
        for (var _i = 0, _a = teamaccessResp.pages; _i < _a.length; _i++) {
            var page = _a[_i];
            this.importTeamAccessDelta(page);  
        }
    };
    //use google apps to flow data from slack to spreadsheet                          
    SlackTeamAccessLogger.prototype.getLogsFolder = function () {
        var folder = DriveApp.getRootFolder();
        var path = [FOLDER_NAME];
        path.forEach(function (name) {
            var it = folder.getFoldersByName(name);
            if (it.hasNext()) {
                folder = it.next();
            }
            else {
                folder = folder.createFolder(name);
            }
        });
        return folder;
    };
    //if case "ta", "d", "readonly", then defined proccess would be applied
    SlackTeamAccessLogger.prototype.getSheet = function (ta, d, readonly) {
        if (readonly === void 0) { readonly = false; }
        var dateString;
        if (d instanceof Date) {
            dateString = this.formatDate(d);
        }
        else {
            dateString = '' + d;
        }
        var spreadsheet;
        var sheetByID = {};
        var spreadsheetName = dateString;
        var folder = this.getLogsFolder();
        var it = folder.getFilesByName(spreadsheetName);
        if (it.hasNext()) {
            var file = it.next();
            spreadsheet = SpreadsheetApp.openById(file.getId());
        }
        else {
            if (readonly)
                return null;
            spreadsheet = SpreadsheetApp.create(spreadsheetName);
            folder.addFile(DriveApp.getFileById(spreadsheet.getId()));
        }
        var sheets = spreadsheet.getSheets();
        sheets.forEach(function (s) {
            var name = s.getName();
            var m = /^(.+) \((.+)\)$/.exec(username); // eg. "general (C123456)"
            if (!m)
                return;
            sheetByID[m[2]] = s;
        });
        var sheet = sheetByID[ch.id];
        //if sheet isn't sheet
        if (!sheet) {
            if (readonly)
                return null;
            sheet = spreadsheet.insertSheet();
        }
        var sheetName = ta.username ;
        //if gotten sheet name isn't eqaul to sheet name, set sheet name
        if (sheet.getName() !== sheetName) {
            sheet.setName(sheetName);
        }
        return sheet;
    };
    SlackTeamAccessLogger.prototype.importTeamAccessDelta = function (ta) {
        var _this = this;
        Logger.log("importTeamAccessDelta " + "ta.username ");
        var now = new Date();
        var page = '1'; // page=0 does not work
        var existingSheet = this.getSheet(ta, now, true);
        if (!existingSheet) {
            // try previous month
            now.setMonth(now.getMonth() - 1);
            existingSheet = this.getSheet(ta, now, true);
        }
        if (existingSheet) {
            var lastRow = existingSheet.getLastRow();
            try {
                var data = JSON.parse(existingSheet.getRange(lastRow, COL_LOG_RAW_JSON).getValue());
                oldest = data.ts;
            }
            catch (e) {
                Logger.log("while trying to parse the latest history item from existing sheet: " + e);
            }
        }

    };
    SlackTeamAccessLogger.prototype.formatDate = function (dt) {
        return Utilities.formatDate(dt, Session.getScriptTimeZone(), 'yyyy-MM');
    };

      return SlackTeamAccessLogger;}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • macaron_xxx

    2018/10/03 10:43

    どうしたらよいのか?ではなく、あなたはどうされたのですか?

    キャンセル

  • Tiktokkkk

    2018/10/14 21:35

    2018/10/14 追記 その後下記まで作成してみたのですが、「SlackTeamAccess.prototype.run = function () ...」の箇所がエラー(XX行目のSlackTeamAccessが定義されていない、と出てしまう)困っています。。。 上記よりは解決したいところを具体化したので、再度ご回答できる方にご支援をお願いしたく存じます。

    キャンセル

  • macaron_xxx

    2018/10/16 10:11

    すごく単純に"SlackTeamAccess"が定義されていないですよね?”SlackTeamAccessLogger"なのでは?

    キャンセル

まだ回答がついていません

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

  • Google Apps Script

    951questions

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

  • Slack

    197questions

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