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

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

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

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

Slack

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

Q&A

解決済

2回答

7398閲覧

slack メンバーIDをusernameに変換したい

dell_0

総合スコア25

Google Apps Script

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

Slack

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

0グッド

0クリップ

投稿2020/01/29 05:57

Slackで特定のチャンネルのログを、1日1回スプレッドシートに保存しています。

下記で問題なく動作しているのですが、取得したtextのログにあるメンションがメンバーIDになってしまいます。
(例@hogehogeが@Uxxxxxxのような数字とアルファベットに変わる)

slack上でみると、ちゃんとusernameになっています。
スプレッドシートで確認する際にメンバーIDだと名前が分からず困っています。

UNIXタイムスタンプを見やすく変換できるので可能だと思うのですが、うまくいきません。

宜しくお願い致します。

function getSlackLog() { var requestUrl = 'https://slack.com/api/channels.history?'; var payload = { // Slack Token 'token': 'xxxxxxxxxxx', // Channel ID 'channel': 'xxxxx', // 25時間分のメッセージ取得 'oldest': parseInt( new Date() / 1000 ) - (60 * 60 * 40) } // パラメータの設定 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()); Logger.log(response); 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) + response[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; }

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

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

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

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

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

guest

回答2

0

SlackのAPIは触れたことがありませんが、ググったところIDからスクリーンネームを調べられるAPIがあるようなので、そちらを使ったら良いのではないでしょうか。

users.info method | Slack


「UNIXタイムスタンプを見やすく変換できるので可能だと思うのですが」ってどういう理屈なんでしょう…

投稿2020/01/29 07:07

Takumiboo

総合スコア2534

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

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

0

ベストアンサー

次のような変更はいかがでしょうか。

残念ながら、channels.historyで取得した場合、userはuser IDになる仕様のようです。そこで、users.listを使ってユーザリストを取得し、これを使ってchannels.historyで取得したメッセージ内のnameをIDからnameへ変換します。この場合、下記のように変更してみてください。

変更したスクリプト

1. まずgetSlackLog()を下記のように変更してください。

javascript

1function getSlackLog() { 2 var requestUrl = 'https://slack.com/api/channels.history?'; 3 var payload = { 4 // Slack Token 5 'token': 'xxxxxxxxxxx', 6 // Channel ID 7 'channel': 'xxxxx', 8 // 25時間分のメッセージ取得 9 'oldest': parseInt( new Date() / 1000 ) - (60 * 60 * 40) 10 } 11 12 // パラメータの設定 13 var param = []; 14 for (var key in payload) { 15 param.push(key + '=' + payload[key]); 16 } 17 requestUrl += param.join('&'); 18 19 20 // 下記を変更、追加しました。 21 var messages = UrlFetchApp.fetch(requestUrl); 22 messages = JSON.parse(messages.getContentText()); 23 var userList = UrlFetchApp.fetch("https://slack.com/api/users.list?token=" + payload.token); 24 userList = JSON.parse(userList.getContentText()); 25 var userListObj = userList.members.reduce(function(o, e) { 26 o[e.id] = e.name; 27 return o; 28 }, {}); 29 messages.messages.forEach(function(e, i) {messages.messages[i].user = userListObj[e.user]}); 30 return messages; 31}

2. 次にsetSlackLog()を下記のように変更してください。

From

javascript

1var response = JSON.parse(getSlackLog());

To

javascript

1var response = getSlackLog();

注意点

  • もしもご使用中のtokenusers.listを使用するために必要なスコープ(users:read)が含まれていない場合はエラーが発生します。その場合は、スコープへusers:readを追加してtokenを再取得してください。

参考

投稿2020/01/29 07:41

kisojin

総合スコア899

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

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

dell_0

2020/01/30 06:17 編集

丁寧でわかりやすい回答、ありがとうございます。 大変勉強になります。 しかし、IDからnameに変換することができず、メンバーIDのまま表示されてしまいます。 ログで見る限り、userListObjにはuser.idとuser.nameをちゃんとひけて、e.idにはメンバーID、e.nameにはusernameが入っておりました。
kisojin

2020/01/31 03:02

ご返事ありがとうございます。問題が解決できていないとのこと、大変ご迷惑をお掛け致します。 こちらでは動作に問題は御座いませんので、今の場合、状況を再現するための材料が必要です。そこで、"messages"と"userList"のサンプルデータをご提供いただけないでしょうか。これを元にして問題を確認したいと思います。この場合、個人情報があれば何かの値で置き換えてください。
dell_0

2020/01/31 09:17

すみません。channels.historyで取得したtextの中にあるメンバーIDをusernameに置換したいです。
kisojin

2020/02/01 23:01

ご返事ありがとうございます。"channels.historyで取得したtextの中にあるメンバーIDをusernameに置換したいです。"に対してスクリプトを修正しました。 しかしながら、"IDからnameに変換することができず、メンバーIDのまま表示されてしまいます。"とのご回答でしたので、こちらでは問題なく修正したスクリプトが動作することを確認できることから、問題を再現するために"messages"と"userList"のサンプルデータの提供をお願いさせていただきました。
dell_0

2020/02/05 04:18

本日修正頂いたスクリプトを実装したところ、問題なく置換できました。 ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問