はじめに
Workatoを使ってSlackやMicrosoft Teamsにメッセージを送信する際、メンションを付けることがあります。通常のUIでチャット欄に「@誰々...」と入力するのとは異なり、APIを利用する場合は、メンションとして認識される記法に従った文字列を生成し、メッセージに含める必要があります。
例えば、Slackの場合は<@ユーザーID>
という記法を用いることで、特定のユーザーへメンションを送信できます。
固定の相手や1名宛てのメンションであれば、レシピの実装は比較的簡単です。しかし、処理内でリストアップされた複数名のユーザーに対して同時にメンションを送る必要がある場合は、少し複雑に思えるかもしれません。
実は、Workatoのformulaを活用することで、この複数メンションの実装をシンプルに行うことができます。
2つのformulaを併用します
format_map
format_mapというformulaを使うと、リストの各行にフォーマットを適用できます。
(テキストのフォーマットとは、データを特定の構造や見た目に整えることです)
各行のフィールドの値を使用しながら、任意の文字列を作り出せるんですね。
フィールドは %{ field_name
} という形式で表現します。
join
これは皆さんもよく使っているformulaだと思います。
リスト内のすべての項目を、区切り文字で繋ぎながら1つの文字列に結合します。
どのように使うか
Slackを例とした場合の、メンション文字列の生成における各formulaの役割は以下です。
- format_mapの役割:リストの各行の
SlackユーザーID
フィールドを抜き出して、<@と>で装飾 - joinの役割:フォーマット済みの文字列を半角スペースで結合
与えられたデータがハッシュなのか文字列のリストなのかに応じて、微妙にパラメータが異なるためそれぞれ解説します。
ハッシュのリストの場合
ハッシュ(連想配列)は、「キー」と「値」をセットでデータを管理する仕組みです。たとえば、名前と年齢をセットで保存するとき、{"name" => "田中", "age" => 25}
のように、キー(name、age)を使って値(田中、25)にアクセスできます。
この形式は、APIのレスポンスでJSON形式のデータを受け取る際によく使われます。また、スプレッドシートのデータを読み込んだり、何らかのデータセットを取得した場合にも見られる形です。
実装内容
ハッシュのリスト.format_map('<@%{col_社員SlackID}>').join(" ")
中括弧{ }内で、対象リストのフィールド名を指定します。
上記の例ではフィールド名を指定する際に「col_」を先頭に付けていますが、これはスプレッドシートのデータ操作における固有の仕様です。
他アプリケーションのデータについては、フィールド名のみの指定で問題ありません。
実行結果
<余談(こんな加工もできます)>
社員氏名に「さん」を付けて、句点で区切る こともできます。
ハッシュのリスト.format_map('%{col_社員氏名}さん').join("、")
{
"message": "デモ太郎さん、デモ花子さん、デモ二郎さん"
}
文字列のリストの場合
特定のフィールドやエンティティに関する複数の値を含むデータが返されるケースでは、ハッシュではなく、単純な配列で返されることがあります。
具体例として、SlackWorkbotのモーダル画面でユーザーを複数選択した場合は、次のようなデータが返却されます。
実装方法
ハッシュのリストとの違いとしては、keyが無いことです。
この場合、「%s」を使用して値にアクセスします。
文字列のリスト.format_map('<@%s>').join(" ")