コンテンツまでスキップ

【Notion】map関数でリスト形式のプロパティを扱う【関数2.0】

はじめに


ネクストモードの南です。

先日Notionで関数2.0(Formula 2.0)がリリースされましたが、サポートする関数やプロパティについても
アップデートが多くありました。

特にリストの処理については新しく登場した内容で、map関数やリスト形式のプロパティに関して
やや理解しにくい部分があると感じましたので、今回の記事で解説をしていきたいと思います。

関数2.0(Formula 2.0)


今回のリリースによって関数の操作性や仕様が大きく変更されました。
これまでの関数機能と比較して、新しくなった関数ではざっくりと以下のようなことができるようになっています。

  • 数式の作成と編集がより簡単にできるようになった
  • より多くの形式のデータ出力が可能になった
  • 入力元としてより多くの種類のデータを扱うことが可能になった

詳細については以下のNotion公式の情報や先に公開した記事をご参考ください。

map関数とリストについて



map関数は今回のアップデートで新しく追加された関数となります。
Notion公式のリファレンスでは以下のように解説されており、リスト形式のデータを数式に渡すことが
できる関数だということが理解できます。

  • map(list, expression):入力リスト内のすべての項目に対し、式を呼び出した結果を入力したリストを返します。
    list:mapに渡すリスト
    expression:リスト内の項目に対する処理(数式)

そもそもですが、今回のアップデートから関数でリストを扱えるようになりました。
リストは[]を使って表します。
[1, 2, 3]であれば、数値の1、2、3という3つの要素を持ったリスト、ということになります。

以下の例1では[1, 2, 3]という数値のリストが入力値になり、リストの各要素についてcurrent + 1
つまり1を加算した結果をリストとして返す、という処理をします。

  • 例1:map([1, 2, 3], current + 1) = [2, 3, 4]

currentは入力したリストの各要素を表す変数になります。
例1で考えると、まずリストの最初の要素である1がcurrentに代入され、current + 11 + 1として処理され、
出力結果のリストに渡されます。
要素の2と3に対しても同じ処理が行われる、というイメージです。

以下の例2のようにmap内の数式でcurrentを繰り返し記述することもできます。
例2はリストの値を二乗した結果を返す、という処理になります。

  • 例2:map([1, 2, 3], current * current) = [1, 4, 9]

また、例3のようにテキストが要素となるリストを扱うこともできます。

  • 例3:map(["赤","青","黄"], current + "色") = ["赤色", "青色", "黄色"]

ちなみに、リストの要素の種別は必ずしも統一する必要はないようです。
以下の例4のように数値とテキストを混在させたリストをmapに渡すと、数値は数値として処理され、
テキストはテキストとして処理されます。

  • 例4:map([1, "2", 3], current + 1) = [2, "21", 4]

リスト形式のプロパティに対する処理


これまでの関数機能の出力はテキスト、数値、チェックボックスのみとなっていましたが、
今回のアップデートでそれらに加えてページ、日付、ユーザー、リストの表示も可能になりました。

また、これらの各プロパティは個別の属性を持つものがあり、数式からアクセスすることができます。
例えば以下のように、ユーザープロパティからユーザー名のテキストデータを取得したり、eメールアドレスを
取得することができます。

  • ユーザープロパティでユーザー名をテキストデータのリストとして取得
    prop("ユーザー").map(current.name())
    リスト形式のプロパティに対する処理1
  • ユーザープロパティでユーザーが持つeメールアドレスのリストを取得
    prop("ユーザー").map(current.email())
    リスト形式のプロパティに対する処理2

Notoin公式の関数2.0のガイド関数のリファレンスを見ると、上記のようなmapを使ったデータ取得方法が
けっこう登場していますが、初見だと理解しにくい構文になっていると思います。
一つ一つ分解しながら確認していきたいと思います。

まず、データベースのプロパティの中には、リスト形式で表示されるものがあります。
ユーザーやリレーションやマルチセレクトなどが該当します。

今回のアップデートから関数でリストを表示することが可能になったので、prop("ユーザー")で以下のように
そのまま表示させることができます。

  • 例:ユーザープロパティをリストで表示
    リスト形式のプロパティに対する処理3

ここで、ユーザーの持つeメールアドレスの情報を取得したいという場合、prop("ユーザー").email()
アクセスしたくなりますが、これだとうまくいきません。
なぜならprop("ユーザー")はリストで、email()は引数にリスト(array)を持つことができない関数だからです。

  • prop("ユーザー").email()
    リスト形式のプロパティに対する処理4

一方、作成者や更新者のプロパティは必ず一意のユーザーとなる(リストではない)ため、そのままemail()関数を
使って情報を取得することができます。

  • prop("作成者").email()
    リスト形式のプロパティに対する処理5

そこでmap()の登場です。
前の項目で解説した通り、map()はリスト形式のデータを要素ごとに処理することができる関数となります。

まずはprop("ユーザー").map(current)として、どのような結果となるか見てみます。
ちなみにこれだとmap()の第一引数のリストがないじゃん、と思うかもしれないですが、これはリストから
ドットで関数を呼び出しているためです。
map(prop("ユーザー"), current)とイコールであるとお考えください。

  • prop("ユーザー").map(current)
    リスト形式のプロパティに対する処理6

map()内の数式がcurrentだけなので、そのまま入力したリストと同じ結果が出力されました。
prop("ユーザー")とした場合と同じ出力結果)

さらにmap()内の数式をcurrent.email()としてみます。
map()内ではリストの要素ごとに処理することができるので、一つ一つのユーザーオブジェクトに対して
email()関数を使って情報を取得している、という動作になります。

  • prop("ユーザー").map(current.email())
    リスト形式のプロパティに対する処理7

これで冒頭に紹介した数式の説明ができました。

他のプロパティでいうと、リレーションプロパティもリスト形式になりますが、同じ考え方で扱うことができます。

  • リレーション先のデータベースのプロパティを表示
    prop("リレーションのプロパティ名").map(current.prop("リレーション先DBのプロパティ名"))
    リスト形式のプロパティに対する処理8

1点注意となりますが、見た目上は1つの要素しかない場合でも、リストとしての処理が必要になります。
複数の要素を持つことができるプロパティなので、1つしか要素がなくてもリストなんですね。

リスト形式のプロパティに対する処理9

 

補足

今回はmap()をメインに取り上げましたが、リストを取り扱うことができる関数は他にもあります。
以下に一部を紹介させていただきます。

  • find(list, condition)条件がtrueを返すリスト内の最初の要素を返します。
    list:関数に渡すリスト
    condition:リスト内の項目に対する条件式
    ・例:find(["a", "b", "c"], current == "b") = "b"
  • filter(list, condition)条件がtrueであるリスト内の値を返します。
    list:関数に渡すリスト
    condition:リスト内の項目に対する条件式
    ・例:filter([1, 2, 3], current > 1) = [2, 3]
  • at(list, index)リスト内の指定されたインデックスの値を返します。
    list:関数に渡すリスト
    index:リストのインデックス
    ・例:at([1, 2, 3], 1) = 2
  • first(list)last(list)リスト内の最初の項目(lastは最後の項目)を返します。
    list:関数に渡すリスト
    ・例:first([1, 2, 3]) = 1

リスト形式のプロパティと組み合わせる場合は以下のような形で使います。

  • ユーザー名に「田中」を含んでいるユーザープロパティを取得
    prop("ユーザー").filter(current.name().contains("田中"))
  • ユーザープロパティのリストの2番目のユーザー名をテキストデータで取得
    prop("ユーザー").at(1).name()
  • ユーザープロパティのリストの最初のeメールアドレスを取得
    prop("ユーザー").first().email()

まとめ


map関数とリスト形式のプロパティを扱う方法について解説をさせていただきました。

関数2.0のリリースによって、関数の操作性やデータの扱いやすさが大きく向上しました。
ただ、仕様が変わった部分も大きく、最初はややこしく感じる部分もあるかもしれません。
特にリストの処理については今までになかったもので、リストやmapへの理解がポイントになると感じましたので、
今回の記事でまとめさせていただきました。
本記事が少しでもお役に立つようなところがあれば幸いです。

Notionについてのお問い合わせ

ネクストモード社は、日本で3社しかないNotion販売代理店です。(2023年01月01日現在)
Notion導入を検討の際は是非下記からお問い合わせ頂けますと幸いです。

新規CTA