Google Apps Script(GAS)のUrlFetchAppとGoogleスプレッドシートを利用して、Slackへのメッセージ送信を自動化します。
このプログラムで出来る事
Slack上でテンプレートの文面を複数のSlackユーザーやチャンネルに自動で発信します。
手動で行うと時間が掛かってしまう作業を自動化する事で、作業時間の短縮が見込めます。さらに、単純な作業の繰り返しからの飽きによるモチベーションの低下の防止を見込みます。
プログラムの作成の為にやる事
以下の2点をGoogleスプレッドシートに対して行います。
- Apps Scriptプログラム(後述)を作成
- 所定のフォーマットに編集
Apps Scriptプログラムの作成
Googleスプレッドシートのメニューバーから「拡張機能 – Apps Script」を選択し、表示されたApps Scriptの画面に以下のプログラムを貼り付けて保存します。
保存後、同画面で「実行」を押下すると、「アカウントへの実行許可」を求められるため、これを許可します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
var token = '[slackのトークン(個人のものやBotのものを指定)]' var icon = ':smile:'; // 通知時に表示されるアイコン function onOpen() { var spreadsheet = SpreadsheetApp.getActive(); var menuItems = [ {name: '実行', functionName: 'postMessage'} ]; spreadsheet.addMenu('Slackへの投稿', menuItems); } function postMessage() { // Googleスプレッドシートからデータ取得 var spreadsheet = SpreadsheetApp.getActive(); var sheet = spreadsheet.getActiveSheet(); var range = sheet.getDataRange(); var rangeValues = range.getValues(); // スプレッドシートから基本情報の取得 var username = rangeValues[0][2] // Bot名称 var text = rangeValues[1][2] // 投稿する文面 var keisyo = rangeValues[3][2] // 相手の敬称 // メールタイトル、文面の置換処理 var titleCol = 1 // Bot名称 {title0~}の列 var textCol = 2 // 文面 {text1~}の列 var idCol = 5 // ユーザーID(Slack) var companyCol = 6 // 会社名列 var nameCol = 7 // 氏名列 var startRow = 7 // ループ開始行 No1 行目の位置(Bot名、文面、宛先共通) var loopCnt = 20 // 置換ループ数 // Bot名、本文の置換処理 for(var i = 0; i < loopCnt; i++) { iti = i + 1 afterTitleVal = rangeValues[startRow + i][titleCol] username = username.replace('{title' + iti + '}', afterTitleVal) afterTextVal = rangeValues[startRow + i][textCol] text = text.replace('{text' + iti + '}', afterTextVal) } // Slackの投稿処理 for(var i = 0; i < loopCnt; i++) { iti = startRow + i var company = rangeValues[iti][companyCol]; var name = rangeValues[iti][nameCol].split('、').join(keisyo + '、') + keisyo ; var id = rangeValues[iti][idCol]; if(id == "") { break; } var text2 = text.split('{会社名}').join(company).split('{氏名}').join(name); var url = "https://slack.com/api/chat.postMessage"; var payload = { "username" : username, "icon_emoji": icon, "token" : token, "channel" : id, "text" : text2 }; var params = { "method" : "post", "payload" : payload }; // Slackに投稿する UrlFetchApp.fetch(url, params); } Browser.msgBox('Slack送信が完了しました'); } |
尚、チャンネルに投稿したい場合、1行目で指定(※)したユーザーまたはBotにそのチャンネルへの投稿権限が必要です。
(※)var token = ‘[slackのトークン(個人のものやBotのものを指定)]’の部分。
Googleスプレッドシートの編集
画像の様に設定します。

設定内容
B1:Bot名称(ラベル)
C1-H1(結合):Bot名称
B2-B3(結合):投稿内容(ラベル)
C2-H3(結合):投稿内容
B4:敬称(さん、様)(ラベル)
C4-H4:敬称(さん、様)の内容
A7:No(ラベル)
B7:Bot名称(title1~)(ラベル)
C7:文面(text1~)(ラベル)
A8-27:1~20(ラベル)
B8-27:タイトルの置換後文字列(それぞれ{title1}~{title20]に対応)
C8-27:文面の置換後文字列(それぞれ{text1}~{text20]に対応)
E7:No(ラベル)
E8-27:1~20(ラベル)
F7:SlackID(ラベル)
G7:会社名(ラベル)
H7:氏名(ラベル)
F8-27:投稿先のSlackID(※)
G8-27:会社名の置換後文字列(文面ごとに{会社名}に対応)
H8-27:氏名の置換後文字列(文面ごとに{氏名}に対応)
(※)チャンネルに投稿する際にはプログラムで指定したトークンのユーザーのチャンネルの参加が必要。
利用方法
用意したフォーマットに必要事項を入力後、メニューバーの「Slackへの投稿 – 実行」を押下します。
実行後、少しして「Slack送信が完了しました。」のメッセージが表示されれば、Slackに投稿が行われています。
補足)SlackユーザーIDの取得方法
次のプログラムを実行することでGoogleスプレッドシートにSlackユーザーIDの一覧を出力することが出来ます。上記で折角編集したGoogleスプレッドシートを上書きしてしまわない様に別のファイルで実行することをお勧めします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
function getSlackUser(cursor) { const slack_app_token = "[slackのトークン(個人のものやBotのものを指定)]"; const limit =2000; const options = { "method" : "get", "contentType": "application/x-www-form-urlencoded", "payload" : { "token": slack_app_token, "cursor": cursor, "limit":limit } }; const url = "https://slack.com/api/users.list"; const response = UrlFetchApp.fetch(url, options); const members = JSON.parse(response).members; let activeArr = []; let inActiveArr = []; for (const member of members) { let id = member.id; // SlackユーザーID let deleted = member.deleted; // 削除済みのユーザーかどうか let real_name = member.profile.real_name; //氏名 let name = member.name; //mei let is_primary_owner = member.is_primary_owner; //プライマリオーナー let is_owner = member.is_owner; //オーナー let is_admin = member.is_admin; //管理者アカウント let is_restricted = member.is_restricted; //Trueならばゲスト let is_ultra_restricted = member.is_ultra_restricted; //true ならばシングルゲストチャンネル,Falseかつis_restrictedがTrueならばマルチチャンネルゲスト let is_bot = member.is_bot; //botユーザー let is_app_user = member.is_app_user; // アプリユーザー let is_invited_user = member.is_invited_user;// 招待中 let guest_invited_by = member.guest_invited_by ; //アカウント有効期限 if (!member.deleted) { activeArr.push([ id, deleted,real_name, name, is_primary_owner, is_owner, is_admin , is_restricted, is_ultra_restricted, is_bot, is_app_user, is_invited_user,guest_invited_by]); } if (member.deleted) { inActiveArr.push([ id, deleted,real_name, name, is_primary_owner, is_owner, is_admin , is_restricted, is_ultra_restricted, is_bot, is_app_user, is_invited_user,guest_invited_by]); } } //スプレッドシートに書き込み const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.clear(); sheet.appendRow(['ID','削除済','氏名','ユーザー名','プライマリオーナー','オーナー','管理者アカウント','ゲストアカウント','シングルorマルチ','botユーザー','アプリユーザー','招待中','アカウント有効期限']); try{ sheet.getRange( sheet.getLastRow()+1,1, activeArr.length, activeArr[0].length).setValues(activeArr); sheet.getRange( sheet.getLastRow()+1,1, inActiveArr.length, inActiveArr[0].length).setValues(inActiveArr); } catch(e){} if( responseMeta = JSON.parse(response).response_metadata.next_cursor != ''){ getSlackUser(JSON.parse(response).response_metadata.next_cursor); } } |
おわりに
いかがでしたでしょうか。
同じようなSlackを投稿する作業は単純に手を動かしてしまえば少しの時間で出来てしまうのですが、単純な作業の繰り返しは飽きによるモチベーションの低下につながるものです。
このブログでは引き続きそのような作業を省略化、軽微化出来るプログラムなどを紹介していければと考えております。
参考)GASとLINEボットで自動翻訳アプリ
Google Apps ScriptとLINEボットによる和英双方向自動翻訳アプリです。
OCRモジュールを利用している為、画像内の文字にも反応します。

参考)Google Apps ScriptでGmailの自動化 – GASによる自動下書き作成、自動メール送信 –
Gmailの下書き作成、及び、メール送信版です。

コメント