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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Google Apps Script

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

Slack

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

Q&A

0回答

773閲覧

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

Tiktokkkk

総合スコア10

Google Apps Script

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

Slack

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

0グッド

1クリップ

投稿2018/10/01 13:52

編集2022/01/12 10:55

前提・実現したいこと

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

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;}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macaron_xxx

2018/10/03 01:43

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

2018/10/14 12:35

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

2018/10/16 01:11

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問