リストとハッシュの formula

基本的なデータ型 (文字列や整数など) のほかにも、複数の要素に関する情報や、単一の要素に関する複数の情報を含んでいる、より複雑なデータ構造もあります。

たとえば次のようなデータ構造です。

Workato の formula は、ホワイトリストで許可された Ruby メソッドです。したがって、すべての Ruby メソッドがサポートされているわけではありません。その他の formula をホワイトリストに追加したい場合は、弊社までご連絡ください


リスト (配列)

配列は、任意のオブジェクトからなる順序付きの集まりであり、整数のインデックスが付けられています。リストのインデックスは0から始まります。リストと配列は同一のデータ構造を表します。

以下の例は、整数のリストがどのように表現されるかを示しています。

ruby
number_list = [100, 101, 102, 103, 104]

リストは順序付けられているため、以下の formula を使用して値を取得できます。この構文で取得できるのは、5番目の項目までです。

formula結果
number_list.first100
number_list.second101
number_list.third102
number_list.fourth103
number_list.fifth104
number_list.last104

インデックスを使用して、それに対応する値を取得することもできます。インデックスは0から始まることを忘れないでください。

formula結果
number_list[0]100
number_list[1]101
number_list[2]102
number_list[3]103

Ruby のリストは負のインデックスをサポートしています。

formula結果
number_list[-1]104
number_list[-2]103
number_list[-3]102
number_list[-4]101

リストでは、インデックスとして範囲も使用できます。この場合は、値のみを返すのではなく、別のリストを返します。

formula結果
number_list[0..2][100, 101, 102]
number_list[-3..-1][102, 103, 104]
number_list[0..-2][100, 101, 102, 103]

ハッシュ

ハッシュは、一意のキーとその値の集まりであり、辞書のような役割を果たします。リストに似ていますが、リストはインデックスとして整数を使用するのに対し、ハッシュはどのようなオブジェクト型でも使用できます。ハッシュは、対応するキーが挿入された順に、その値を列挙します。

2つの値を持つハッシュの例を見てみましょう。'Acme widgets'10 がそれぞれ、item_name と item_quantity の値になっています。

ruby
line_item = { 'item_name' => 'Acme widgets', 'item_qty' => 10 }
formula結果
line_item["item_name"]"Acme widgets"
line_item["item_qty"]10

ハッシュのリスト

以下に、複数の品目がある請求書の例を示します。これはハッシュのリストとして表現されています。

ruby
line_items = [
  { 'item_no': 1, 'item_name' => 'Acme widgets', 'item_qty' => 10 },
  { 'item_no': 2, 'item_name' => 'RR bearings',  'item_qty' => 99 },
  { 'item_no': 3, 'item_name' => 'Coyote tyres', 'item_qty' => 7 }
]

リストの formula

ハッシュのリストの例

以下に、 Contacts というハッシュのリストの例を示します。

この Contacts リストを表形式で表すと、次のようになります。

nameemailstatecompanycompany_rev
Joejoe@abc.omCAABC1000
Jilljill@nbc.comMANBC1000
Joanjoan@nbc.comMANBC10000
Jackjack@hbo.comCAHBO30000

この Contacts リストをハッシュのリストの形式で表すと、次のようになります。

ruby
[
  {
    'name' => 'Joe',
    'email' => 'joe@abc.com',
    'state' => 'CA',
    'company' => 'ABC',
    'company_rev' => 1000,
    'description' => { 'summary' => 'First time buyer', 'estimated_value' => 300 }
  },
  {
    'name' => 'Jill',
    'email' => 'jill@nbc.com',
    'state' => 'MA',
    'company' => 'NBC',
    'company_rev' => 1000,
    'description' => { 'summary' => 'Referral', 'estimated_value' => 500 }
  },
  {
    'name' => 'Joan',
    'email' => 'joan@nbc.com',
    'state' => 'MA',
    'company' => 'NBC',
    'company_rev' => 10000,
    'description' => { 'summary' => 'Recurring customer', 'estimated_value' => 900 }
  },
  {
    'name' => 'Jack',
    'email' => 'jack@hbo.com',
    'state' => 'CA',
    'company' => 'HBO',
    'company_rev' => 30000,
    'description' => { 'summary' => 'Recurring customer', 'estimated_value' => 1000 }
  }
]

first

この formula はリスト内の最初の項目を返します。

これを使用して、リスト内の最初の n 個の項目を返すこともできます。その場合、出力はリスト形式になります。

構文

List.first(number)

  • List - インプットリスト。
  • number - (任意) リストから取得する項目の数。指定されていない場合、この formula は _1 個_の項目のみを返します。

使用例

formula結果
["One","Two","Three","Four","Five"].first()"One"
["One","Two","Three","Four","Five"].first(2)["One","Two"]
[1,2,3,4,5].first()1
[1,2,3,4,5].first(3)[1,2,3]

動作

この formula はリスト内の最初の n 個の項目を返します。n が1より大きい場合、出力はリスト形式になります。

出力データ型

単一の項目を返す (すなわち、引数が与えられていない) 場合、出力は、その項目のデータ型に従った形式になります。

_複数の_項目を返す場合、出力はリスト型の形式になります。

関連情報

  • last: リスト内の最後の n 個の項目を返します。
  • where: 特定の条件を満たすリスト項目からなるサブセットを返します。

last

この formula はリスト内の最後の項目を返します。

これを使用して、リスト内の最後の n 個の項目を返すこともできます。その場合、出力はリスト形式になります。

構文

List.last(number)

  • List - インプットリスト。
  • number - (任意) リストから取得する項目の数。指定されていない場合、この formula は _1 個_の項目のみを返します。

使用例

formula結果
["One","Two","Three","Four","Five"].last()"Five"
["One","Two","Three","Four","Five"].last(2)["Four","Five"]
[1,2,3,4,5].last()5
[1,2,3,4,5].last(3)[3,4,5]

動作

この formula はリスト内の最後の n 個の項目を返します。n が1より大きい場合、出力はリスト形式になります。

出力データ型

単一の項目を返す (すなわち、引数が与えられていない) 場合、出力は、その項目のデータ型に従った形式になります。

_複数の_項目を返す場合、出力はリスト型の形式になります。

関連情報

  • first: リスト内の最初の n 個の項目を返します。
  • where: 特定の条件を満たすリスト項目からなるサブセットを返します。

index

与えられた値に最初に一致する項目のインデックスを返します。一致する項目が見つからない場合は、nil を返します。

構文

Input.index(value)

  • Input - インプットリスト。
  • value - リスト内で検索する値。

使用例

formula結果
[4, 5, 6, 7].index(6)2
[4, 5, 6, 7].index(8)nil

where

指定された WHERE 条件を満たす行 (ハッシュ) のみを取得します。この formula は、1つ以上のキーと値のペアを含むハッシュの形式で単一の引数を受け付けます。

条件のデフォルトのオペランドは Equal to (==) です。この formula は、以下のオぺランドにも対応しています。オペランドは、キーの末尾にスペースで区切りを入れ、その後に追加する必要があります。

名前表記
Equal to (デフォルト)==leads.where('state': 'CA')
More than>leads.where('company_revenue >': 10000)
More than or equal to>=leads.where('company_revenue >=': 10000)
Less than<leads.where('company_revenue <': 10000)
Less than or equal to<=leads.where('company_revenue <=': 10000)
Not equal to!=leads.where('state !=': 'CA')

条件式の引数としてデータピルを使用

条件式の引数として、静的な値 (たとえば 'CA') の代わりにデータピルも使用できます。そのデータピルの値は実行時に処理されます。

contacts.where(state: datapill )

使用例

単一の WHERE 条件の例

contacts.where('state': 'CA') は以下の行を返します。

nameemailstatecompanycompany_rev
Joejoe@abc.omCAABC1000
Jackjack@hbo.comCAHBO30000

これらの行はハッシュのリストとして表現されます。

ruby
[
  {
    'name' => 'Joe',
    'email' => 'joe@abc.com',
    'state' => 'CA',
    'company' => 'ABC',
    'company_rev' => 1000
  },
  {
    'name' => 'Jack',
    'email' => 'jack@hbo.com',
    'state' => 'CA',
    'company' => 'HBO',
    'company_rev' => 30000
  }
]
複合のWHERE formula の例

複合の WHERE formula は、すべての条件に一致する行のみを取得します。

contacts.where('state': 'CA', 'company_revenue >=': 10000)

は以下の行を返します。

nameemailstatecompanycompany_rev
Jackjack@hbo.comCAHBO30000

これらの行はハッシュのリストとして表現されます。

ruby
[
  {
    'name' => 'Jack',
    'email' => 'jack@hbo.com',
    'state' => 'CA',
    'company' => 'HBO',
    'company_rev' => 30000
  }
]
複数の照合の例

特定の項目を複数の値と照合して、レコードをフィルタリングできます。これを行うには、WHERE 条件内に配列値を渡します。

contacts.where('company': ['ABC','HBO'])

この WHERE 条件では、company が ABC または HBO の行が返されます。

nameemailstatecompanycompany_rev
Joejoe@abc.omCAABC1000
Jackjack@hbo.comCAHBO30000

これらの行はハッシュのリストとして返されます。

ruby
[
  {
    'name' => 'Joe',
    'email' => 'joe@abc.com',
    'state' => 'CA',
    'company' => 'ABC',
    'company_rev' => 1000
  },
  {
    'name' => 'Jack',
    'email' => 'jack@hbo.com',
    'state' => 'CA',
    'company' => 'HBO',
    'company_rev' => 30000
  }
]
パターンマッチングを使った WHERE 条件の例

正規表現を使ってレコードをフィルタリングすることもできます。これを行うには、文字列の代わりに正規表現を渡します。

contacts.where('name': /^Jo/)

この WHERE 条件では、name が Jo で始まる行が返されます。

nameemailstatecompanycompany_rev
Joejoe@abc.omCAABC1000
Joanjoan@nbc.comMANBC10000

これらの行はハッシュのリストとして表現されます。

ruby
[
  {
    'name' => 'Joe',
    'email' => 'joe@abc.com',
    'state' => 'CA',
    'company' => 'ABC',
    'company_rev' => 1000
  },
  {
    'name' => 'Joan',
    'email' => 'joan@nbc.com',
    'state' => 'MA',
    'company' => 'NBC',
    'company_rev' => 10000
  }
]
パターンマッチングを使った WHERE 条件の例 (データピルを使用)

正規表現パターン内でデータピルを使用し、マッチング用の文字列を動的に変更することもできます。ただし、正規表現パターンで変数を使用するときは、その正規表現内でエスケープを行う必要があります。

例: contacts.where(state: /#{ datapill }/)

以下の画像のメソッドでは、Lookup table 内のすべての「email」を取得してから、「state」列に Salesforce からのデータピル StateStep 2 の文字列を含んでいるものを絞り込んでいます。

正規表現でのデータピル正規表現でのデータピルの使用

注: 正規表現のメタ文字は、メタ文字と解釈されないようにしたい場合、すべてエスケープする必要があります。

WHERE 条件の連結の例

一連の WHERE 条件が連結されている場合、formula はそれぞれの WHERE 条件を順番に評価します。

contacts.where('state': 'CA').where('company_revenue >=': 10000) は以下の行を返します。これは複合の WHERE formula と同じ結果になります。

nameemailstatecompanycompany_rev
Jackjack@hbo.comCAHBO30000

ただしこのケースでは、連結の途中で中間段階の配列が生成されます。

まず、contacts.where('state': 'CA') が以下を返します。

nameemailstatecompanycompany_rev
Joejoe@abc.omCAABC1000
Jackjack@hbo.comCAHBO30000

そして .where('company_revenue >=': 10000) はこの中間段階の配列をさらに絞り込み、以下のみを返します。

nameemailstatecompanycompany_rev
Jackjack@hbo.comCAHBO30000

結果はハッシュのリストとして表現されます。

ruby
[
  {
    'name' => 'Jack',
    'email' => 'jack@hbo.com',
    'state' => 'CA',
    'company' => 'HBO',
    'company_rev' => '30000'
  }
]

except

与えられたキー以外を含むハッシュすべてを返します。

ruby
hash = { a: true, b: false, c: nil }
hash.except(:c)     # => { a: true, b: false }
hash.except(:a, :b) # => { c: nil }
hash                # => { a: true, b: false, c: nil }

pluck

指定された列のみを取得します。

使用例

単一列のデータセットの例

contacts.pluck("email") は以下を返します。

email
joe@abc.com
jill@nbc.com
joan@nbc.com
jack@hbo.com

単一列の場合、結果は配列として返されます。

ruby
["joe@abc.com", "jill@nbc.com", "joan@nbc.com", "jack@hbo.com"]
複数列のデータセットの例

contacts.where("state ==": "CA").pluck("email", "company") は以下を返します。

emailcompany
joe@abc.comABC
jill@nbc.comNBC
joan@nbc.comNBC
jack@hbo.comHBO

結果はリストのリストとして返されます。

ruby
[["joe@abc.com", "ABC"], ["jill@nbc.com", "NBC"], ["joan@nbc.com", "NBC"], ["jack@hbo.com", "HBO"]]
ネストされたフィールドを取得する例

このメソッドは、ネストされたフィールドの抽出にも使用できます。[<1st-level field>,<2nd-level field>...] のような形式を使用して、取得するフィールドを定義してください。

contacts.pluck("email", ["description", "summary"]) は以下を返します。

emailsummary
joe@abc.comFirst time buyer
jill@nbc.comReferral
joan@nbc.comRecurring customer
jack@hbo.comRecurring customer

結果はリストのリストとして返されます。

ruby
[
  ["joe@abc.com", "First time buyer"],
  ["jill@nbc.com", "Referral"],
  ["joan@nbc.com", "Recurring customer"],
  ["jack@hbo.com", "Recurring customer"]
]

format_map

与えられたハッシュの配列の各行を整形して、文字列の配列を作り出します。作り出した文字列に静的なテキストを追加することもできます。フィールドは %{ <field_name> } という形式で表現します。

使用例

contacts.format_map('Name: %{name}, Email: %{email}, Company: %{company}') は以下を返します。

ruby
[
  'Name: Joe, Email: joe@abc.com, Company: ABC' ,
  'Name: Jill, Email: jill@nbc.com, Company: NBC' ,
  'Name: Joan, Email: joan@nbc.com, Company: NBC' ,
  'Name: Jack, Email: jack@hbo.com, Company: HBO' ,
]

この例からは、文字列のリストが得られます。リスト "contacts" の各行につき1つの文字列となっています。表記のとおり、name、email、company という3つのフィールドのデータが使用されています。


join

リスト内のすべての項目を結合して、1つのテキスト文字列を作成します。各項目の間には区切り文字が挿入されます。

構文

List.join(separator)

  • List - リスト型の入力。
  • separator - 項目が結合されたときに、その間に挿入される文字。区切り文字を指定しない場合、リストの項目は一続きに結合されます。

使用例

formula結果
["Ms", "Jean", "Marie"].join("-")"Ms-Jean-Marie"
[1,2,3].join("--")"1--2--3"
["ab", "cd", "ef"].join"abcdef"

動作

リストの項目が結合され、1つのテキスト文字列になります。区切り文字が各項目の間に挿入されます。

区切り文字

区切り文字の引数には、文字列も使用できます (例: ", ")。

["Open","Pending","Closed"].join(", ") は "Open, Pending, Closed" を返します。

関連情報

  • split: 指定した文字を中心に文字列を分割し、文字列の配列を返します。

smart_join

リストの要素を結合して1つの文字列にします。空の値と nil 値は取り除かれ、空白は結合前に切り詰められます。

構文

List.smart_join(separator)

  • List - リスト型の入力。
  • separator - 項目が結合されたときに、その間に挿入される文字。区切り文字が指定されていない場合、空白が結合文字として使用されます。

使用例

formula結果
[nil, "", "Hello", " ", "World"].smart_join(" ")"Hello World"
["111 Vinewood Drive", "", "San Francisco", "CA", "95050"].smart_join(",")"111 Vinewood Drive, San Francisco, CA, 95050"

reverse

リストの順序を逆にします。

構文

List.reverse

  • List - リスト型の入力。

使用例

formula結果
["Joe", "Jill", "Joan", "Jack"].reverse["Jack", "Joan", "Jill", "Joe"]
[100, 101, 102, 103].reverse[103, 102, 101, 100]

sum

整数や小数の場合は、数値が足し合わせ、合計値を取得します。文字列の場合は、文字列を連結し、1つの長い文字列を生成します。

構文

List.sum

  • List - リスト型の入力。

使用例

formula結果
[1, 2, 3].sum6
[1.5, 2.5, 3].sum7.0
["abc", "xyz"].sum"abcxyz"

uniq

ユニークな項目からなるリストを返します。

構文

List.uniq

  • List - リスト型の入力。

使用例

formula結果
["joe", "jack", "jill", "joe", "jack"].uniq["joe","jack", "jill"]
[1, 2, 3, 1, 1, 3].uniq[1, 2, 3]
[1.0, 1.5, 1.0].uniq[1.0, 1.5]

flatten

多次元配列 (配列の配列) を一次元配列にフラット化します。

構文

List.flatten

  • List - リスト型の入力。

使用例

formula結果
[[1, 2, 3], [4, 5, 6]].flatten[1, 2, 3, 4, 5, 6]
[[1, [2, 3], 3], [4, 5, 6]].flatten[1, 2, 3, 3, 4, 5, 6]
[[1, [2, 3], 9], [9, 8, 7]].flatten[1, 2, 3, 9, 9, 8, 7]

length

自身に含まれる要素の数を返します。リストが空の場合は0を返します。

構文

List.length

  • List - リスト型の入力。

使用例

formula結果
[ 1, 2, 3, 4, 5 ].length5
[{..}, {..}, {..}].length3
[" ", nil, "", nil].length4
[].length0

max

配列内の最大値を返します。数値を比較するときは、最も大きい数が返されます。文字列を比較するときは、最大の ASCII 値を持つ文字列が返されます。

構文

List.max

  • List - リスト型の入力。

使用例

formula結果
[-5, 0, 1, 2, 3, 4, 5].max5
[-1.5, 1.5, 2, 3, 3.5].max3.5
["cat", "dog", "rat"].max"rat"

min

配列内の最小値を返します。数値を比較するときは、最も小さい数が返されます。文字列を比較するときは、最小の ASCII 値を持つ文字列が返されます。

構文

List.min

  • List - リスト型の入力。

使用例

formula結果
[-5, 0, 1, 2, 3, 4, 5].min-5
[-1.5, 1.5, 2, 3, 3.5].min-1.5
["cat", "dog", "rat"].min"cat"

compact

配列やハッシュから nil 値を除去します。

使用例

formula結果
["foo", nil, "bar"].compact["foo", "bar"]
{ foo: 1, bar: nil, baz: 2 }.compact{ foo: 1, baz: 2 }

条件

blank?

この formula は入力文字列をチェックし、それが空の文字列または null である場合に true を返します。

構文

Input.blank?

  • Input - 入力データピル。利用できるデータ型には、文字列や数値、日付、日時があります。

使用例

formula結果
"Any Value".blank?false
123.blank?false
0.blank?false
"".blank?true

動作

入力値が null または空の文字列の場合、この formula は true を返します。他のデータの場合は false を返します。

関連情報

  • presence: データが存在する場合は、そのデータを返し、存在しない場合は nil を返します。
  • present?: 有効な入力データがある場合に、true を返します。

include?

文字列に特定の部分文字列が含まれているかどうかをチェックします。含まれている場合は true を返します。

構文

Input.include?(substring)

  • Input - 文字列の入力。
  • substring - チェック対象の部分文字列。

使用例

formula結果
"Partner account".include?("Partner")true
"Partner account".include?("partner")false

動作

この formula は文字列に特定の部分文字列が含まれているかどうかをチェックします。含まれている場合は true を返し、含まれていない場合は false を返します。この部分文字列は大文字と小文字が区別されます。

このメソッドは、exclude? とは反対の働きをします。入力文字列に指定されたキーワードが含まれている場合に限り、true を返します。

関連情報

  • exclude?: 文字列に特定の部分文字列が含まれているかどうかをチェックします。含まれている場合は false を返します。

present?

この formula は入力データをチェックし、値が存在する場合は true を返します。入力データが nil、ブール値の false、空の文字列、または空のリストの場合、この formula は false を返します。

構文

Input.present?

  • Input - 入力データピル。利用できるデータ型には、文字列や数値、日付、リストがあります。

使用例

formula結果
"Any Value".present?true
123.present?true
0.present?true
"2017-04-02T12:30:00.000000-07:00".present?true
nil.present?false
"".present?false
[].present?false

動作

入力データが null、空の文字列、または空のリストの場合、この formula は false を返します。他のデータの場合は true を返します。

nil 値を含むリストの評価

  • 空のリストの場合のみ、false が返されます。

[].present? は false を返します。

  • nil や空の文字列を含むリストの場合は、true が返されます。

[nil,""].present? は true を返します。

関連情報

  • presence: データが存在する場合は、そのデータを返し、存在しない場合は nil を返します。
  • blank?: データが存在しないか、文字列が空白のみで構成されている場合に、nil を返します。

presence

データが存在する場合は、そのデータを返し、存在しない場合は nil を返します。

構文

Input.presence

  • Input - 入力データピル。利用できるデータ型には、文字列や数値、日付、日時があります。

使用例

formula結果
nil.presencenil
"".presencenil
"Any Value".presence"Any Value"
45.0.presence45.0
0.presence0

動作

入力データが null または空の文字列の場合、この formula は nil を返します。その他のデータの場合、元の入力データを返します。

関連情報

  • blank?: データが存在しないか、文字列が空白のみで構成されている場合に、nil を返します。
  • present?: 有効な入力データがある場合に、true を返します。

変換

以下の formula を使用すると、配列のデータを他のデータ型に変換できます。


to_csv

配列から CSV 行を生成します。この formula はエスケープを処理します。CSV 行内では、nil 値や空の文字列も表現されます。

構文

Input.to_csv

  • Input - リスト型の入力。

使用例

formula結果
["John Smith", "No-Email", " ", nil, "555-1212"].to_csv"John Smith,No-Email, ,,555-1212"
["John Smith", "No-Email", " ", nil, 1212].to_csv"John Smith,No-Email, ,,1212"

to_json

ハッシュまたは配列を JSON 文字列に変換します。

構文

Input.to_json

  • Input - 入力データピル。利用できるデータ型には、リストやハッシュがあります。

使用例

formula結果
{"pet" => "cat", "color" => "gray"}.to_json{"pet":"cat","color":"gray"}
["1","2","3"].to_json["1", "2", "3"]

to_xml

ハッシュまたは配列を XML 文字列に変換します。

構文

Input.to_xml

  • Input - 入力データピル。利用できるデータ型には、リストやハッシュがあります。

使用例

formula結果
{"name" => "Ken"}.to_xml(root: "user")<user><name>Ken</name></user>
[{"name" => "Ken"}].to_xml(root: "users")<users><user><name>Ken</name></user></users>

from_xml

XML 文字列をハッシュに変換します。

構文

Input.from_xml

  • Input - XML の入力データ

使用例

XML 文字列のハッシュへの変換

以下の XML 文字列

<?xml version=\"1.0\" encoding=\"UTF-8\" ?> <hash><foo type="integer">123</foo></hash>

は、次のような XML データを表します。

xml
<?xml version=\"1.0\" encoding=\"UTF-8\" ?>

<hash>
  <foo type="integer">123</foo>
</hash>

XML string.from_xml は、以下のハッシュを返します。

ruby
{ "hash":
  [ "foo":
    [
      { "@type": "integer",
        "content!": "1"
      }
    ]
  ]
}

encode_www_form

ハッシュを連結して、URL エンコードされたパラメータ文字列にします。

構文

Input.encode_www_form

  • Input - ハッシュデータ型の入力。

使用例

formula結果
{"apple" => "red green", "2" => "3"}.encode_www_form"apple=red+green&2=3"

to_param

URL クエリー文字列として使用するための文字列表現を返します。

構文

Input.to_param

  • Input - ハッシュデータ型の入力。

使用例

formula結果
{name: 'Jake', age: '22'}.to_param"name=Jake&age=22"

keys

入力されたハッシュのキーからなる配列を返します。

構文

Input.keys

  • Input - ハッシュデータ型の入力。

使用例

formula結果
{"name" => 'Jake', "age" => '22'}.keys["name", "age"]

Last updated: