GoogleスプレッドシートでSlackに投稿するボタンを作成してみた

複数チャンネルに同時投稿もできます
2023.04.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部 BIチームのkariyaです。
現在私が所属している組織では、勤務や休憩の開始終了時にSlackの特定のチャンネルにメッセージ投稿をしています。

手動でメッセージ投稿するのが手間に感じたため、1クリックでメッセージ投稿できるボタンをGoogleスプレッドシートで作成してみました。今回はお昼休みの開始終了時に使う想定で作成しています。

やりたいこと

  • ボタンの1クリックで実行する
  • Slackの複数のチャンネルに同じメッセージを投稿する
  • Slackのプロフィール(メッセージ、絵文字)を変更する
  • メッセージや絵文字を簡単に変更できる

ではやってみましょう。

準備:Slackでの作業

はじめにSlack側での準備をします。

Slack APIのトークンを取得

Slack Appを作成し、Scopeに以下の権限を追加します。

  • chat:write(メッセージを投稿する権限)
  • users.profile:write(プロフィールを更新する権限)

設定後はこのように表示されます。

アプリをインストールし、User Tokenをコピーしておきます。

後でGoogleスプレッドシートに貼り付けます。この情報は、自分のユーザーとしてAPIを実行するための情報ですので、他人に見られないようにご注意下さい。

Slackの自分のメンバーIDを取得する

Slackのプロフィール画面に移動します。

3点リーダーから、「メンバーIDのコピー」でコピーできます。

以上でSlack上の作業は完了です。 ここからはGoogleスプレッドシートでの作業です。

Googleスプレッドシートの作業

パラメータ設定シートの作成

Googleスプレッドシートにて、以下のようなシートを作成します。 着色セルはこのあとGoogle Apps Script(GAS)で読み取る部分です。

シートの設定内容

  • APIキー:Slack APIから取得したUser Token
  • SlackユーザーID:プロフィールから取得したメンバーID
  • 昼休み開始(終了)メッセージ:チャンネルに投稿するメッセージ
  • 昼休み開始(終了)ステータス絵文字:自分のステータスに表示する絵文字
  • 昼休み開始(終了)ステータスメッセージ:自分のステータスに表示するメッセージ

Apps Scriptの作成

拡張機能のApps Scriptへ移動します。

以下のコードを貼り付けます。
postSlackMessageは必要なチャンネルの分だけ設定します。 メッセージ設定B7など、シート名やセルを指定している部分はスプレッドシートと同じものを設定します。

// 定数設定
const slackPostMessageUrl = 'https://slack.com/api/chat.postMessage'
const slackSetStatusUrl = 'https://slack.com/api/users.profile.set'

let mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メッセージ設定');
let token = mySheet.getRange('B7').getDisplayValue();
let slackUserId = mySheet.getRange('B8').getDisplayValue();

// お昼休み開始宣言
function postMessage_lunch_start() {
  
  // セルからメッセージ内容取得
  let message_input = mySheet.getRange('B10').getDisplayValue();
  let emoji_input = mySheet.getRange('B11').getDisplayValue();
  let status_input = mySheet.getRange('B12').getDisplayValue();
  
  // Slackに投稿
  // チャンネル名を変えてpostSlackMessegeを複数行で実行すれば、同時に複数チャンネルに投稿できる
  postSlackMessage('project-xxxx', message_input);
  postSlackMessage('team-xxxx', message_input);
  postSlackMessage('times-xxxxx', message_input);

  // Slackステータス変更
  changeSlackStatus(emoji_input, status_input);
}

//お昼休み終了宣言
function postMessage_lunch_end() {
  
  // セルからメッセージ内容取得
  let message_input = mySheet.getRange('B14').getDisplayValue();
  let emoji_input = mySheet.getRange('B15').getDisplayValue();
  let status_input = mySheet.getRange('B16').getDisplayValue();

  // Slackに投稿
  // チャンネル名を変えてpostSlackMessegeを複数行で実行すれば、同時に複数チャンネルに投稿できる
  postSlackMessage('project-xxxx', message_input);
  postSlackMessage('team-xxxx', message_input);
  postSlackMessage('times-xxxxx', message_input);

  // Slackステータス変更
  changeSlackStatus(emoji_input, status_input);
}

// メッセージ投稿
function postSlackMessage(channel, message){
  const payload = {
    'token' : token,
    'channel' : channel,
    'text' : message,
    'as_user' : true
  };
  const params = {
    'method' : 'post',
    'payload' : payload
  };
  UrlFetchApp.fetch(slackPostMessageUrl, params);
}

// ステータス変更
function changeSlackStatus(emoji, message) {
  const headers = {
    'Authorization': 'Bearer ' + token,
    'X-Slack-User': slackUserId,
    'Content-Type': 'application/json; charset=utf-8'
  };
  const payload = {
    'profile': {
      'status_emoji': emoji,
      'status_text': message
    }
  };
  const options = {
    'method': 'post',
    'headers': headers,
    'payload': JSON.stringify(payload)
  };
  UrlFetchApp.fetch(slackSetStatusUrl, options);
}

ボタン割り当て

ボタンを作成し、ボタンを押すとコードが実行されるようにします。
まず、挿入から図形描画を選択し、好きな形で図形を作成します。

作成した図形の3点リーダーから「スクリプトを割り当て」を選択し、割り当てる関数を設定します。

今回は昼休み開始ボタンを押すとpostMessage_lunch_startが実行されるように設定します。

同様に昼休み終了ボタンを作成し、postMessage_lunch_endを設定します。

実行してみる

お昼休み開始ボタンを押してみると、メッセージ投稿ができました!プロフィールも更新できています。

おわりに

最後までお読みいただきありがとうございました。 普段のちょっとした手間を削減するヒントになれば嬉しいです。